Servlet 快速入門

文章目錄

    • 概念
    • SpringBoot 測試案例
    • 執行原理
      • 傳統 Servlet
      • 在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中請求從瀏覽器到業務代碼的完整步驟
        • 關鍵點
        • 流程圖
    • 參考

概念

運行在服務器端的小程序, Servlet 就是一個接口,定義 Java 類被瀏覽器訪問到(Tomcat識別)的規則

SpringBoot 測試案例

創建簡單的 SpringBoot 項目進行測試,首先創建 Java 空項目,根據 POM 配置文件構建簡單的 SpringBoot 項目

    <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.5.0</version></dependency></dependencies>

需要注意的是,如果是 Servlet5.0 以上需要 Jakarta EE 依賴,而 Servlet 4.0 及以下則需要 Java EE 依賴

Jakarta EE 依賴

<dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><scope>provided</scope>
</dependency>

Java EE 依賴

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>

創建 Servlet 測試類,抽象實現 Servlet 接口,添加 @WebServlet 注解并指定 URL 映射,使用 @WebServlet 注解聲明了這個類為 Servlet,該注解會在部署時被容器處理,容器根據其具體的屬性配置將相應的類部署為 Servlet。

@WebServlet 是 Servlet 3.0(Jakarta Servlet 3.0) 引入的注解,用來在 不寫 web.xml 的情況下向 Servlet 容器注冊一個 HttpServlet 子類。它與早期基于 web.xml 的 <servlet> / <servlet-mapping> 配置功能等價,但更符合 “約定優于配置” 的理念,能讓一個普通 Java 類 就地聲明 自己的元數據(名稱、URL 映射、初始化參數等)并立刻生效。

@WebServlet("/demo")
public class ServletDemo implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}// 提供服務的方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("Hello Servlet!");}@Overridepublic String getServletInfo() {return "";}@Overridepublic void destroy() {}
}

在 SpringBoot 啟動類中新增 @ServletComponentScan 注解,SpringBoot 會把所有帶 @WebServlet@WebFilter@WebListener 的組件交給內置容器(Tomcat/Jetty/Undertow)自動注冊。

@SpringBootApplication
@ServletComponentScan
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

當訪問 /demo 接口時,會輸出 Hello Servlet!

2025-06-03T14:59:21.629+08:00  INFO 76957 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2025-06-03T14:59:21.633+08:00  INFO 76957 --- [           main] web.servlet.DemoApplication              : Started DemoApplication in 0.525 seconds (process running for 0.696)
Hello Servlet!

執行原理

傳統 Servlet

  • 當服務器接收到客戶端瀏覽器的請求后,會解析請求 URL 路徑,獲取訪問 Servlet 的資源路徑
  • 查找 web.xml 文件,是否找到對應的 <url-pattern> 標簽體內容
  • 如果有,則在找到對應的 <servlet-class> 全類名
  • Tomcat 會將字節碼文件加載到內容,并創建其對象
  • 調用其對應 service 方法

在 SpringBoot (嵌入式 Tomcat + Spring MVC) 中請求從瀏覽器到業務代碼的完整步驟

  • 嵌入式 Tomcat 解析 HTTP 報文。RequestResponse 對象在 Tomcat 層創建后,仍按 Servlet 規范傳遞給下游組件
  • SpringBoot 沒有 web.xml,在啟動時自動向容器注冊一個核心 Servlet —— DispatcherServlet,并將所有路徑(/)映射給它(DispatcherServletRegistrationBean 完成注冊)
  • DispatcherServlet 統一接管,后續 URL 再由 Spring 框架內部解析,而不是 Tomcat 直接查找其他 Servlet
  • Spring 容器在啟動階段就把 DispatcherServlet 作為 Bean 創建并交給 Tomcat;若使用 @WebServletServletRegistrationBean 等方式,還能額外注冊自定義原生 Servlet
  • Tomcat 把 HttpServletRequest/Response 交給 DispatcherServlet.service()
  • 之后進入 Spring MVC 專屬流程
    • HandlerMapping:根據 URI、HTTP 方法匹配到具體 @Controller / @RestController 的方法(Handler)
    • HandlerAdapter:選用合適的適配器(通常是 RequestMappingHandlerAdapter)調用該方法
    • 調用業務方法:參數解析、依賴注入、校驗、AOP 切面等在這一層生效;方法返回值隨后被包裝成 ModelAndView 或直接寫回 JSON
    • ViewResolver / HttpMessageConverter:將返回值渲染成 HTML、JSON、XML 等;最后寫入 HttpServletResponse
