官术网_书友最值得收藏!

5.2 Servlet的生命周期

Servlet的生命周期包括加載、實例化、初始化、處理客戶端請求和移除,該生命周期由javax.servlet.Servlet接口的init、service和destroy方法來實現。一個Servlet的生命周期由部署Servlet的容器來控制,其從產生到結束的流程如圖5.7所示

圖5.7 Servlet程序的生命周期

本書中的容器是Tomcat,當一個請求映射到一個Servlet時,該容器執行下列步驟:

01 如果一個Servlet的實例并不存在,Web容器將加載Servlet類、創建一個Servlet類的實例、調用init方法初始化Servlet實例。

02 調用service方法,傳遞一個請求和響應對象。

03 如果該容器要移除這個Servlet,可調用Servlet的destroy方法來結束該Servlet。

5.2.1 加載Servlet

容器負責加載和實例化一個Servlet。實例化和加載可以發生在引擎啟動時,也可以推遲到容器需要該Servlet為客戶請求服務時。

容器必須先定位Servlet類,在必要的情況下,容器使用通常的Java類加載工具加載該Servlet,可以從本機文件系統加載,也可以從遠程文件系統甚至其他的網絡服務加載。容器加載Servlet類以后,它會實例化該類的一個實例。需要注意的是,可能會實例化多個實例,例如,一個Servlet類因為有不同的初始化參數而有多個定義,或者Servlet實現SingleThreadModel而導致容器為它生成一個實例池。

5.2.2 初始化

Servlet加載并實例化后,容器必須在處理客戶端請求前初始化它。初始化的過程主要是讀取配置信息、數據庫連接池及其他僅需要執行一次的任務。通過調用它的init方法并給它傳遞唯一的一個ServletConfig對象(每個Servlet定義一個)完成這個過程。給它傳遞的這個配置對象允許Servlet訪問容器的配置信息中的名稱-值對(name-value)初始化參數,這個配置對象同時給Servlet提供訪問實現了ServletContext接口的具體對象的方法,該對象描述了Servlet的運行環境。

5.2.3 處理請求

在Servlet被初始化后,容器就可以使用它去處理請求了。每一個請求對象都是ServletRequest類型,同時Servlet使用ServletResponse返回該請求的處理結果,這些對象被作為service方法的參數傳遞給Servlet。在HTTP請求的情況下,容器必須提供代表請求和響應的HttpServletRequest及HttpServletResponse的具體實現。需要注意的是,容器可能會創建一個Servlet實例并將它放入等待服務的狀態下,但是這個實例在它的生命周期中可能根本沒有處理過任何請求。

容器可能同時將多個客戶端請求發送給一個實例的service方法,這也就意味著開發者必須確保編寫的Servlet可以處理并發問題。如果開發者想禁止這種默認的行為發生,那么他可以編寫Servlet實現SingleThreadModel這個類,這樣就可以保證一次只會有一個線程在執行service方法并且一次性執行完。容器可以通過將請求排隊或者維護一個Servlet實例池滿足這一點。如果Servlet是分布式應用的一部分,那么容器可能在該應用分布的每個JVM中都維護一個實例池。如果開發者使用synchronized關鍵字定義service方法(或者是doGet和doPost方法),容器將排隊處理請求,這是由底層的Java運行時系統要求的。但最好不要同步service、doGet和doPost這樣的服務方法。

5.2.4 服務結束

若沒有要求容器將一個加載的Servlet保存多長時間,那么一個Servlet實例可能只在容器中存活了幾毫秒,當然也可能是更長的任意時間。當容器決定將Servlet移除時(原因可能是保存內存資源不夠或者自己被關閉),那么它必須允許Servlet釋放它正在使用的任何資源并保存任何永久狀態(這個過程通過調用destroy方法實現)。容器在調用destroy方法前,必須允許那些正在service方法中執行的線程執行完或者在服務器定義的時間段內執行(這個時間段在容器調用destroy之前)。一旦destroy方法被調用,容器就不會再向該實例發送任何請求了。如果容器需要再使用該Servlet,那么它必須創建新的實例。destroy方法完成后,容器必須釋放Servlet實例以便它能夠被回收。

主站蜘蛛池模板: 湘潭市| 合水县| 安顺市| 盐边县| 治县。| 威海市| 山西省| 白河县| 资源县| 金湖县| 元阳县| 浮梁县| 赫章县| 马龙县| 紫云| 石城县| 岑巩县| 桃园县| 杭州市| 来宾市| 噶尔县| 崇礼县| 政和县| 东兰县| 永平县| 潮安县| 叶城县| 新巴尔虎左旗| 剑川县| 苍梧县| 鱼台县| 确山县| 许昌市| 湘乡市| 杭州市| 甘德县| 山丹县| 台中县| 墨竹工卡县| 南充市| 晋州市|