Servlet生命週期

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生命週期基本就是這樣子了。嘿嘿

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