servlet規(guī)范定義的Servlet生命周期_第1頁
servlet規(guī)范定義的Servlet生命周期_第2頁
servlet規(guī)范定義的Servlet生命周期_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、servlet有良好的生存期的定義,包括怎么加載、實(shí)例化、初始化、處理客戶端請(qǐng)求及怎么被移除。這個(gè)生存期由javax.servlet.Servlet接口的init,service和destroy方法表達(dá)。1、加載和實(shí)例化容器負(fù)責(zé)加載和實(shí)例化一個(gè)servlet。實(shí)例化和加載能發(fā)生在引擎啟動(dòng)的時(shí)候,也能推遲到容器需要該servlet為客戶請(qǐng)求服務(wù)的時(shí)候。首先容器必須先定位servlet類,在必要的情況下,容器使用通常的Java類加載工具加載該servlet,可能是從本機(jī)文件系統(tǒng),也能是從遠(yuǎn)程文件系統(tǒng)甚至其他的網(wǎng)絡(luò)服務(wù)。容器加載servlet類以后,他會(huì)實(shí)例化該類的一個(gè)實(shí)例。需要注意的是可能會(huì)實(shí)例化

2、多個(gè)實(shí)例,例如一個(gè)servlet類因?yàn)橛胁煌某跏紖?shù)而有多個(gè)定義,或servlet實(shí)現(xiàn)SingleThreadModel而導(dǎo)致容器為之生成一個(gè)實(shí)例池。2、初始化servlet加載并實(shí)例化后,容器必須在他能夠處理客戶端請(qǐng)求前初始化他。初始化的過程主要是讀取永久的設(shè)置信息,昂貴資源(例如JDBC連接)及其他僅僅需要執(zhí)行一次的任務(wù)。通過調(diào)用他的init方法并給他傳遞唯一的一個(gè)(每個(gè)servlet定義一個(gè))ServletConfig對(duì)象完成這個(gè)過程。給他傳遞的這個(gè)設(shè)置對(duì)象允許servlet訪問容器的設(shè)置信息中的名稱一值對(duì)(name-value)初始化參數(shù)。這個(gè)設(shè)置對(duì)象同時(shí)給servlet提供了訪問實(shí)

3、現(xiàn)了ServletContext接口的具體對(duì)象的方法,該對(duì)象描述了servlet的運(yùn)行環(huán)境。2.1初始化的錯(cuò)誤處理在初始化期間,servlet實(shí)例可能通過拋出UnavailableException或ServletException異常表明他不能進(jìn)行有效服務(wù)。如果一個(gè)servlet拋出一個(gè)這樣的異常,他將不會(huì)被置入有效服務(wù)并且應(yīng)該被容器即時(shí)釋放。在此情況下destroy方法不會(huì)被調(diào)用因?yàn)槌跏蓟瘺]有成功完成。在失敗的實(shí)例被釋放后,容器可能在所有時(shí)候?qū)嵗粋€(gè)新的實(shí)例,對(duì)這個(gè)規(guī)則的唯一例外是如果失敗的servlet拋出的異常是UnavailableException并且該異常指出了最小的無效時(shí)間,

4、那么容器就會(huì)至少等待該時(shí)間指明的時(shí)限才會(huì)重新試圖創(chuàng)建一個(gè)新的實(shí)例。2.2、工具因素當(dāng)工具(注:根據(jù)筆者的理解,這個(gè)工具可能是應(yīng)用服務(wù)器的某些檢查工具,通常是驗(yàn)證應(yīng)用的合法性和完整性)加載和內(nèi)?。╥ntrospect)個(gè)web應(yīng)用時(shí),他可能加載和內(nèi)省該應(yīng)用中的類,這個(gè)行為將觸發(fā)那些類的靜態(tài)初始方法被執(zhí)行,因此,研發(fā)者不能假定只要當(dāng)servlet的init方法被調(diào)用后他才處于活動(dòng)容器運(yùn)行狀態(tài)(activecontainerruntime)0作為一個(gè)例子,這意味著servlet不能在他的靜態(tài)(類)初始化方法被調(diào)用時(shí)試圖建立數(shù)據(jù)庫連接或連接EJB容器。3、處理請(qǐng)求在servlet被適當(dāng)?shù)爻跏蓟?,容?/p>

