Servlet生命週期是指servlet從創建到毀滅的整個過程,可分為3個階段:1、初始化階段,呼叫init()方法實作Servlet的初始化工作;2、運行階段(處理請求),容器會為指定請求建立代表HTTP請求的ServletRequest對象和代表HTTP回應的ServletResponse對象,然後將它們作為參數傳遞給Servlet的service()方法;3、銷毀階段。
本教學操作環境:windows7系統、java8版、DELL G3電腦。
Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的伺服器端程序,具有獨立於平台和協定的特性, 是運行在Web 伺服器或應用伺服器上的程式。
它是作為來自Web 瀏覽器或其他HTTP 用戶端的請求和HTTP 伺服器上的資料庫或應用程式之間的中間層。主要功能在於收集來自網頁表單的使用者輸入,互動式地瀏覽和產生數據,還可以產生動態網頁內容。
#Servlet生命週期可定義為從創建直到毀滅的整個過程。
三個步驟即:初始化------>處理請求------>銷毀
建立Servlet物件後---------->初始化(呼叫 init () 方法)--------->處理/回應客戶端的請求(呼叫 service() 方法)--------->銷毀(呼叫 destroy() 方法,最後由JVM 的垃圾回收器進行垃圾回收)
1)初始化階段
當客戶端向Servlet 容器發出HTTP 請求要求存取Servlet 時,Servlet 容器首先會解析請求,檢查記憶體中是否已經有了該Servlet 對象,如果有,則直接使用該Servlet 對象,如果沒有,則建立Servlet 實例對象,然後透過呼叫init() 方法實作Servlet 的初始化工作。需要注意的是,在 Servlet 的整個生命週期內,它的 init() 方法只能被呼叫一次。
2)運行階段(處理請求)
這是Servlet 生命週期中最重要的階段,在這個階段中,Servlet 容器會為此請求建立代表HTTP 請求的ServletRequest 物件和代表HTTP 回應的ServletResponse 對象,然後將它們作為參數傳遞給Servlet 的service() 方法。
service() 方法從 ServletRequest 物件中取得客戶請求資訊並處理該請求,透過 ServletResponse 物件產生回應結果。
在Servlet 的整個生命週期內,對於Servlet 的每個存取請求,Servlet 容器都會呼叫一次Servlet 的service() 方法,並且建立新的ServletRequest 和ServletResponse 對象,也就是說,service()方法在Servlet 的整個生命週期中會被呼叫多次。
3)銷毀階段
當伺服器關閉或 Web 應用程式被移除出容器時,Servlet 隨著 Web 應用程式的關閉而銷毀。在銷毀 Servlet 之前,Servlet 容器會呼叫 Servlet 的 destroy() 方法,以便讓 Servlet 物件釋放它所佔用的資源。在 Servlet 的整個生命週期中,destroy() 方法也只能被呼叫一次。
要注意的是,Servlet 物件一旦建立就會駐留在記憶體中等待客戶端的訪問,直到伺服器關閉或 Web 應用程式被移除出容器時,Servlet 物件才會銷毀。
#建立Servlet對象,透過伺服器反射機制建立Servlet對象,第一次請求時才會建立。 (預設)
呼叫Servlet物件的init()方法,初始化Servlet的訊息,init()方法只會在創建後被呼叫一次(初始化階段)
(1)init 方法被設計成只呼叫一次。它在第一次創建 Servlet 時被調用,在後續每次用戶請求時不再調用。因此,它是用於一次性初始化,創建於使用者第一次呼叫該 Servlet 的 URL 時,也可以指定 Servlet 在伺服器第一次啟動時被載入。
(2)當使用者呼叫一個 Servlet 時,就會建立一個 Servlet 實例,每個使用者請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。
(3)init() 方法簡單地建立或載入一些數據,這些數據將被用於 Servlet 的整個生命週期。
init 方法的定義如下:
public void init() throws ServletException { // 初始化代码... }
回應請求,呼叫service()或是doGet(),doPost()方法來處理請求,這些方法是執行的在多執行緒狀態下的。 (回應客戶請求階段)
(1)service() 方法是執行實際任務的主要方法,處理來自客戶端(瀏覽器)的請求,並把格式化的回應寫回給客戶端。
(2)每次伺服器接收到一個 Servlet 請求時,伺服器會產生一個新的執行緒並呼叫服務。
(3)Servlet接收和回應客戶請求的過程,首先客戶發送一個請求,Servlet是呼叫service()方法對請求進行回應的,透過原始碼可見,service()方法中對請求的方式進行了匹配,選擇呼叫doGet,doPost等這些方法,然後再進入對應的方法中呼叫邏輯層的方法,實現對客戶的回應。由於在Servlet介面和GenericServlet中是沒doGet,doPost等等這些方法的,HttpServlet中定義了這些方法,所以,我們每次定義一個Servlet的時候,都必須實作doGet或 doPost等這些方法。
(4)service() 方法檢查HTTP 請求類型(GET、POST、PUT、DELETE 等),並在適當的時候呼叫doGet、doPost、doPut,doDelete等方法進行處理。
service方法的定義如下:
public void service(ServletRequest request,ServletResponse response) throws ServletException, IOException{ }
由於service() 方法由容器調用,service 方法在適當的時候會調用doGet、doPost、doPut、doDelete 等方法。所以,我們不用對 service() 方法做任何處理,只需要根據客戶端的請求類型來重寫 doGet() 或 doPost() 即可。
用於處理請求,方法是運行的在多執行緒狀態下的。 (回應客戶請求階段)
doGet() 是服務請求中最常用的方法,用於處理請求,當URL的請求類型為GET請求 ,或者是一個未指定請求類型HTML表單,那麼該請求將由doGet() 方法處理。
doGet方法的定義如下:
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
#用於處理請求,方法是運行的在多執行緒狀態下的。 (回應客戶請求階段)
doPost() 是服務請求中最常用的方法,用於處理請求,當請求來自一個特別指定了請求類型為POST的HTML 表單,那麼該請求將由doPost() 方法處理。
doPost方法的定義如下:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet 代码 }
#在長時間沒有被呼叫或是伺服器關閉時,會呼叫destroy()方法來銷毀Servlet物件。 (終止階段)
(1)destroy() 方法只會被呼叫一次,在 Servlet 生命週期結束時被呼叫。
(2)destroy() 方法可以讓Servlet 關閉資料庫連線、停止後台執行緒、把 Cookie 清單或點擊計數器寫入到磁碟,並執行其他類似的清理活動。
(3)在呼叫 destroy() 方法之後,servlet 物件被標記為垃圾回收。
destroy 方法定義如下:
public void destroy() { // 终止化代码... }
理解了上面的內容再看週期圖就會容易很多。
更多程式相關知識,請造訪:程式設計教學! !
以上是servlet生命週期分成幾個階段的詳細內容。更多資訊請關注PHP中文網其他相關文章!