簡述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物件
ServletException異常或者UnavailableException異常
。如果UnavailableException異常指示了該實
例永久不可用,Servlet容器將呼叫例項的destroy()方法,釋放該例項。此後對該例項的任何請求,都將收到容器傳送的HTTP 404(請求的資源不可用)響應
。如果UnavailableException異常指示了該例項暫時不可用,那麼在暫時不可用的時間段內,對該例項的任何請求,都將收到容器傳送的HTTP 503(伺服器暫
時忙,不能處理請求)響應。
注意:為了提高效率,Servlet規範要求一個Servlet例項必須能夠同時服務於多個客戶端請求,即service()方法執行在多執行緒的環境下,開發者必須保證該方法的執行緒安全性。
(4)銷燬
當Servlet容器關閉時,Servlet例項也隨時銷燬。其間,Servlet容器會呼叫Servlet 的destroy()方法去判斷該Servlet是否應當被釋放(或回收資源)。
Web伺服器在與客戶端互動時Servlet的工作過程是:
- 在客戶端對web伺服器發出請求。
- web伺服器接收到請求後將其傳送給Servlet。
- Servlet容器為此產生一個例項物件並呼叫ServletAPI中相應的方法來對客戶端HTTP請求進行處理,然後將處理的響應結果返回給web伺服器。
- web伺服器將從Servlet例項物件中收到的響應結構傳送回客戶端。