Servlet 生命週期方法

爲了方便標識可以這裏修改 Tomcat 的虛擬目錄
在這裏插入圖片描述

一、Servlet 執行原理

* 執行原理:
	(1)當服務器接受到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑
	(2)查找web.xml文件,是否有對應的<url-pattern>標籤體內容。
	(3)如果有,則在找到對應的<servlet-class>全類名
	(4)tomcat會將字節碼文件加載進內存,並且創建其對象
	(5)調用其方法

在這裏插入圖片描述

二、Servlet 生命週期

  1. 被創建:執行init方法,只執行一次
* Servlet什麼時候被創建?
	* 默認情況下,第一次被訪問時,Servlet被創建
	* 可以配置執行Servlet的創建時機,在 web.xml 中修改
					*<servlet>標籤下配置
						(1) 第一次被訪問時,創建
	                		* <load-on-startup>的值爲負數
			            (2)在服務器啓動時,創建
			                * <load-on-startup>的值爲0或正整數
    <!--配置Servlet -->
    <servlet>
        <servlet-name>demo2</servlet-name>
        <servlet-class>servlet.ServletDemo</servlet-class>
        <!--指定Servlet的創建時機
            1.第一次被訪問時創建
                * <load-on-startup>負數</load-on-startup>
            2.在服務器啓動時創建
                * <load-on-startup>值爲0或正整數</load-on-startup>
        -->
        <load-on-startup>-5</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo2</servlet-name>
        <url-pattern>/demo2</url-pattern>
    </servlet-mapping>
</web-app>
* Servlet的init方法,只執行一次,說明一個Servlet在內存中只存在一個對象,Servlet是單例的
	* 多個用戶同時訪問時,可能存在線程安全問題。
	* 解決:儘量不要在Servlet中定義成員變量,即使定義了成員變量,也不要對修改值
  1. 提供服務:執行service方法,執行多次
* 每次訪問Servlet時,Service方法都會被調用一次。
  1. 被銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行:服務器關閉時,Servlet被銷燬
		* 只有服務器正常關閉時,纔會執行destroy方法。
		* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源

整體示例:

public class ServletDemo implements Servlet {
    private int age = 3;

    /**
     * 初始化方法
     * 在Servlet被創建時,執行。只會執行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init.....");
    }

    /**
     * 獲取ServletConfig對象
     * ServletConfig:Servlet的配置對象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * 提供服務方法
     * 每一次Servlet被訪問時,執行。執行多次
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service.....");
        int number = 3;
    }

    /**
     * 獲取Servlet的一些信息,版本,作者等等。。
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }

    /**
     * 銷燬方法
     * 在服務器正常關閉時,執行,執行一次。
     */
    @Override
    public void destroy() {
        System.out.println("destroy.....");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章