1. 程式人生 > >Servlet編程專題1之Servlet生命周期

Servlet編程專題1之Servlet生命周期

servlet初步認識 getservletinfo()方法 web容器中的兩個map servlet特征 servlet生命周期 servlet生命周期具體方法執行流程

1、Servlet初步認識:

- 通常來說,Servlet是宏觀上Servlet規範中的一個具體的接口,Servlet規範中包含一套接口。而Servlet接口僅僅是其中之一。

- 從微觀地角度上講,Servlet是Servlet接口實現類的一個實例對象,是運行在服務器上的一段Java小程序,即Server Applet,也就是Servlet這個單詞的由來。Servlet的主要功能是根據客戶端提交的請求,調用服務器端相關java代碼,完成對請求的處理和運算。


2、Servlet生命周期:

a、所謂Servlet生命周期是指:Servlet對象的創建、Servlet對象的初始化、Servlet對象服務的執行以及最後Servlet對象被銷毀的整個過程。

技術分享

- Servlet的整個生命周期過程的執行,均由Web服務器負責管理,即Servlet從創建到服務到銷毀的整個過程中方法的調用,都是由Web服務器負責調用執行,程序員無法控制其執行流程。

- 但是程序員可以獲取到Servlet的這些生命周期時間點(實例化、初始化、服務以及銷毀時間點),並可以指定讓Servlet做一些具體業務相關的事情。


b、Servlet生命周期具體方法執行流程:

技術分享


- 說明:

a、當請求發送到Web容器後,Web容器會解析請求URL,並從中分離出Servlet對應的URI。

b、根據分離出來的URI,通過web.xml中配置的URI和Servlet的映射關系,找到要執行的Servlet,即找到用於處理該請求的Servlet。

- web.xml中配置的URI和Servlet的映射關系表示如下:

技術分享


c、若該Servlet不存在,則調用該Servlet的無參數構造器,init()方法,實例化該Servlet,然後執行service()方法。

d、若該Servlet已經被創建,則直接調用service方法。

e、當web容器被關閉,或者該應用被關閉,則調用執行destroy()方法,銷毀該Servlet實例。


3、Servlet特征:

a、Servlet是單例多線程的。

b、一個Servlet實例只會執行一次無參數構造器與init()方法,並且是在第一次訪問時執行。

c、用戶每提交一次對當前Servlet的請求,就會執行一次service()方法。

d、一個Servlet實例只會執行一次destroy()方法,在應用停止時執行。

e、由於Servlet是單例多線程的,所以為了保證其線程安全性,一般情況下是不為Servlet類定義可修改的成員變量。因為每個線程均可修改這個成員變量,會出現線程安全問題。

f、默認情況下,Servlet在Web容器啟動時是不會被實例化的。


3、在web.xml文件中註冊Servlet時,如果希望Servlet在Web容器啟動時創建Servlet需要在<servlet>標簽中設置<load-on-startup>標簽。

技術分享


4、Web容器中的兩個Map:

- 當Servlet實例被創建好後放在了哪裏?web.xml中URI和Servlet的映射關系反映到內存中是以什麽樣的形式存在的呢?

- 當Servlet實例被創建好之後,會將該Servlet實例的引用放入到一個Map集合中。該Map集合的key為URI,而value則為Servlet實例的引用,即Map<String,Servlet>。當Web容器從用戶請求中分離出URI後,會首先到這個Map中查找是否存在其所對應的value。若存在,則直接調用其service()方法。若不存在,則需要創建該Servlet實例。

- 若請求的Servlet實例不存在,Web容器又是根據什麽創建這個Servlet實例的呢?在Web容器的內存中,還存在一個Map集合。該Map集合的key為URI,而value則為web.xml中配置的與之對應的Servlet的全限定性類名,即Map<String, String>。

- 當Web容器從用戶請求中分離出URI後,到第一個Map中查找沒有找到其所對應的Servlet實例,則會馬上查找這第二個Map,從中找到其所對應的類名,再根據反射機制,創建這個Servlet實例。然後再將這個創建好的Servlet的引用放入到第一個Map中。


5、關於getServletInfo()方法:

- Servlet接口中的方法getServletInfo(),是由程序自己定義的有關當前Servlet的一些基本信息,不屬於Servlet生命周期中的方法。對程序的運行沒有任何影響和作用,僅僅是返回一些讓他人閱讀的信息而已。

-

javax.servlet.Servlet接口中getServletInfo()的方法描述說明:

技術分享


6、附:需要註意,同一個URI只能夠映射一個Servlet。

技術分享


本文出自 “12392717” 博客,請務必保留此出處http://12402717.blog.51cto.com/12392717/1972458

Servlet編程專題1之Servlet生命周期