天天看點

Servlet-生命周期初始化服務銷毀總結

Servlet的生命周期主要有三個階段:初始化——服務——銷毀

初始化

初始化:主要包括 加載、配置、建立執行個體 三部分。

加載:在用戶端首次請求該Servlet時,或着随着web伺服器啟動而加載;

配置:為每個Servlet設定資訊産生一個ServletConfig對象;

建立:調用Servlet接口的init()方法,并将産生的ServletConfig對象當作參數傳入。在Servlet的生命周期中,僅執行一次init()方法。它在web伺服器裝入Servlet時執行,負責初始化Servlet對象。同一個類型的Servlet對象在web伺服器中以單例的形式存在。

當Servlet被執行個體化後,Servlet容器将調用每個Servlet的init()方法來執行個體化每個執行個體,執行完init()方法之後,Servlet處于“已初始化”狀态。是以說,一旦Servlet被執行個體化,那麼必将調用init方法。

如果初始化失敗,執行init()方法抛出ServletException異常,Servlet對象将會被垃圾回收器回收

當web.xml中不配置load-on-startup屬性,或者配置該屬性且值為負數時,servlet在有請求的時候才會初始化。

當load-on-startup屬性值大于等于0的時候,servlet會在啟動的時候就初始化。

備注:1. load-on-startup屬性值隻能為整數。

   2. load-on-startup屬性值大于等于0時,數值越小,優先級越高。

服務

Servlet 被初始化以後,就處于能響應請求的就緒狀态。每個對Servlet 的請求由一個Servlet Request 對象代表。Servlet 給用戶端的響應由一個Servlet Response對象代表。對于到達客戶機的請求,伺服器建立特定于請求的一個“請求”對象和一個“響應”對象。調用service方法,這個方法可以調用其他方法來處理請求。

Service方法會在伺服器被通路時調用,Servlet對象的生命周期中service方法可能被多次調用,由于web-server啟動後,伺服器中公開的部分資源将處于網絡中,當網絡中的不同主機(用戶端)并發通路伺服器中的同一資源,伺服器将開設多個線程處理不同的請求,多線程同時處理同一對象時,有可能出現資料并發通路的錯誤。

Servlet容器調用Servlet的service()方法對請求進行處理。要注意的是,在service()方法調用之前,init()方法必須成功執行。在service()方法中,Servlet執行個體通過ServletRequest對象得到用戶端的相關資訊和請求資訊,在對請求進行處理後,調用ServletResponse對象的方法設定響應資訊。

銷毀

僅執行一次,在伺服器端停止且解除安裝Servlet時執行該方法。當Servlet對象退出生命周期時,負責釋放占用的資 源。一個Servlet在運作service()方法時可能會産生其他的線程,是以需要确認在調用destroy()方法時,這些線程已經終止或完成。

當Web伺服器認為Servlet執行個體沒有存在的必要了,比如應用重新裝載,或伺服器關閉,以及Servlet很長時間都沒有被通路過。伺服器可以從記憶體中銷毀(也叫解除安裝)該執行個體。Web伺服器必須保證在解除安裝Servlet執行個體之前調用該執行個體的destroy()方法,以便回收Servlet申請的資源或進行其它的重要的處理。

當伺服器不再需要Servlet執行個體或重新裝入時,會調用destroy方法,使用這個方法,Servlet可以釋放掉所有在init方法申請的資源。一個Servlet執行個體一旦終止,就不允許再次被調用,隻能等待被解除安裝。

Servlet一旦終止,Servlet執行個體即可被垃圾回收,處于“解除安裝”狀态,如果Servlet容器被關閉,Servlet也會被解除安裝,一個Servlet執行個體隻能初始化一次,但可以建立多個相同的Servlet執行個體。如相同的Servlet可以在根據不同的配置參數連接配接不同的資料庫時建立多個執行個體。

當容器檢測到一個Servlet執行個體應該從服務中被移除的時候,容器就會調用執行個體的destroy()方法,以便讓該執行個體可以釋放它所使用的資源,儲存資料到持久儲存設備中。當需要釋放記憶體或者容器關閉時,容器就會調用Servlet執行個體的destroy()方法。在destroy()方法調用之後,容器會釋放這個Servlet執行個體,該執行個體随後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會建立一個新的Servlet執行個體。

  

總結

在整個Servlet的生命周期過程中,建立Servlet執行個體、調用執行個體的init()和destroy()方法都隻進行一次,當初始化完成後,Servlet容器會将該執行個體儲存在記憶體中,通過調用它的service()方法,為接收到的請求服務。