1.Servlet生命周期詳解
Servlet的生命周期包括即Servlet從創(chuàng)建到銷毀的這一個過程,可以將Servlet的生命周期分為初始化階段、服務(wù)階段、銷毀階段這三個階段。下面通過一張圖來描述Servlet的生命周期,如圖1-1所示:
圖1-1 Servlet生命周期
通過對圖1-1Servlet生命周期的理解,下面對Servlet的生命周期的三個階段進(jìn)行詳細(xì)介紹:
服務(wù)器會在客戶端第一次訪問Servlet,或服務(wù)器啟動的時候為該Servlet創(chuàng)建實例。要想在服務(wù)器啟動的時候就為Servlet創(chuàng)建實例,需要在web.xml中進(jìn)行配置。當(dāng)服務(wù)器為Servlet創(chuàng)建實例后,會在第一時間調(diào)用init()方法,完成Servlet的初始化操作。注意這個init()方法在Servlet的一生中,只會被服務(wù)器調(diào)用一次。
當(dāng)服務(wù)器接收到請求時,會去調(diào)用Servlet的service()方法來處理請求,而且每次請求的時候,服務(wù)器都會調(diào)用service()方法,并且創(chuàng)建新的ServletRequest和ServletResponse對象,所以該方法在Servlet的一生中會被調(diào)用多次。
當(dāng)服務(wù)器關(guān)閉或者當(dāng)前web應(yīng)用被移出服務(wù)器時,Servlet會被銷毀,在銷毀之前,服務(wù)器會調(diào)用destroy()方法,可以把Servlet的“臨終遺言“放在該方法中,例如把對某些資源的釋放等代碼放在destroy()方法中。
2.驗證Servlet生命周期
通過上面對Servlet生命周期的學(xué)習(xí),下面我們通過一個案例更深入地理解Servlet的生命周期,詳情請參考
Servlet生命周期案例詳解,點擊此處
下載源代碼。
(1)創(chuàng)建一個web應(yīng)用,取名為Example09,在該應(yīng)用中創(chuàng)建一個類ServletTwo,實現(xiàn)Servlet接口,創(chuàng)建步驟請見
Servlet接口及應(yīng)用。ServletTwo的具體代碼如例1-1所示:
例 1-1 ServletTwo.java
(2)在瀏覽器端訪問一個資源,我們是通過http://localhost:8080/Example/index.jsp來訪問,現(xiàn)在要訪問Servlet就要為該Servlet指定訪問路徑。下面通過一張圖來了解瀏覽器是如何訪問Servlet。如圖1-2所示:
圖1-1 瀏覽器訪問Servlet
如圖1-1所示,當(dāng)瀏覽器給服務(wù)器發(fā)送請求訪問Servlet,服務(wù)器要做很多工作,下面我們來分析,服務(wù)器如何根據(jù)請求路徑找到對應(yīng)的Servlet。
對于一個Servlet類,我們要在web.xml中進(jìn)行配置,配置信息如例1-2所示:
例1-2 web.xml
在上面的配置信息中,元素<servlet >用于注冊Servlet,它的兩個子元素<servlet-name>和<servlet-class>分別是用來指定Servlet名稱及完整類名。元素<servlet-mapping>用于映射Servlet對外訪問的虛擬路徑。
例1-2中對Servlet的配置要注意以下兩點:
- <servlet-mapping >標(biāo)簽中的<url-pattern>標(biāo)簽的內(nèi)容是Servlet的訪問路徑,一定要以“/”開頭。
- <servlet>標(biāo)簽中的<servlet-name>標(biāo)簽的內(nèi)容要與<servlet-mapping>標(biāo)簽中的<servlet-name>標(biāo)簽的內(nèi)容保持一致。
(3)將Example09應(yīng)用發(fā)布到Tomcat中,啟動Tomcat服務(wù)器,在瀏覽器端地址欄上輸入http://localhost:8080/Example09/ServletTwo,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
(4)由圖1-2可知,瀏覽器訪問成功,下面我們來看控制臺的打印結(jié)果,如圖1-3所示:
圖1-3控制臺打印結(jié)果
(5)暫時不清理控制臺打印的信息,繼續(xù)在瀏覽器端訪問該Servlet,控制臺打印結(jié)果如圖1-4所示:
圖1-4 控制臺打印結(jié)果
由此可見,init()方法只是在瀏覽器第一次訪問Servlet的時候才被調(diào)用,而service()方法是瀏覽器每訪問一次就被調(diào)用一次。
(6)在視圖中選擇【Servers】,選擇【Tomcat 7.x】,然后點擊右鍵,在選項中選擇【Stop Server】選項,關(guān)閉服務(wù)器,如圖1-5所示:
圖1-5 關(guān)閉服務(wù)器
(7)圖1-5服務(wù)器關(guān)閉之后,控制臺打印信息如圖1-6所示:
圖1-6 控制臺打印結(jié)果
由圖1-6可知,destroy()方法在服務(wù)器關(guān)閉的時候執(zhí)行了,這里需要注意的是關(guān)閉服務(wù)器的方式,建議大家采用圖1-5的關(guān)閉方式,否則destory()方法可能會不執(zhí)行。
由以上案例的學(xué)習(xí)可知:
- Servlet只會被創(chuàng)建一次,所以是單例的,一個Servlet類只有一個Servlet對象,當(dāng)然一個web應(yīng)用中可以存在多個Servlet類;
- Servlet實例默認(rèn)是在第一次訪問該Servlet時被服務(wù)器創(chuàng)建;
- 服務(wù)器正常關(guān)閉,Servlet實例被銷毀;
- Servlet是線程不安全的,所以效率比較高。
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://8y3kgpwe.cn/javaee