servlet 學(xué)習(xí)筆記之二
——關(guān)于 Servlet 生命周期
寫(xiě)這篇總結(jié)的時(shí)候,已經(jīng)辭職有好幾天了。去北京還沒(méi)有買(mǎi)到票, 4 月前,北京、上海、拉薩等地方的火車(chē)票都沒(méi)有了,還好我不急著走。
下面總結(jié)了 servlet 的生命周期。
Servlet 運(yùn)行在 Servlet 容器中,其生命周期由容器來(lái)管理。 Servlet 的生命周期通過(guò) Servlet 接口中 init ()、 service ()、 destroy ()方法來(lái)表示。
Servlet 的生命周期包含了下面 4 個(gè)階段。
(1) 加載和實(shí)例化
Servlet 容器負(fù)責(zé)加載和實(shí)例化 Servlet 。當(dāng) Servlet 容器啟動(dòng)時(shí),或者在容器檢查到需要這個(gè) Servlet 來(lái)響應(yīng)一個(gè)請(qǐng)求時(shí),創(chuàng)建 Servlet 實(shí)例。當(dāng) Servlet 容器啟動(dòng)后,它必須要知道所需的 Servlet 類(lèi)在什么位置, Servlet 容器可以從本地文件系統(tǒng)、遠(yuǎn)程文件系統(tǒng)或者其他網(wǎng)絡(luò)服務(wù)器中通過(guò)類(lèi)加載器加載 Servlet 類(lèi),成功加載后,容器創(chuàng)建 Servlet 實(shí)例。因?yàn)槿萜魇峭ㄟ^(guò) Java 的反射 API 來(lái)創(chuàng)建 Servlet 實(shí)例,調(diào)用的是 Servlet 的默認(rèn)構(gòu)造函數(shù),也就是那個(gè)不帶參數(shù)的構(gòu)造函數(shù),所以我們?cè)诰帉?xiě) Servlet 類(lèi)的時(shí)候,不應(yīng)該提供帶參數(shù)的構(gòu)造函數(shù)。——這也就是為什么 Servlet 類(lèi)可以不寫(xiě)構(gòu)造函數(shù)的原因。
(2) 初始化
在 Servlet 實(shí)例化之后,容器必須調(diào)用 Servlet 的 init ()方法初始化這個(gè)對(duì)象。初始化的目的是為了讓 Servlet 對(duì)象在處理客戶(hù)請(qǐng)求前完成一些初始化工作,如建立數(shù)據(jù)庫(kù)連接,獲取配置信息等。對(duì)于每一個(gè) Servlet 實(shí)例, init ()方法只能被調(diào)用一次。在初始化期間, Servlet 實(shí)例可以使用容器為它準(zhǔn)備的 ServletConfit 對(duì)象從 web 應(yīng)用程序的配置信息(在 web.xml 中配置)中獲取初始化的參數(shù)信息。在初始化期間,如果發(fā)生錯(cuò)誤, Servlet 實(shí)例可以?huà)伋霎惓?lái)通知容器。
(3) 請(qǐng)求處理
Servlet 容器調(diào)用 Servlet 的 service ()方法對(duì)請(qǐng)求進(jìn)行處理。要注意的是,在 service ()方法調(diào)用之前, init ()方法必須成功執(zhí)行。在 service ()方法中, servlet 實(shí)例通過(guò) ServletRequest 對(duì)象得到客戶(hù)端的相關(guān)信息和請(qǐng)求信息,在對(duì)請(qǐng)求進(jìn)行處理后,調(diào)用 servletResponse 對(duì)象的方法設(shè)置響應(yīng)信息。
(4) 服務(wù)終止
當(dāng)容器檢測(cè)在一個(gè) Servlet 實(shí)例應(yīng)該從服務(wù)中被移除的時(shí)候,容器就會(huì)調(diào)用實(shí)例的 destroy ()方法,以便讓該實(shí)例可以釋放它所使用的資源,保存數(shù)據(jù)到持久存儲(chǔ)設(shè)備中。當(dāng)需要釋放內(nèi)存或者容器關(guān)閉時(shí),容器就會(huì)調(diào)用 Servlet 實(shí)例的 destroy ()方法。在調(diào)用 destroy ()方法后,容器會(huì)釋放這個(gè) Servlet 實(shí)例,該實(shí)例隨后會(huì)被 java 的垃圾收集器回收。
在整個(gè) Servlet 的生命周期過(guò)程中,創(chuàng)建 Servlet 實(shí)例、調(diào)用實(shí)例的 init ()和 destroy ()方法都只進(jìn)行一次,當(dāng)初始化完成后, Servlet 容器會(huì)將該實(shí)例保存在內(nèi)存中,通過(guò)調(diào)用它的 service ()方法,為接收到的請(qǐng)求服務(wù)。