關鍵點
  • 自動裝配,DispatcherServletAutoConfiguration 在 SpringBoot 啟動時運行
    • 創建 DispatcherServlet Bean
    • 把其 URL 映射(默認為 /)注冊到嵌入式 Tomcat(或 Jetty/Undertow)
    • 允許通過 spring.mvc.servlet.path 修改前綴,或定義多個 ServletRegistrationBean 手動注冊其他 Servlet
  • 過濾器與監聽器
    • 使用 FilterRegistrationBean@WebFilter@ServletComponentScan 或 Spring Security 的 FilterChain 定義過濾器
    • 容器仍按 Servlet 規范的 FilterServletListener 次序執行,只是對象由 Spring 托管并可享受依賴注入與配置屬性。
流程圖
瀏覽器│
HTTP 請求│
嵌入式 Tomcat (解析協議、線程池)│
DispatcherServlet (統一入口)│
HandlerMapping → 找控制器│
HandlerAdapter → 解析參數 + AOP│
Controller 方法(業務邏輯)│
HttpMessageConverter / ViewResolver│
DispatcherServlet│
Tomcat 寫回 HTTP 響應▼
瀏覽器

參考

  • Title Unavailable | Site Unreachable

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 8 Stream API 入門到實踐詳解

一、告別 for 循環&#xff01; 傳統痛點&#xff1a; Java 8 之前&#xff0c;集合操作離不開冗長的 for 循環和匿名類。例如&#xff0c;過濾列表中的偶數&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…

黃柏基因組-小檗堿生物合成的趨同進化-文獻精讀142

Convergent evolution of berberine biosynthesis 小檗堿生物合成的趨同進化 摘要 小檗堿是一種有效的抗菌和抗糖尿病生物堿&#xff0c;主要從不同植物譜系中提取&#xff0c;特別是從小檗屬&#xff08;毛茛目&#xff0c;早期分支的真雙子葉植物&#xff09;和黃柏屬&…

機器學習14-遷移學習

遷移學習學習筆記 一、遷移學習概述 遷移學習是機器學習中的一個重要領域&#xff0c;它旨在解決當目標任務的訓練數據有限時&#xff0c;如何利用與目標任務相關但不完全相同的源任務數據來提高學習性能的問題。在現實世界中&#xff0c;獲取大量高質量的標注數據往往成本高…

013旅游網站設計技術詳解:打造一站式旅游服務平臺

旅游網站設計技術詳解&#xff1a;打造一站式旅游服務平臺 在互聯網與旅游業深度融合的時代&#xff0c;旅游網站成為人們規劃行程、預訂服務的重要工具。一個功能完備的旅游網站&#xff0c;通過用戶管理、訂單管理等核心模塊&#xff0c;實現用戶與管理員的高效交互。本文將…

量子計算+AI:特征選擇與神經網絡優化創新應用

在由玻色量子協辦的第二屆APMCM“五岳杯”量子計算挑戰賽中&#xff0c;來自北京理工大學的Q-Masterminds團隊摘取了銀獎。該團隊由北京理工大學張玉利教授指導&#xff0c;依托玻色量子550計算量子比特的相干光量子計算機&#xff0c;將量子計算技術集成到特征選擇和神經網絡剪…

Maven相關問題:jna版本與ES沖突 + aop失效

文章目錄 1、背景2、解決3、一點思考4、環境升級導致AOP失效5、okhttp Bean找不到6、總結 記錄一些Maven依賴相關的思考 1、背景 做一個監控指標收集&#xff0c;用一下jna依賴&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifact…

gitlab CI/CD本地部署配置

