1. 程式人生 > 實用技巧 >Servlet的生命週期

Servlet的生命週期

Servlet的生命週期

當Servlet被裝載到容器後,生命週期開始。首先呼叫init()方法進行初始化,初始化後,呼叫service()方法,根據請求的不同調用不同的doXXX()方法處理客戶請求,並將處理結果封裝到HttpServletResponse中返給客戶端。當Servlet物件從容器中移除時呼叫其destroy( )方法,這就是Servlet 執行的整個過程。
1、客戶端請求該Servlet。
2、載入Servlet類到記憶體。
3、例項化並呼叫init( )方法初始化該Servlet。
4、service()【根據請求方法不同調用doGet()或者doPost(),此外還有doHead()、doPut()、doTrace()、doDelete()、doOptions()、 destroy() 】。
5、載入和例項化Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet。

Servlet物件的執行流程圖


1、網站中所有的Servlet介面實現類的例項物件,只能由Http伺服器負責建立。開發人員不能手動建立Servlet介面實現類的例項物件。
2、在預設的情況下, Http伺服器接收到對於當前Servlet介面實現類第一次請求時自動建立這個Servlet介面實現類的例項物件。
3、在手動配置情況下,要求Http伺服器在啟動時自動建立某個Servlet介面實現類的例項物件

<servlet>
        <load-on-startup>整數</load-on-startup>
</servlet>

4、在Http伺服器執行期間,一個Servlet介面實現類只能被創建出一個例項物件。
5、在Http伺服器關閉時刻,自動將網站中所有的Servlet物件進行銷燬。

關於load-on-startup

1、load-on-startup 元素標記容器是否應該在web應用程式啟動的時候就載入這個Servlet ,(例項化並呼叫其init()方法)。
2、它的值必須是一個整數,表示Servlet 被載入的先後順序。
3、如果該元素的值為負數或者沒有設定,則容器會當Servlet被請求時再載入。
4、如果值為正整數或者0時,表示容器在應用啟動時就載入並初始化這個Servlet ,值越小,Servlet 的優先順序越高,就越先被載入。值相同時,容器就會自己選擇順序來載入。

典型的Servlet生命週期方案

1、第一個到達伺服器的HTTP請求被委派到Servlet容器。
2、Servlet 容器在呼叫service()方法之前載入Servlet。
3、然後Servlet容器處理由多個執行緒產生的多個請求,每個執行緒執行個單一的Servlet例項的service()方法。

示例

package com.zyh.contrller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class oneServlet extends HttpServlet {

    public oneServlet() {
        System.out.println("oneServlet類被建立例項物件!");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
        System.out.println();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
        System.out.println("oneServlet:doGet is running...");
    }
}
package com.zyh.contrller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class twoServlet extends HttpServlet {

    public twoServlet() {
        System.out.println("twoServlet類被建立例項物件!");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("twoServlet:doGet is running...");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>oneServlet</servlet-name>
        <servlet-class>com.zyh.contrller.oneServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>twoServlet</servlet-name>
        <servlet-class>com.zyh.contrller.twoServlet</servlet-class>
        <!--通知Tomcat在啟動時負責建立twoServlet例項物件-->
        <load-on-startup>10</load-on-startup>
    </servlet>


    <servlet-mapping>
        <servlet-name>oneServlet</servlet-name>
        <url-pattern>/xx</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>twoServlet</servlet-name>
        <url-pattern>/hh</url-pattern>
    </servlet-mapping>
</web-app>

啟動Tomcat:

加上/xx:


加上/hh:


再次訪問/hh:

無論被訪問多少次,最多生成一個例項物件。