Servlet 生命週期可以描述爲servlet的生命跨度,從載入到銷燬。
在解釋servelt生命週期前,先來討論一些你將在本文中看到的一些術語,這將幫你更快速地理解它。
Web Server: 它也被成爲Http Server,處理從客戶端發來的Http 請求,用Http Response 響應此請求。
Web Container: 也稱爲Servlet容器,Servlet引擎。它與Servlet交互,是Web Server的一部分。它是Web Server的主要組件,管理servlet的生命週期。
Servlet的生命週期包含五步:
1) 載入Servlet
2) 創建Servlet實例
3) 調用init()方法
4) 調用service()方法獨立響應每個客戶的請求
5) 調用destory()方法
然我們回到我們的主要話題。這裏是servlet生命週期的五個步驟。
步驟1:載入servlet
當web server(例如tomcat)啓動時,servlet容器部署載入所有的servlet
步驟2:創建servlet實例
一旦所有的servlet被載入,這個servlet容器創建每一個servlet的實例。servlet容器對每個servlet只創建一次,並且所有的這個servlet的請求都被同一個servlet實例處理。
步驟3:調用init()方法
一旦所有的servlet類被實例化,每個servlet的init()方法都會被調用。這個方法初始化這個servlet,有某些初始化參數你可以在部署描述文件(web.xml)中指定。例如,如果一個servlet有個大於0的值,那麼它的init()方法在容易啓動時會被立刻調用。
你可以在web.xml中指定該元素,像這樣:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.beginnersbook.MyServletDemo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
現在這個相應的servlet類com.beginnersbook.MyServletDemo的init()方法在web容器啓動時立刻被調用。
步驟4:調用service()方法
每次web server接受到servlet的請求時,它就產生一個新的線程來調用service()方法(所以我們經常說的單例多線程就是這個意思)。如果這個servlet是GenericServlet那麼這個請求被他自己的service()服務,如果這個servlet是HttpServlet,那麼service()方法接受該請求並基於請求類型分發它到對應的成立方法上。
例如,如果它是一個Get請求,service()方法將分發此請求到doGet()方法上,通過調用doGet()方法,並帶上請求參數。類似地,像Post,Head,Put等請求都會被分發到相應的doPost(),doPut(),doHead()方法上,通過service()方法。
(image)[https://beginnersbook.com/wp-content/uploads/2013/05/Servlet_Life_Cycle.jpg]
注意:不像init()方法和destory()方法只被調用一次,service()方法可在生命週期中調用任意多次,只要servlet沒有被銷燬,對於每個客戶端請求service()都會被調用。
步驟五:地用destory()方法
當servelt容器關閉(經常發生在我們關閉web server時),它卸載所有的servlet並調用每個初始化的servlet的destory()方法。