1. 程式人生 > >簡述servlet的生命週期(面試過)

簡述servlet的生命週期(面試過)

簡述servlet的生命週期

在Servlet產生到消亡的過程中,有三個生命週期函式,通過javax.servlet.Servlet介面中初始化方法init(),處理客戶請求的方法service(),終止方法destroy()來表示。

注意:建立Servlet例項、呼叫例項的init()和destroy()方法都只進行一次,當初始化完成後,Servlet容器會將該例項儲存在記憶體中

servlet的生命週期包含以下4個階段:

(1)載入和例項化

Servlet容器負責載入和例項化Servlet。當Servlet容器啟動或客戶端傳送一個請求時,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處於能響應請求的就緒狀態。在service()方法中,

Servlet例項通過ServletRequest物件得到客戶端的相關資訊和請求資訊,在對請求進行處理後(根據不同的請求 轉調不同的doXxx()方法),呼叫ServletResponse物件

的方法設定響應資訊。在service()方法執行期間,如果發生錯誤,Servlet例項可以丟擲ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實

例永久不可用,Servlet容器將呼叫例項的destroy()方法,釋放該例項。此後對該例項的任何請求,都將收到容器傳送的HTTP 404(請求的資源不可用)響應

。如果UnavailableException異常指示了該例項暫時不可用,那麼在暫時不可用的時間段內,對該例項的任何請求,都將收到容器傳送的HTTP 503(伺服器暫

時忙,不能處理請求)響應。

注意:為了提高效率,Servlet規範要求一個Servlet例項必須能夠同時服務於多個客戶端請求,即service()方法執行在多執行緒的環境下,開發者必須保證該方法的執行緒安全性。

(4)銷燬

當Servlet容器關閉時,Servlet例項也隨時銷燬。其間,Servlet容器會呼叫Servlet 的destroy()方法去判斷該Servlet是否應當被釋放(或回收資源)。

Web伺服器在與客戶端互動時Servlet的工作過程是:

  1. 在客戶端對web伺服器發出請求。
  2. web伺服器接收到請求後將其傳送給Servlet。
  3. Servlet容器為此產生一個例項物件並呼叫ServletAPI中相應的方法來對客戶端HTTP請求進行處理,然後將處理的響應結果返回給web伺服器。
  4. web伺服器將從Servlet例項物件中收到的響應結構傳送回客戶端。