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

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

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

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

1.Servlet生命周期詳解

Servlet的生命周期包括即Servlet從創(chuàng)建到銷毀的這一個(gè)過程,可以將Servlet的生命周期分為初始化階段、服務(wù)階段、銷毀階段這三個(gè)階段。下面通過一張圖來描述Servlet的生命周期,如圖1-1所示:
圖1-1 Servlet生命周期
通過對(duì)圖1-1Servlet生命周期的理解,下面對(duì)Servlet的生命周期的三個(gè)階段進(jìn)行詳細(xì)介紹:
  • 初始化階段
服務(wù)器會(huì)在客戶端第一次訪問Servlet,或服務(wù)器啟動(dòng)的時(shí)候?yàn)樵揝ervlet創(chuàng)建實(shí)例。要想在服務(wù)器啟動(dòng)的時(shí)候就為Servlet創(chuàng)建實(shí)例,需要在web.xml中進(jìn)行配置。當(dāng)服務(wù)器為Servlet創(chuàng)建實(shí)例后,會(huì)在第一時(shí)間調(diào)用init()方法,完成Servlet的初始化操作。注意這個(gè)init()方法在Servlet的一生中,只會(huì)被服務(wù)器調(diào)用一次。
  • 服務(wù)階段
當(dāng)服務(wù)器接收到請(qǐng)求時(shí),會(huì)去調(diào)用Servlet的service()方法來處理請(qǐng)求,而且每次請(qǐng)求的時(shí)候,服務(wù)器都會(huì)調(diào)用service()方法,并且創(chuàng)建新的ServletRequest和ServletResponse對(duì)象,所以該方法在Servlet的一生中會(huì)被調(diào)用多次。
  • 銷毀階段
當(dāng)服務(wù)器關(guān)閉或者當(dāng)前web應(yīng)用被移出服務(wù)器時(shí),Servlet會(huì)被銷毀,在銷毀之前,服務(wù)器會(huì)調(diào)用destroy()方法,可以把Servlet的“臨終遺言“放在該方法中,例如把對(duì)某些資源的釋放等代碼放在destroy()方法中。

2.驗(yàn)證Servlet生命周期

通過上面對(duì)Servlet生命周期的學(xué)習(xí),下面我們通過一個(gè)案例更深入地理解Servlet的生命周期,詳情請(qǐng)參考Servlet生命周期案例詳解,點(diǎn)擊此處 下載源代碼。
(1)創(chuàng)建一個(gè)web應(yīng)用,取名為Example09,在該應(yīng)用中創(chuàng)建一個(gè)類ServletTwo,實(shí)現(xiàn)Servlet接口,創(chuàng)建步驟請(qǐng)見Servlet接口及應(yīng)用。ServletTwo的具體代碼如例1-1所示:
例 1-1 ServletTwo.java
   (2)在瀏覽器端訪問一個(gè)資源,我們是通過http://localhost:8080/Example/index.jsp來訪問,現(xiàn)在要訪問Servlet就要為該Servlet指定訪問路徑。下面通過一張圖來了解瀏覽器是如何訪問Servlet。如圖1-2所示:
圖1-1 瀏覽器訪問Servlet
如圖1-1所示,當(dāng)瀏覽器給服務(wù)器發(fā)送請(qǐng)求訪問Servlet,服務(wù)器要做很多工作,下面我們來分析,服務(wù)器如何根據(jù)請(qǐng)求路徑找到對(duì)應(yīng)的Servlet。
對(duì)于一個(gè)Servlet類,我們要在web.xml中進(jìn)行配置,配置信息如例1-2所示:
例1-2  web.xml

在上面的配置信息中,元素<servlet >用于注冊(cè)Servlet,它的兩個(gè)子元素<servlet-name>和<servlet-class>分別是用來指定Servlet名稱及完整類名。元素<servlet-mapping>用于映射Servlet對(duì)外訪問的虛擬路徑。
例1-2中對(duì)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中,啟動(dòng)Tomcat服務(wù)器,在瀏覽器端地址欄上輸入http://localhost:8080/Example09/ServletTwo,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
(4)由圖1-2可知,瀏覽器訪問成功,下面我們來看控制臺(tái)的打印結(jié)果,如圖1-3所示:

圖1-3控制臺(tái)打印結(jié)果
(5)暫時(shí)不清理控制臺(tái)打印的信息,繼續(xù)在瀏覽器端訪問該Servlet,控制臺(tái)打印結(jié)果如圖1-4所示:

圖1-4 控制臺(tái)打印結(jié)果
由此可見,init()方法只是在瀏覽器第一次訪問Servlet的時(shí)候才被調(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)閉之后,控制臺(tái)打印信息如圖1-6所示:

圖1-6 控制臺(tái)打印結(jié)果
由圖1-6可知,destroy()方法在服務(wù)器關(guān)閉的時(shí)候執(zhí)行了,這里需要注意的是關(guān)閉服務(wù)器的方式,建議大家采用圖1-5的關(guān)閉方式,否則destory()方法可能會(huì)不執(zhí)行。
 由以上案例的學(xué)習(xí)可知:
  • Servlet只會(huì)被創(chuàng)建一次,所以是單例的,一個(gè)Servlet類只有一個(gè)Servlet對(duì)象,當(dāng)然一個(gè)web應(yīng)用中可以存在多個(gè)Servlet類;
  • Servlet實(shí)例默認(rèn)是在第一次訪問該Servlet時(shí)被服務(wù)器創(chuàng)建;
  • 服務(wù)器正常關(guān)閉,Servlet實(shí)例被銷毀;
  • Servlet是線程不安全的,所以效率比較高。

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