Servlet體系結(jié)構(gòu)是建立在 Java 多線程機(jī)制上的松却,它的生命周期由 Web 容器負(fù)責(zé)辕近。當(dāng)客戶端第一次請(qǐng)求某個(gè) Servlet 時(shí)介褥,Servlet 容器將會(huì)根據(jù) web.xml 的配置文件實(shí)例化這個(gè) Servlet 類吮廉。當(dāng)有新的客戶端請(qǐng)求該 Servlet 時(shí)逾礁,一般不會(huì)再實(shí)例化該 Servlet 類说铃。當(dāng)有多個(gè)請(qǐng)求時(shí),Servlet 容器會(huì)起多個(gè)線程來訪問同一個(gè) Servlet 實(shí)例的 service() 方法嘹履,如果該 Servlet 實(shí)例中有共享的實(shí)例變量腻扇,需要注意多線程安全問題。
Servlet 生命周期定義了 Servlet 從創(chuàng)建到毀滅的整個(gè)過程砾嫉,總共分為四個(gè)步驟幼苛。
- 調(diào)用
init()
方法初始化 - 調(diào)用
service()
方法來處理客戶端的請(qǐng)求 - 調(diào)用
destroy()
方法釋放資源,標(biāo)記自身為可回收 - 被垃圾回收器回收
init() 方法
init 方法被設(shè)計(jì)成只調(diào)用一次焕刮。它在第一次創(chuàng)建 Servlet 時(shí)被調(diào)用舶沿,用于 Servlet的初始化,初始化的數(shù)據(jù)配并,可以在整個(gè)生命周期中使用暑椰。
service() 方法
service() 方法是執(zhí)行實(shí)際任務(wù)的主要方法。 Servlet 容器(Tomcat荐绝、Jetty等)調(diào)用 service() 方法來處理來自客戶端(瀏覽器)的請(qǐng)求一汽,并把相應(yīng)結(jié)果返回給客戶端。
每次 Servlet 容器接收到一個(gè) Http 請(qǐng)求低滩, Servlet 容器會(huì)產(chǎn)生一個(gè)新的線程并調(diào)用 Servlet實(shí)例的 service 方法召夹。 service 方法會(huì)檢查 HTTP 請(qǐng)求類型(GET、POST恕沫、PUT监憎、DELETE 等),并在適當(dāng)?shù)臅r(shí)候調(diào)用 doGet婶溯、doPost鲸阔、doPut偷霉、doDelete 方法。所以褐筛,在編碼請(qǐng)求處理邏輯的時(shí)候类少,我們只需要關(guān)注 doGet()、或doPost()的具體實(shí)現(xiàn)即可渔扎。
destroy() 方法
destroy() 方法也只會(huì)被調(diào)用一次硫狞,在 Servlet 生命周期結(jié)束時(shí)調(diào)用。destroy() 方法主要用來清掃“戰(zhàn)場(chǎng)”晃痴,執(zhí)行如關(guān)閉數(shù)據(jù)庫(kù)連接残吩、釋放資源等行為。
調(diào)用 destroy 方法之后倘核,servlet 對(duì)象被標(biāo)記為垃圾回收泣侮,等待 JVM 的垃圾回收器進(jìn)行處理。
參考鏈接: