cihm / javaGuidelines

javaGuidelines
0 stars 1 forks source link

Servlet lifecycle #6

Open cihm opened 9 years ago

cihm commented 9 years ago

http://www.tutorialspoint.com/servlets/servlets-life-cycle.htm

cihm commented 9 years ago

when Servlet init() load

http://blog.csdn.net/yangfeitarena/article/details/3758572

http://guoliangqi.iteye.com/blog/667258

cihm commented 9 years ago

Servlet生命週期簡單的概括分為四步:class加載實例化--->初始化--->服務--->銷毀。

Servlet生命週期是由javax.servlet.Servlet接口定義,所有的Servlet都必須實現這個接口。在Servlet接口中定義了5個方法,其中3個方法代表了Servlet的生命周期:

  1. init方法:負責初始化Servlet對象。

  2. service方法:負責回應客戶的請求。

  3. destroy方法:當Servlet對象退出生命週期時,負責釋放佔用的資源。

  servlet_lifecycle

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方法內,而不需要每次處理請求都要初始化與銷毀資源。