Posted on 2008-10-20 07:29
夢與橋 閱讀(556)
評論(1) 編輯 收藏 所屬分類:
jsp程序設計
1、一個Servlet生命周期(Tomcat處理請求中)
從Tomcat處理用戶請求,我們可以清晰的看到容器Servlet的生命周期管理過程:
(1)、客戶發出請求—>Web 服務器轉發到Web容器Tomcat;
(2)、Tomcat主線程對轉發來用戶的請求做出響應創建兩個對象:HttpServletRequest和HttpServletResponse;
(3)、從請求中的URL中找到正確Servlet,Tomcat為其創建或者分配一個線程,同時把2創建的兩個對象傳遞給該線程;
(4)、Tomcat調用Servlet的servic()方法,根據請求參數的不同調用doGet()或者doPost()方法;
(5)、假設是HTTP GET請求,doGet()方法生成靜態頁面,并組合到響應對象里;
(6)、Servlet線程結束,Tomcat將響應對象轉換為HTTP響應發回給客戶,同時刪除請求和響應對象。
從該過程中,我們可以理解Servlet的生命周期:Servlet類加載(對應3步);Servlet實例化(對應3步);調用init方法(對應3步);調用service()方法(對應4、5步);調用destroy()方法(對應6步)。
2、Servlet中doGet(),doPost(),service()函數的關系
(1),三者之間的關系:doGet()和doPost()是由函數service()調用才執行的。也就是說,當從HttpServlet類繼承時可以繞過doGet()和doPost()直接override service()函數,也可以override doGet()和doPost()
(2),service() 該函數使用起來不像duPost()與duGet()那樣有約束,但幾乎失去了HttpServlet的意義。很類似于GeneratServlet
(3),doGet() 超鏈接時起作用
(4),doPost() form提交時起作用
如果兩者均有,則可用service() 或者
protected void doGet(HttpServletRequest rst, HttpServletResponse resp) throws ServletException , java.io.IOException {
doPost(req,resp);
}
3、為什么程序中覆蓋doGet()和doPost()等方法而不覆蓋service()方法?
答:當服務器接收到servlet的請求時,服務器會產生一個新的線程調用service()方法。service()方法檢查HTTP請求類型,然后相應地調用doGet()、doPost()、doPut()、doDelete()等方法。如果servlet處理POST請示或GET請求方式相同,也可以嘗試覆蓋service()方法。但這樣做并不理想,更好的做法是在doPost()方法中調用doGet()方法,或者反過來。代碼多了一些,相比較直接覆蓋service()方法,有如下優點:
(1)確保以后可以在子類中添加對其他請求服務的支持,如doPut()等。
(2)可以通過實現getLastModified()方法來增加對修改日期的支持。如果調用了doGet()方法,標準service()方法會用getLastModified()方法設置header的最后修改日期,然后對GET請求作出回應(包括已修改過的header、If-Modified-Since header)。