教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之Servlet的生命周期

更新時間:2016年06月30日18時27分 來源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

1.Servlet生命周期詳解

Servlet的生命周期包括即Servlet從創(chuàng)建到銷毀的這一個過程,可以將Servlet的生命周期分為初始化階段、服務(wù)階段、銷毀階段這三個階段。下面通過一張圖來描述Servlet的生命周期,如圖1-1所示:
圖1-1 Servlet生命周期
通過對圖1-1Servlet生命周期的理解,下面對Servlet的生命周期的三個階段進(jìn)行詳細(xì)介紹:
  • 初始化階段
服務(wù)器會在客戶端第一次訪問Servlet,或服務(wù)器啟動的時候?yàn)樵揝ervlet創(chuàng)建實(shí)例。要想在服務(wù)器啟動的時候就為Servlet創(chuàng)建實(shí)例,需要在web.xml中進(jìn)行配置。當(dāng)服務(wù)器為Servlet創(chuàng)建實(shí)例后,會在第一時間調(diào)用init()方法,完成Servlet的初始化操作。注意這個init()方法在Servlet的一生中,只會被服務(wù)器調(diào)用一次。
  • 服務(wù)階段
當(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.驗(yàn)證Servlet生命周期

通過上面對Servlet生命周期的學(xué)習(xí),下面我們通過一個案例更深入地理解Servlet的生命周期,詳情請參考Servlet生命周期案例詳解,點(diǎn)擊此處 下載源代碼。
(1)創(chuàng)建一個web應(yīng)用,取名為Example09,在該應(yīng)用中創(chuàng)建一個類ServletTwo,實(shí)現(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的配置要注意以下兩點(diǎn):
  • <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】,然后點(diǎn)擊右鍵,在選項(xiàng)中選擇【Stop Server】選項(xiàng),關(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實(shí)例默認(rèn)是在第一次訪問該Servlet時被服務(wù)器創(chuàng)建;
  • 服務(wù)器正常關(guān)閉,Servlet實(shí)例被銷毀;
  • Servlet是線程不安全的,所以效率比較高。

本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://oisangadgets.com/javaee
0 分享到:
和我們在線交談!