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