文章目錄
- 概念
- 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 報文。
Request
與Response
對象在Tomcat
層創建后,仍按 Servlet 規范傳遞給下游組件 - SpringBoot 沒有
web.xml
,在啟動時自動向容器注冊一個核心 Servlet ——DispatcherServlet
,并將所有路徑(/)映射給它(DispatcherServletRegistrationBean
完成注冊) - 由
DispatcherServlet
統一接管,后續 URL 再由 Spring 框架內部解析,而不是 Tomcat 直接查找其他 Servlet - Spring 容器在啟動階段就把
DispatcherServlet
作為Bean
創建并交給 Tomcat;若使用@WebServlet
、ServletRegistrationBean
等方式,還能額外注冊自定義原生 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 規范的
Filter
→Servlet
→Listener
次序執行,只是對象由 Spring 托管并可享受依賴注入與配置屬性。
- 使用
流程圖
瀏覽器│
HTTP 請求│
嵌入式 Tomcat (解析協議、線程池)│
DispatcherServlet (統一入口)│
HandlerMapping → 找控制器│
HandlerAdapter → 解析參數 + AOP│
Controller 方法(業務邏輯)│
HttpMessageConverter / ViewResolver│
DispatcherServlet│
Tomcat 寫回 HTTP 響應▼
瀏覽器
參考
- Title Unavailable | Site Unreachable