5、就能使用他去處理請(qǐng)求了。每一個(gè)請(qǐng)求由ServletRequest類型的對(duì)象代表,而servlet使用ServletResponse回應(yīng)該請(qǐng)求。這些對(duì)象被作為service方法的參數(shù)傳遞給servlet。在HTTP請(qǐng)求的情況下,容器必須提供代表請(qǐng)求和回應(yīng)的HttpServletRequest和HttpServletResponse的具體實(shí)現(xiàn)。需要注意的是容器可能會(huì)創(chuàng)建一個(gè)servlet實(shí)例并將之放入等待服務(wù)的狀態(tài),不過這個(gè)實(shí)例在他的生存期中可能根本沒有處理過所有請(qǐng)求。3.1、多線程問題容器可能同時(shí)將多個(gè)客戶端的請(qǐng)求發(fā)送給一個(gè)實(shí)例的service方法,這也就意味著研發(fā)者必須確保編寫的servlet

6、能處理并發(fā)問題。如果研發(fā)者想防止這種缺省的行為,那么他能讓他編寫的servlet實(shí)現(xiàn)SingleThreadModel。實(shí)現(xiàn)這個(gè)類能確保一次只會(huì)有一個(gè)線程在執(zhí)行service方法并且一次性執(zhí)行完。容器能通過將請(qǐng)求排隊(duì)或維護(hù)一個(gè)servlet實(shí)例池滿足這一點(diǎn)。如果servlet是分布式應(yīng)用的一部分,那么,那么容器可能在該應(yīng)用分布的每個(gè)JVM中都維護(hù)一個(gè)實(shí)例池。如果研發(fā)者使用synchronized關(guān)鍵字定義service方法(或是doGet和doPost),容器將排隊(duì)處理請(qǐng)求,這是由底層的java運(yùn)行時(shí)系統(tǒng)需求的。我們強(qiáng)烈推薦研發(fā)者不要同步service方法或HTTPServlet的諸如doGe

7、t和doPost這樣的服務(wù)方法。3.2、處理請(qǐng)求中的異常servlet在對(duì)請(qǐng)求進(jìn)行服務(wù)的時(shí)候有可能拋出ServletException或UnavailableException異常。ServletException表明在處理請(qǐng)求的過程中發(fā)生了錯(cuò)誤容器應(yīng)該使用合適的方法清除該請(qǐng)求。UnavailableException表明servlet不能對(duì)請(qǐng)求進(jìn)行處理,可能是暫時(shí)的,也可能是永久的。如果UnavailableException指明是永久性的,那么容器必須將servlet從服務(wù)中移除,調(diào)用他的destroy方法并釋放他的實(shí)例。如果指明是暫時(shí)的,那么容器能選擇在異常信息里面指明的這個(gè)暫時(shí)無法服務(wù)

8、的時(shí)間段里面不向他發(fā)送所有請(qǐng)求。在這個(gè)時(shí)間段里面被被拒絕的請(qǐng)求必須使用SERVICE_UNAVAILABLE(503)返回狀態(tài)進(jìn)行響應(yīng)并且應(yīng)該攜帶稍后重試(Retry-After)的響應(yīng)頭表明不能服務(wù)只是暫時(shí)的。容器也能選擇不對(duì)暫時(shí)性和永久性的不可用進(jìn)行區(qū)分而全部當(dāng)作永久性的并移除拋出異常的servleto3.3線程安全研發(fā)者應(yīng)該注意容器實(shí)現(xiàn)的請(qǐng)求和響應(yīng)對(duì)象(注:即容器實(shí)現(xiàn)的HttpServletRequest和HttpServletResponese)沒有被確保是線程安全的,這就意味著他們只能在請(qǐng)求處理線程的范圍內(nèi)被使用,這些對(duì)象不能被其他執(zhí)行線程所引用,因?yàn)橐玫男袨槭遣淮_定的。4、服務(wù)結(jié)束容器沒有被需求將一個(gè)加載的servlet保存多長時(shí)間,因此一個(gè)servlet實(shí)例可能只在容器中存活了幾毫秒,當(dāng)然也可能是其他更長的任意時(shí)間(不過肯定會(huì)短于容器的生存期)當(dāng)容器決定將之移除時(shí)(原因可能是保存內(nèi)存資源或自己被關(guān)閉),那么他必須允許servlet釋放他正在使用的所有資源并保存所有永久狀態(tài)(這個(gè)過程通過調(diào)用destroy方法達(dá)到)。容器在能夠調(diào)用destroy方法前,他必須允許那些正在service方法中執(zhí)行的線程執(zhí)行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論