學習課程: 【這可能是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被銷毀了...");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556209.html
標籤:其他
下一篇:返回列表