Servlet p2 Servlet的生命周期

来源:https://www.cnblogs.com/zh-Note/archive/2023/06/28/17476285.html
-Advertisement-
Play Games

學習課程: 【這可能是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是如何工作的,看看下麵的時序圖:

  1. Web Client向Servlet容器(Tomcat)發出Http請求
  2. Servlet容器接收Web Client的請求
  3. Servlet容器創建一個HttpServletRequest對象,將Web Client請求的信息封裝到這個對象中
  4. Servlet容器創建一個HttpServletResponse對象
  5. Servlet容器調HttpServlet對象service方法,把Request與Response作為參數,傳給HttpServlet
  6. 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被銷毀了...");
    }
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 教程簡介 Cognos是在BI核心平臺之上,以服務為導向進行架構的一種數據模型,是唯一可以通過單一產品和在單一可靠架構上提供完整業務智能功能的解決方案。它可以提供無縫密合的報表、分析、記分卡、儀錶盤等解決方案,通過提供所有的系統和資料資源,以簡化公司各員工處理資訊的方法。作為一個全面、靈活的產 ...
  • ## 教程簡介 JavaFX 是一個 Java 庫,用於開發桌面應用程式以及富 Internet 應用程式 (RIA)。在 JavaFX 中構建的應用程式可以在多個平臺上運行,包括 Web、移動和桌面。 JavaFX 旨在取代 Java 應用程式中的 swing 作為 GUI 框架。但是,它提供了比 ...
  • > Least Recently Used(LRU) 是緩存淘汰一種常用的策略,記憶體滿了則優先刪除最久沒被使用的數據。 ## LRU 演算法的需求 1. 接收一個參數 `capacity` 作為緩存的最大容量 2. 實現一個函數 `put()` 添加數據到緩存 3. 實現一個函數 `get()` 查詢 ...
  • # JDBC概述 ## 基本介紹 1. JDBC為訪問不同的資料庫提供了統一的介面,為使用者屏蔽了細節問題。 2. Java程式員使用JDBC,可以連接任何提供了JDBC驅動程式的資料庫系統,從而完成對資料庫的各種操作。 3. **JDBC的基本原理:** ![](https://img2023.c ...
  • ### Spring-webflux簡介 spring-webflux是spring在5.0版本後提供的一套響應式編程風格的web開發框架,大量測評證明,使用WebFlux開發介面能夠大幅提升介面的吞吐量。 這個框架包含了spring-framework和spring mvc,它可以運行在Netty ...
  • 在當今數字時代,文檔轉換已經成為我們日常生活中不可或缺的一部分。然而,不是所有的文件格式都是平等無差的,在與他人共用文檔時可能會遇到相容性問題。這就是我們需要進行文件格式轉換的原因,而將PDF轉換為XPS是一種受歡迎的轉換選擇。如果你正在尋找一種使用Java將PDF文件轉換為XPS的方法,不妨試試F... ...
  • # Conda 命令深入指南 Conda 是一個功能強大的包管理系統,允許您為不同的項目創建和管理隔離的環境,從而更輕鬆地處理不同的依賴項集。 ## 安裝 可以按照 Conda 官方網站 (https://conda.io) 上提供的說明下載並安裝 Conda。 安裝後,可以打開終端或命令提示符並開 ...
  • ​ 本文討論了四種語言的非同步,強調了它在創建高效、響應迅速的應用程式中的作用。 作為一名擁有多年主要使用 Java 工作經驗的軟體開發人員,當我最近為一個新項目切換到 Python 時,我發現自己很感興趣。這種轉變促使我探索各種語言的非同步編程世界,包括 Java、Python、JavaScript ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...