背景: 代碼管理平臺切換為公司本地服務器的gitlab server。為了保證commit的代碼至少編譯ok&#xff0c;也為了以后能拓展test cases&#xff0c;現在先搭建本地gitlab server的CI/CD基本的編譯job pipeline。 配置步驟&#xff1a; 先安裝gitlab-runner: curl -L "ht…

移除元素-JavaScript【算法學習day.04】

題目鏈接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一種思路 標簽&#xff1a;拷貝覆蓋 主要思路是遍歷數組 nums&#xff0c;每次取出的數字變量為 num&#xff0c;同時設置一個下標 ans 在遍歷過程中如果出現數字與需要移除的值不相同時&#xff…

leetcode sql50題

在中文站沒找到對應的集合&#xff0c;想來自己動手拷貝過來&#xff0c;方便大家面試復習用&#xff0c;對應英文站點&#xff1a; https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的產品 鏈接: https://leetcode.cn/problems/recyclable-and-low-fa…

Dynadot專業版郵箱工具指南(五):將域名郵箱添加至Outlook客戶端

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

【RTSP從零實踐】1、根據RTSP協議實現一個RTSP服務

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Python網頁數據抓取常用的庫及方法介紹

Python網頁數據抓取常用的庫及方法介紹 摘要:以下是Python網絡數據抓取常用的6個庫的詳細介紹,包括它們的概述以及每個庫中最常用的10個函數(如果某些庫常用函數不足10個,則列出所有常用函數)。每個函數都附帶功能描述、用法說明和使用示例。這些庫在網絡爬蟲、數據…

6.5 note

一個很有意思的dfs模擬題_前序遍歷 這個問題的話前置內容顯然是字典序&#xff0c;什么是字典序呢&#xff1f; 顧名思義&#xff0c;就是詞語在字典中的順序&#xff0c;也就是我們最常說的a,abandon,ability&#xff08;我記得前三個是這個&#xff09; 這是一種字符串之間比…

day027-Shell自動化編程-基礎

文章目錄 1. 修改vim配置文件自動添加注釋2. 故障案例&#xff1a;Windows上寫的Shell腳本上傳到Linux系統上運行報錯3. 腳本運行方法4. 變量4.1 普通變量4.2 環境變量4.3 特殊變量4.4 案例&#xff1a;書寫ping檢查腳本&#xff0c;檢查腳本傳入的第一個參數4.5 面試題&#x…

2025年滲透測試面試題總結-騰訊[實習]科恩實驗室-安全工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 騰訊[實習]科恩實驗室-安全工程師 一、網絡與協議 1. TCP三次握手 2. SYN掃描原理 3. HTTPS證書機制 二…

人工智能賦能高中學科教學的應用與前景研究

一、引言 1.1 研究背景 在科技飛速發展的當下&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;簡稱 AI&#xff09;已成為全球矚目的關鍵技術領域&#xff0c;深刻地改變著人們的生活、工作和學習方式。從智能家居設備到智能交通系統&#xff0c;從醫療…

八、【ESP32開發全棧指南:UDP客戶端】

1. 環境準備 安裝ESP-IDF v4.4 (官方指南)確保Python 3.7 和Git已安裝 2. 創建項目 idf.py create-project udp_client cd udp_client3. 完整優化代碼 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…

Android Studio 解決首次安裝時下載 Gradle 慢問題

1、問題描述 第一次安裝 Android Studio 時&#xff0c; 新建工程后&#xff0c;在編譯時會自動去下載 Gradle&#xff0c;但是一般都會下載失敗&#xff0c;提示鏈接超時&#xff1a; Could not install Gradle distribution from https://services.gradle.org/distributions…

hive聚合函數多行合并

在數據倉庫和大數據處理的場景中&#xff0c;Hive提供了強大的SQL查詢能力&#xff0c;其中包括聚合函數用于處理和合并多行數據。本文將深入探討Hive中的幾種常見聚合函數及其在多行合并中的應用。 一、Hive中的常見聚合函數 Hive提供了多種聚合函數&#xff0c;這些函數可以…

關于物聯網的基礎知識(一)

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于物聯網的基礎知識&#xff08;一&a…