容器與Servlet生命週期

1)容器大致功能有如下:

一、通信支持
無需自己建立監聽端口、流、Socket等,容器知道與Web服務器的協議,所以不必擔心自己的代碼如何與服務器進行通信,交給容器就好
二、生命週期管理
容器可以自動加載類、實例化和初始化servlet、調用Servlet方法,並是得Servlet被回收
三、多線程支持
容器會自動給接收到的每一個Servlet創建一個線程並管理這些線程
四、聲明方式實現安全
利用容器可以使用XML來配置修改安全性
五、JSP支持
容器負責把JSP翻譯成java。JSP在容器中被編譯和運行

2)容器如何處理請求:

一、容器生成兩個請求響應對象:HttpServletRequest和HttpServletResponse。HttpServletRequest和HttpServletResponse不是單獨存在還要繼承自ServletRequest和ServletResponse的接口原因是萬一使用別的協議可以繼承ServletRequest和ServletResponse。

二、容器根據根據請求中的URL找到正確的servlet併爲請求和響應對象創建或者分配一個線程。**注
意每個客戶請求都在一個單獨的線程中進行處理,即容器運行多個線程來處理對一個servlet的多個
請求(容器通過調度線程從線程池分配工作線程執行請求)。**此時多個servlet線程會去爭奪一個
servlet資源,會有同步問題產生。

三、線程調用servlet的service(request,response)方法,service(request,response)會根據類型調用
doGet(request,response)或者doPost(request,response) 方法。此外,線程有自己的方法棧,
service(request,response)方法總是在線程自己的棧中調用。

四、doGet(request,response)生成動態頁面,把頁面送入HttpServletResponse對象。

五、結束線程(撤銷或者放回線程池),容器將HttpServletResponse轉換爲HTTP響應傳給客戶端,然後
刪除請求響應對象。

3)servlet生命週期:
一、尋找類
容器啓動時。它會自動尋找已部署的Web應用,並搜索servlet文件。

二、加載類
客戶端發送請求到服務器容器啓動時加載servlet類。servlet在沒有完全初始化之前絕對不能運行service()方法。

三、執行servlet的無參構造函數,生成一個servlet對象

四、執行init(ServletConfig)方法進行初始化(init()被init(ServletConfig)調用)
注意init()在一個servlet的生命週期裏**只執行一次!**而且必須在調用service()方法前執行完畢。init()內含初始化代碼,如得到一個數據庫連接等。那麼可不可以將init()的代碼全部放在構造函數中呢?**答案是否定的。**因爲在調用構造函數的時候servlet並沒有被建立,但是一些初始化參數可能需要servlet對象。這時就會導致初始化失敗。所以不能再servlet的構造函數中放任何東西!

public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
}

可以看出init()是被init(ServletConfig)調用。容器爲servlet對象建立一個ServletConfig對象,然後調用init()。兩者分開的原因是因爲以前有人複寫init(ServletConfig)時會忘記調用super.init(ServletConfig),這就導致Override的方法中沒有ServletConfig對象。分開後只需要Override init()方法即可,無需關係ServletConfig的獲取。
五、執行service()方法
servlet開始處理客戶請求(doGet()、doPost() 等)。servlet的一生主要從這裏度過

六、執行destroy()方法清理資源
注意destroy()方法不是回收servlet對象,而是在servlet對象被回收之前清理資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章