Servlet生命分爲四個階段:
1.加載
這個階段由Servlet容器完成。例如tomcat,jetty等。當容器加載一個Servlet後不會立刻實例化它。通常是在用戶第一次請求是完成實例化操作。
2.實例化和初始化
在Servlet實例化之後它會調用它的init()方法,在這個方法裏可以寫上所需的初始化參數,並且該方法只會被調用一次。
*需要注意的是容器創建Servlet實例是通過java反射機制創建的,調用的是默認構造函數,所以編寫Servlet類時通常不應提供帶參數的構造方法。
3.請求處理
所有的請求都會走service()方法,無論是get請求還是post請求。但是通常情況下你不必關心service方法,你只需要重寫HttpServlet類的doGet方法或者doPost方法處理對應的請求。在HttpServlet類中它實現了判斷用戶請求類型並交給對應的方法進一步處理。
4.服務終止
當容器檢測到Servlet實例被銷燬時,就會調用destroy()方法。
圖 1 Servlet生命週期示意圖
*注意:上圖中的第2和第3步都是處理用戶請求,其實可算做一步。每個request請求都會調用service方法,service方法再解析報頭,將請求交給doGet或doPost方法處理。
多的就不說了,上代碼
public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; public TestServlet() { super(); System.out.println("構造方法運行"); } public void init(ServletConfig config) throws ServletException { System.out.println("初始化方法運行"); } public void destroy() { System.out.println("Servlet銷燬"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("doGet方法調用"); response.getWriter().write("Success!"); } @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("Service方法調用"); super.service(request, response); } }
配置好web.xml
<servlet> <description></description> <display-name>TestServlet</display-name> <servlet-name>TestServlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
啓動tomcat,在瀏覽器中輸入http:localhost:8080/testweb/test
控制檯輸出爲
================================
構造方法運行
初始化方法運行
Service方法調用
doGet方法調用
================================
我的eclipse是設置的熱部署,當修改Testservlet時,保存就會重新部署,就會看到destory方法被調用了。
Servlet可以設置在web容器啓動是就加載並初始化,只要在web.xml里加上<
load-on-startup
>1</
load-on-startup
>
這個配置,當值爲0或者大於0時,表示容器在應用啓動時就加載這個servlet,當是一個負數時或者沒有指定時,則只是容器在該servlet被選擇時才加載。還有就是配置的正數值越小優先級越高。
<servlet> <description></description> <display-name>TestServlet</display-name> <servlet-name>TestServlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
servlet生命週期基本就是這樣子了。嘿嘿