標籤:des style blog http color 使用
Servlet的生命週期可以定義為從其被建立到其被銷毀的整個流程,下面是Servlet生命的常規線路:
- 容器調用init()方法進行Servlet的初始化
- Servlet調用service()方法去處理用戶端的請求
- 容器調用destroy()方法將Servlet銷毀
- 最後,Servlet被JVM的GC線程當作垃圾處理掉
init()方法:
init()方法只會在建立Servlet時被調用一次,不管有多少使用者請求。通常情況下,Servlet在容器第一次接收到使用者請求時被建立,但也可以通過load-on-startup指定Servlet在容器啟動時將其載入。
當使用者調用Servlet時,容器中的每一個Servlet都是以單例模式對外提供服務的,只是會對每一個使用者指派一個線程。init()方法內部通常會載入一些在Servlet的生命週期中會用到的資料。
init()方法的定義如下所示:
public void init() throws ServletException { // Initialization code...}
service()方法:
service()方法是Servlet對外提供服務的主方法。Servlet容器會調用該方法處理來自用戶端的請求以及將格式化的返回結果返回給用戶端。
每當Servlet容器接收到來自用戶端的請求時,它會分配一個新的線程並且調用service()方法,然後由service()方法去檢測用戶端的請求類型,是GET還是POST還是DELETE還是PUT等等,然後在service()方法的內部會依據請求的類型相應的調用doGet,doPost,doDelete,doPut方法。
service()方法的聲明如下:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{}
由上可知,針對service()方法,開發人員不需要做任何調整,但是卻需要依據請求類型重寫被其調用的doGet或doPost方法。doGet和doPost是使用最頻繁的兩個方法,下面是它們的定義:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet code}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet code}
通過URL的普通請求以及未指定METHOD的HTML表單會產生GET模式的請求,因此該類請求會被doGet方法處理;而指定了METHOD的HTML表單會產生POST模式的請求,此時會被doPost方法處理。
destroy()方法:
destroy()方法只會在Servlet的生命到達盡頭時被調用一次,該方法會給Servlet去做一些最後掃尾的機會,比如關閉資料庫連接,停止後台線程,寫cookie列表等。當destroy方法被調用之後,Servlet對象會被標記來“垃圾”,由GC處理掉。destroy()方法的定義如下:
public void destroy() { // Finalization code... }
架構圖:
描述了Servlet的生命週期圖:
- 首先,面向web伺服器的HTTP請求會被委託給Servlet容器
- 其次,servlet容器在調用service()方法之前會先載入servlet
- 最後,servlet容器會以多線程的方式處理多使用者的請求,每個線程都會執行單例的servlet的service()方法。
/******************************外星人喬丹拍板時間******************************/
Servlet的生命,始於被建立時的init()方法,止於完成使命之後的destroy()方法,
生命只會開始一次,即Init() only once,生命也只會終止一次,即destroy() only once,
在生命的浪潮中,這個偉人會提供多次服務,即service() a lot of times