Servlet基礎教程之生命週期

java知多少發表於2020-10-23

目錄

步驟 1 : 生命週期

步驟 2 : 例項化

步驟 3 : 初始化

步驟 4 : 提供服務

步驟 5 : 銷燬

步驟 6 : 被回收


步驟 1 : 生命週期

一個Servlet的生命週期由 例項化初始化提供服務銷燬被回收 幾個步驟組成

生命週期

步驟 2 : 例項化

當使用者通過瀏覽器輸入一個路徑,這個路徑對應的servlet被呼叫的時候,該Servlet就會被例項化

為LoginServlet顯式提供一個構造方法 LoginServlet()

然後通過瀏覽器訪問,就可以觀察到
"LoginServlet 構造方法 被呼叫"

無論訪問了多少次LoginServlet
LoginServlet構造方法 只會執行一次,所以Servlet是單例項的

例項化

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

     

    public LoginServlet(){

        System.out.println("LoginServlet 構造方法 被呼叫");

    }

 

    protected void service(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        //略

 

    }

 

}

步驟 3 : 初始化

LoginServlet 繼承了HttpServlet,同時也繼承了init(ServletConfig) 方法

init 方法是一個例項方法,所以會在構造方法執行後執行。

無論訪問了多少次LoginSerlvet
init初始化 只會執行一次

初始化

import java.io.IOException;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

 

    public LoginServlet() {

        System.out.println("LoginServlet 構造方法 被呼叫");

    }

 

    public void init(ServletConfig config) {

        System.out.println("init(ServletConfig)");

    }

 

    protected void service(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        // 略

 

    }

 

}

步驟 4 : 提供服務

接下來就是執行service()方法,然後通過瀏覽器傳遞過來的資訊進行判斷,是呼叫doGet()還是doPost()方法

在service()中就會編寫我們的業務程式碼,在本例中就是判斷使用者輸入的賬號和密碼是否正確

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

 

    public LoginServlet() {

        System.out.println("LoginServlet 構造方法 被呼叫");

    }

 

    public void init(ServletConfig config) {

        System.out.println("init(ServletConfig)");

    }

 

    protected void service(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

  

        String name = request.getParameter("name");

        String password = request.getParameter("password");

  

        String html = null;

  

        if ("admin".equals(name) && "123".equals(password))

            html = "<div style='color:green'>success</div>";

        else

            html = "<div style='color:red'>fail</div>";

  

        PrintWriter pw = response.getWriter();

        pw.println(html);

  

    }

 

}

步驟 5 : 銷燬

接著是銷燬destroy()
在如下幾種情況下,會呼叫destroy()
1. 該Servlet所在的web應用重新啟動
在server.xml中配置該web應用的時候用到了

<Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />


如果把 reloadable="false" 改為reloadable="true" 就表示有任何類發生的更新,web應用會自動重啟
當web應用自動重啟的時候,destroy()方法就會被呼叫

2. 關閉tomcat的時候 destroy()方法會被呼叫,但是這個一般都發生的很快,不易被發現。

銷燬

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

public class LoginServlet extends HttpServlet {

 

    public void destroy() {

        System.out.println("destroy()");

    }

 

    protected void service(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        // 略

    }

 

}

步驟 6 : 被回收

當該Servlet被銷燬後,就滿足垃圾回收的條件了。 當下一次垃圾回收GC來臨的時候,就有可能被回收。

這個。。。也是不容易被觀察到的現象。


更多內容,點選瞭解: https://how2j.cn/k/servlet/servlet-lifecycle/550.html

相關文章