學習課程: 【這可能是B站講的最好的Servlet教程,5小時打通Servlet全套教程丨2022最新版,輕鬆掌握servlet基礎+案例實操】 https://www.bilibili.com/video/BV1Kr4y1V7ZE/?share_source=copy_web&vd_source= ...
學習課程: 【這可能是B站講的最好的Servlet教程,5小時打通Servlet全套教程丨2022最新版,輕鬆掌握servlet基礎+案例實操】 https://www.bilibili.com/video/BV1Kr4y1V7ZE/?share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e0549e
Servlet的生命周期
基本介紹
Servleti沒有main()方法,不能獨立運行,它的運行完全由Servlet引擎來控制和調度。所謂生命周期,指的是servlet容器何時創建servlet實例、何時調用其方法進行請求的處理、何時並銷毀其實例的整個過程。
-
實例和初始化時機
Servlet 通過調用 init () 方法進行初始化。當請求到達容器時,容器查找該servlet對象是否存在,如果不存在,則會創建實例併進行初始化。
-
就緒/調用/服務階段
Servlet 調用 service() 方法來處理客戶端的請求。有請求到達容器,容器調用servlet對象的service()方法。處理請求的方法在整個生命周期中可以被多次調用;HttpServlet的service()方法,會依據請求方式來調用doGet0或者doPost()方法。但是,這兩個do方法預設情況下,會拋出異常,需要子類去override。 -
銷毀時機
Servlet 通過調用 destroy() 方法終止(結束)。當容器關閉時(應用程式停止時),會將程式中的Servlet實例進行銷毀。最後,Servlet 是由 JVM 的垃圾回收器進行垃圾回收的。
上述的生命周期可以通過Servlet中的生命周期方法來觀察。在Servlet中有三個生命周期方法,不由用戶手動調用,而是在特定的時機有容器自動調用,觀察這三個生命周期方法即可觀察到Servlet的生命周期。
方法介紹
-
init方法:在Servlet實例創建之後執行(證明該Servlet有實例創建了)。init 方法被設計成只調用一次。它在第一次創建 Servlet 時被調用,在後續每次用戶請求時不再調用。因此,它是用於一次性初始化,就像 Applet 的 init 方法一樣。
Servlet 創建於用戶第一次調用對應於該 Servlet 的 URL 時,但是您也可以指定 Servlet 在伺服器第一次啟動時被載入。
當用戶調用一個 Servlet 時,就會創建一個 Servlet 實例,每一個用戶請求都會產生一個新的線程,適當的時候移交給 doGet 或 doPost 方法。init() 方法簡單地創建或載入一些數據,這些數據將被用於 Servlet 的整個生命周期。
init 方法的定義如下:
public void init() throws ServletException { // 初始化代碼...}
-
service方法:每次有請求到達某個Servlet方法時執行,用來處理請求(證明該Servlet進行服務了)。service() 方法是執行實際任務的主要方法。Servlet 容器(即 Web 伺服器)調用 service() 方法來處理來自客戶端(瀏覽器)的請求,並把格式化的響應寫回給客戶端。
每次伺服器接收到一個 Servlet 請求時,伺服器會產生一個新的線程並調用服務。service() 方法檢查 HTTP 請求類型(GET、POST、PUT、DELETE 等),併在適當的時候調用 doGet、doPost、doPut,doDelete 等方法。
下麵是該方法的特征:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { }
-
destroy方法:Servlet實例銷毀時執行(證明該Servlet的實例被銷毀了)。destroy() 方法只會被調用一次,在 Servlet 生命周期結束時被調用。destroy() 方法可以讓您的 Servlet 關閉資料庫連接、停止後臺線程、把 Cookie 列表或點擊計數器寫入到磁碟,並執行其他類似的清理活動。
在調用 destroy() 方法之後,servlet 對象被標記為垃圾回收。destroy 方法定義如下所示:
public void destroy() { // 終止化代碼... }
Servlet的生命周期,簡單的慨括這就分為四步:servlet類載入->實例化->服務->銷毀。下麵我們描述一下Tomcat與Servlet是如何工作的,看看下麵的時序圖:
- Web Client向Servlet容器(Tomcat)發出Http請求
- Servlet容器接收Web Client的請求
- Servlet容器創建一個HttpServletRequest對象,將Web Client請求的信息封裝到這個對象中
- Servlet容器創建一個HttpServletResponse對象
- Servlet容器調HttpServlet對象service方法,把Request與Response作為參數,傳給HttpServlet
- HttpServlet調用HttpServletRequest對象的有關方法,獲取Http請求信息
代碼演示:
package com.xxxx.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/ser05")
public class servlet05 extends HttpServlet {
/**
* 就緒/服務方法(處理請求數據)
* 系統方法,伺服器自動調用,
* 當有請求到達Servlet時,就會調用該方法
* 方法可以被多次調用
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Servlet被調用...");
}
/**
* 初始化方法
* 系統方法,伺服器自動調用,它在第一次創建 Servlet對象 時被調用
* 當請求到達Servlet容器時,Servlet容器會判斷該Servlet對象是否存在,如果不存在,則創建實例,並調用該方法初始化
* 該方法在生命周期中只會執行一次
* @throws ServletException
*/
@Override
public void init() throws ServletException {
System.out.println("Servlet被創建了,初始化...");
}
/**
* 銷毀方法
* 系統方法,伺服器自動調用,在 Servlet 生命周期結束時被調用
* 當伺服器關閉或應用程式停止時,調用該方法
* 方法在生命周期中只會調用一次
*/
@Override
public void destroy() {
System.out.println("Servlet被銷毀了...");
}
}