1. 程式人生 > >Servlet生命週期詳細過程

Servlet生命週期詳細過程

轉載:https://wenda.so.com/q/1390360764063375?src=300

servlet生命週期

Servlet執行在Servlet容器中,其生命週期由容器來管理。Servlet的生命週期通過javax.servlet.Servlet介面中的init()、service()和destroy()方法來表示。Servlet的生命週期包含了下面4個階段:

  1. 載入和例項化

Servlet容器負責載入和例項化Servlet。當Servlet容器啟動時,或者在容器檢測到需要這個Servlet來響應第一個請求時,建立Servlet例項。當Servlet容器啟動後,它必須要知道所需的Servlet類在什麼位置,Servlet容器可以從本地

檔案系統、遠端檔案系統或者其他的網路服務中通過類載入器載入Servlet類,成功載入後,容器建立Servlet的例項。因為容器是通過Java的反射API來建立Servlet例項,呼叫的是Servlet的預設構造方法(即不帶引數的構造方法),所以我們在編寫Servlet類的時候,不應該提供帶引數的構造方法。

     2.初始化

在Servlet例項化之後,容器將呼叫Servlet的init()方法初始化這個物件。初始化的目的是為了讓Servlet物件在處理客戶端請求前完成一些初始化的工作,如建立資料庫的連線,獲取配置資訊等。對於每一個Servlet例項,init()方法只被呼叫一次。在初始化期間,Servlet例項可以使用容器為它準備的ServletConfig物件從Web

應用程式的配置資訊(在web.xml中配置)中獲取初始化的引數資訊。在初始化期間,如果發生錯誤,Servlet例項可以丟擲ServletException異常或者UnavailableException異常來通知容器。ServletException異常用於指明一般的初始化失敗,例如沒有找到初始化引數;而UnavailableException異常用於通知容器該Servlet例項不可用。例如,資料庫伺服器沒有啟動,資料庫連線無法建立,Servlet就可以丟擲UnavailableException異常向容器指出它暫時或永久不可用。

       3.

請求處理

Servlet容器呼叫Servlet的service()方法對請求進行處理。要注意的是,在service()方法呼叫之前,init()方法必須成功執行。在service()方法中,Servlet例項通過ServletRequest物件得到客戶端的相關資訊和請求資訊,在對請求進行處理後,呼叫ServletResponse物件的方法設定響應資訊。在service()方法執行期間,如果發生錯誤,Servlet例項可以丟擲ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該例項永久不可用,Servlet容器將呼叫例項的destroy()方法,釋放該例項。此後對該例項的任何請求,都將收到容器傳送的HTTP 404(請求的資源不可用)響應。如果UnavailableException異常指示了該例項暫時不可用,那麼在暫時不可用的時間段內,對該例項的任何請求,都將收到容器傳送的HTTP 503(伺服器暫時忙,不能處理請求)響應。

    4.服務終止

當容器檢測到一個Servlet例項應該從服務中被移除的時候,容器就會呼叫例項的destroy()方法,以便讓該例項可以釋放它所使用的資源,儲存資料到持久儲存裝置中。當需要釋放記憶體或者容器關閉時,容器就會呼叫Servlet例項的destroy()方法。在destroy()方法呼叫之後,容器會釋放這個Servlet例項,該例項隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會建立一個新的Servlet例項。
在整個Servlet的生命週期過程中,建立Servlet例項、呼叫例項的init()和destroy()方法都只進行一次,當初始化完成後,Servlet容器會將該例項儲存在記憶體中,通過呼叫它的service()方法,為接收到的請求服務。