Servlet生命週期簡單的概括分為四步:class加載實例化--->初始化--->服務--->銷毀。
Servlet生命週期是由javax.servlet.Servlet接口定義,所有的Servlet都必須實現這個接口。在Servlet接口中定義了5個方法,其中3個方法代表了Servlet的生命周期:
1. init方法:負責初始化Servlet對象。
2. service方法:負責回應客戶的請求。
3. destroy方法:當Servlet對象退出生命週期時,負責釋放佔用的資源。
1、加載(Load)和實例化(Instantiated)
Servlet容器負責加載和實例化Servlet。因為容器是通過Java的反射API來創建Servlet實例,調用的是Servlet的默認構造方法(即不帶參數的構造方法),所以我們在編寫Servlet類的時候,不應該提供帶參數的構造方法。 Servlet容器加載Servlet,有以下幾種情況:(1)、Servlet容器啟動時自動裝載Servlet,讀取配置文件web.XML文件中的屬性,如果為1,則容器啟動時加載Servlet.(2)、在Servlet容器啟動後,客戶首次向Servlet發送請求。 Servlet容器會判斷內存中是否存在指定的Servlet對象,如果沒有則加載這個Servlet。(3)、Servlet類文件被更新後,重新加載Servlet.
2、初始化階段:init(ServletConfig conf)(補充)
在Servlet實例化之後,Servlet容器將調用Servlet的init()方法初始化這個對象。初始化的目的是為了讓Servlet對像在處理客戶端請求前完成一些初始化的工作,如建立數據庫的連接,獲取配置信息等。對於每一個Servlet實例,init()方法只被調用一次。在初始化期間,Servlet實例可以使用Servlet容器為它準備的ServletConfig對像從Web應用程序的配置信息(在web.xml中配置)中獲取初始化的參數信息。在初始化期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常來通知容器。 ServletException異常用於指明一般的初始化失敗,例如沒有找到初始化參數;而UnavailableException異常用於通知容器該Servlet實例不可用。例如,數據庫服務器沒有啟動,數據庫連接無法建立,Servlet就可以拋出UnavailableException異常向容器指出它暫時或永久不可用。
3、回應請求服務階段(service)
Servlet 被初始化以後,就處於能回應請求的就緒狀態。在service()方法中,Servlet實例通過ServletRequest對象得到客戶端的相關信息和請求信息,在對請求進行處理後,調用ServletResponse對象的方法設置回應訊息。當客戶端有一個請求時,Servlet容器將ServletRequest 和ServletResponse對像都轉發給Servlet,這兩個對像以參數的形式傳給service方法。這個方法由javax.servlet.Servlet定義並由具體的Servlet 實現。注意:客戶端每次請求Servlet都會運行該方法,該方法判斷訪問類型,然後根據HttpServletRequest的getMethod()方法返回結果判斷是執行doGet還是doPost,doPut。而且無論請求多少次Servlet,最多只有一個Servlet實例。多個客戶端並發請求Servlet時,服務器會啟動多個線程分別執行該Servlet的service()方法。在service()方法執行期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實例永久不可用,Servlet容器將調用實例的destroy()方法,釋放該實例。此後對該實例的任何請求,都將收到容器發送的HTTP 404(請求的資源不可用)回應。如果UnavailableException異常指示了該實例暫時不可用,那麼在暫時不可用的時間段內,對該實例的任何請求,都將收到容器發送的HTTP 503(服務器暫時忙,不能處理請求)回應。
4、終止服務階段(destroy)
當需要釋放內存或者容器關閉時,容器就會調用Servlet實例的destroy()方法。在destroy()方法調用之後,容器會釋放這個Servlet實例,該實例隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會創建一個新的Servlet實例。
小結:
在整個Servlet的生命週期過程中,創建Servlet實例、調用實例的init()和destroy()方法都只進行一次,當初始化完成後,Servlet容器會將該實例保存在內存中,通過調用它的service()方法,為接收到的請求服務。 Servlet有時會用到一些需要初始化與銷毀的資源,因此可以把初始化資源的代碼放入init()方法內,把銷毀資源的代碼放入destroy方法內,而不需要每次處理請求都要初始化與銷毀資源。
補充=====================================================================
when Servlet init() load
http://guoliangqi.iteye.com/blog/667258=======================================================================
Servlet/JSP處理HTTP請求的過程是:
- 使用者對Web Server發出HTTP請求
- Server收到請求後將其轉給container,並由container分析請求內容後建立相對應的物件
- container根據請求裡的URL分配給正確的Servlet 並為這個請求建立或配制執行緒,以及將請求物件與回應物件交予該執行緒處理
- container呼叫Servlet的sevice() method 根據請求的類別,service()會再呼叫doGet()或doPost() method
- 接著由所呼叫的method建置動態網頁,並將它放入回應物件裡
- 執行緒結束,container轉換回應物件為HTTP回應傳回Client端 接著刪除請求與回應物件
沒有留言:
張貼留言