啟動 Spring 或 Spring Boot 項目需要 Tomcat的原因解析

本文的內(nèi)容是博主學(xué)習(xí)并記錄關(guān)于 Tomcat 的基本知識,介紹了 Tomcat 為什么是一個 Web 應(yīng)用服務(wù)器,為什么是 Servlet 容器,同時總結(jié)了 Tomcat 的一些功能原理,并詳細(xì)介紹了 Tomcat 在 Spring 和SpringBoot 項目中的使用原理。本文不涉及安裝和使用說明。
一、Tomcat 是什么,有什么功能和作用?
Tomcat 是 Apache 軟件基金會(Apache Software Foundation)的 Jakarta 項目中的一個核心項目,是一個開源的、輕量級的 Web 應(yīng)用服務(wù)器,屬于 Servlet 容器 ,用于運行 Java Web 應(yīng)用程序。
它實現(xiàn)了
Java Servlet、JavaServer Pages(JSP)、WebSocket等 Java EE(現(xiàn)在稱為 Jakarta EE)規(guī)范。將編寫好的 Java Web 應(yīng)用部署到其中,并通過 HTTP 協(xié)議對外提供服務(wù),即 主要用于運行 Java 編寫的 Web 應(yīng)用程序。
上面兩段話中提到了 Tomcat 是一個 Web 應(yīng)用服務(wù)器,屬于 Servlet 容器,怎么理解這句話?或者說:“為什么 Servlet 容器是 Tomcat 的核心功能之一”。

由上圖可以看出 Tomcat 具有 HTTP 服務(wù)器的能力處理 HTTP 請求,也具有 Servlet 容器的能力,管理 Servlet 的生命周期等。接下來我們詳細(xì)介紹 Tomcat 如何具有并使用上述功能。
1、 Servlet 容器是什么?
要了解 Servlet 容器就要先了解什么是 Servlet 。Servlet 是用 Java 編寫的服務(wù)器端程序,用于處理客戶端(通常是瀏覽器)的 HTTP 請求并生成動態(tài)內(nèi)容。是 Java EE 規(guī)范的一部分,定義了服務(wù)器端程序的標(biāo)準(zhǔn)接口,如 javax.servlet.Servlet 。Spring MVC 中的 DispatcherServlet 就是一個典型的 Servlet,負(fù)責(zé)處理所有進(jìn)入 Spring 應(yīng)用的請求。
而容器是用來存放物品,Servlet 容器就可以理解成存放 Servlet,那么在實際環(huán)境中就可以理解成是一個運行環(huán)境,負(fù)責(zé)管理 Servlet 的生命周期、處理 HTTP 請求并將請求傳遞給相應(yīng)的 Servlet 。
Servlet 容器的主要職責(zé)包括:
- 加載和初始化 Servlet :在應(yīng)用啟動時加載 Servlet 類并調(diào)用其
init()方法。 - 處理請求:將 HTTP 請求封裝成
HttpServletRequest對象,并調(diào)用 Servlet 的service()方法處理請求。 - 銷毀 Servlet:在應(yīng)用關(guān)閉時調(diào)用 Servlet 的
destroy()方法釋放資源。 - 管理線程:為每個請求分配線程,確保 Servlet 能夠并發(fā)處理多個請求。
- 提供其他服務(wù):如會話管理、安全性、JSP 支持等。
2、Tomcat 如何作為 Servlet 容器?
Tomcat 實現(xiàn)了 Java Servlet 規(guī)范(如 Servlet API),因此可以說它是一個標(biāo)準(zhǔn)的 Servlet 容器,所以它就具備了 Servlet 容器的功能,具有了運行 Servlet 的運行環(huán)境。因此,當(dāng)你在 Tomcat 中部署一個 Java Web 應(yīng)用(通常是 WAR 文件)時,Tomcat 會做到以下步驟:
- 解析應(yīng)用的
web.xml文件(或注解,現(xiàn)在的項目都是使用注解方式),找到所有注冊的 Servlet。 - 加載這些 Servlet 類并初始化它們。
- 監(jiān)聽 HTTP 請求,并將請求分發(fā)給對應(yīng)的 Servlet 處理。
- 將 Servlet 生成的響應(yīng)返回給客戶端。
上面說關(guān)于找到應(yīng)用的所有注冊的 Servlet ,在現(xiàn)階段的 Spring Boot 項目中已經(jīng)不使用 web.xml 文件和注解的方式,而是使用自動裝配的方式,文章后面會詳細(xì)介紹。
3、Servlet 容器與 Web 服務(wù)器的關(guān)系
- Web 服務(wù)器如 Apache HTTP Server 和 Nginx,主要負(fù)責(zé)處理靜態(tài)內(nèi)容(如 HTML、CSS、圖片)和簡單的 HTTP 請求。
- Servlet 容器則專注于運行動態(tài)的 Java Web 應(yīng)用程序(如 Servlet、JSP)。
Tomcat 既可以獨立運行,直接處理 HTTP 請求并運行動態(tài)內(nèi)容。也可以與其他 Web 服務(wù)器(如 Apache HTTP Server)配合使用,由 Web 服務(wù)器處理靜態(tài)內(nèi)容,動態(tài)請求則轉(zhuǎn)發(fā)給 Tomcat 處理。所以說Tomcat 既是 Web 服務(wù)器,也是 Servlet 容器。
4、為什么說 Tomcat 屬于 Servlet 容器?
Tomcat 的核心功能是運行和管理 Servlet,因此它首先是一個 Servlet 容器。雖然它也具備 Web 服務(wù)器的功能(如處理 HTTP 請求),但這些功能是為了支持 Servlet 的運行而存在的。換句話說,Tomcat 的主要目的是為 Java Web 應(yīng)用提供一個符合 Servlet 規(guī)范的運行環(huán)境。
我們可以做下面一個假設(shè):將 Servlet 容器比作一個餐廳廚房:
- Servlet 是廚師,負(fù)責(zé)烹飪(處理請求)。
- Servlet 容器是廚房,負(fù)責(zé)管理廚師(加載、初始化、銷毀),并提供工具和食材(請求對象、響應(yīng)對象)。
- Web 服務(wù)器是餐廳前臺,負(fù)責(zé)接待客人(接收 HTTP 請求)并將訂單(請求)傳遞給廚房。
- Tomcat 既是前臺又是廚房,既能接待客人,也能烹飪菜品。
Tomcat 屬于 Servlet 容器 意味著 Tomcat 的核心功能是運行和管理 Servlet,為 Java Web 應(yīng)用提供符合 Servlet 規(guī)范的運行環(huán)境。它負(fù)責(zé)加載 Servlet、處理 HTTP 請求、管理 Servlet 生命周期,并生成動態(tài)內(nèi)容返回給客戶端。雖然 Tomcat 也具備 Web 服務(wù)器的功能,但這些功能是為了支持 Servlet 的運行而存在的。
5、Tomcat 主要功能和特點
由 “ Tomcat 屬于 Servlet 容器 ” 這個話題基本就能了解到 Tomcat 的核心功能就是一個開源的、輕量級的 Web 應(yīng)用服務(wù)器,屬于 Servlet 容器 ,用于運行 Java Web 應(yīng)用程序。
主要功能:
- Servlet 容器:Tomcat 的主要功能是作為 Servlet 容器,負(fù)責(zé)管理 Servlet 的生命周期(初始化、請求處理、銷毀)。它處理 HTTP 請求并將其傳遞給相應(yīng)的 Servlet 進(jìn)行處理。
- JSP 支持:Tomcat 支持 JSP,允許開發(fā)者在 HTML 中嵌入 Java 代碼,動態(tài)生成網(wǎng)頁內(nèi)容。
- HTTP 服務(wù)器:Tomcat 也是一個輕量級的 HTTP 服務(wù)器,能夠直接處理 HTTP 請求并返回響應(yīng)。
主要特點:
- 輕量級和高性能:Tomcat 是一個輕量級的 Web 應(yīng)用服務(wù)器,具有較高的性能和較低的資源消耗。
- 靈活的配置:通過配置文件(如 server.xml),可以靈活地設(shè)置 Tomcat 的各種參數(shù),包括連接器、線程池、虛擬主機(jī)等。
- 安全性:Tomcat 提供了多種安全機(jī)制,如用戶角色管理、訪問控制等。
- 可擴(kuò)展性:支持集群部署,能夠通過多臺服務(wù)器實現(xiàn)負(fù)載均衡和高可用性。
二、為什么啟動 Spring 或 Spring Boot 項目需要 Tomcat?
1、在 Spring 項目中使用 Tomcat 的原因
在 Spring 項目(非 Spring Boot 項目)中,Tomcat 是一個常用的部署環(huán)境。因為 Spring 本身主要是一個輕量級的 Java 應(yīng)用開發(fā)框架,側(cè)重于業(yè)務(wù)邏輯層的開發(fā),如依賴注入(DI)、面向切面編程(AOP)等。它并不直接包含一個完整的 Web 服務(wù)器來處理 HTTP 請求。
當(dāng)開發(fā)一個基于 Spring 的 Web 應(yīng)用時,需要一個 Web 服務(wù)器來接收客戶端的 HTTP 請求,并將請求轉(zhuǎn)發(fā)給 Spring 應(yīng)用進(jìn)行處理。Tomcat 作為一個成熟的 Servlet 容器,能夠很好地承擔(dān)這個角色。它可以解析 HTTP 請求,找到對應(yīng)的 Servlet 或 Spring MVC 控制器來處理請求,并將處理結(jié)果返回給客戶端。
例如,一個基于 Spring MVC(Spring 的 Web 模塊)的應(yīng)用,通過配置 Tomcat 來運行,當(dāng)用戶在瀏覽器中輸入一個 URL 時,Tomcat 會接收到這個請求,然后根據(jù)配置將請求映射到相應(yīng)的 Spring MVC 控制器方法上,控制器方法處理業(yè)務(wù)邏輯并返回數(shù)據(jù),最后由 Tomcat 將數(shù)據(jù)渲染成合適的格式(如 HTML)返回給用戶。
2、在 Spring Boot 項目中使用 Tomcat 的原因
Spring Boot 是為了簡化 Spring 應(yīng)用的初始搭建以及開發(fā)過程而創(chuàng)建的。Spring Boot 默認(rèn)會內(nèi)嵌一個 Tomcat 服務(wù)器,這使得我們可以快速地構(gòu)建和運行一個獨立的 Web 應(yīng)用,無需手動安裝和配置外部的 Tomcat 服務(wù)器。當(dāng)我們使用IDEA等軟件啟動項目時,此時內(nèi)嵌的 Tomcat 會隨之啟動并運行應(yīng)用。
另外,Spring Boot 也支持替換內(nèi)嵌的 Tomcat 為其他的 Servlet 容器(如 Jetty),或者將 Spring Boot 應(yīng)用打包成 WAR 文件后部署到外部的 Tomcat 服務(wù)器上。
3、Tomcat 在Spring 或 Spring Boot 項目的作用
Spring 和 Spring Boot 項目通常構(gòu)建為 Web 應(yīng)用,需要運行在支持 Servlet 規(guī)范的容器中。Tomcat 作為 Servlet 容器,能夠提供運行環(huán)境。
- Servlet 規(guī)范支持:Spring MVC 基于 Servlet API,Tomcat 實現(xiàn)了 Servlet 規(guī)范,能夠運行 Spring 應(yīng)用。
- 嵌入式服務(wù)器:Spring Boot 默認(rèn)內(nèi)置 Tomcat 作為嵌入式服務(wù)器,無需單獨安裝 Tomcat,簡化了部署流程。
- 具有 Web 服務(wù)器功能:Tomcat 處理 HTTP 請求,并將請求轉(zhuǎn)發(fā)給 Spring 應(yīng)用。
- 具有 Servlet 容器功能:Tomcat 管理 Servlet 的生命周期,Spring MVC 的
DispatcherServlet由 Tomcat 管理。 - 可以作為部署平臺提供環(huán)境:Spring 項目通常打包為 WAR 文件,部署到 Tomcat 上運行。
- 嵌入式服務(wù)器:Spring Boot 內(nèi)置 Tomcat,開發(fā)者無需單獨安裝,簡化了部署流程。
4、Tomcat 在項目中扮演的角色
omcat 在 Spring 和 Spring Boot 項目中都扮演著至關(guān)重要的角色,是運行 Java Web 應(yīng)用的重要基礎(chǔ)設(shè)施。
- HTTP 請求處理者:Tomcat 監(jiān)聽指定的端口(默認(rèn)是 8080),接收客戶端發(fā)送的 HTTP 請求,對請求進(jìn)行解析,提取請求的相關(guān)信息(如請求方法、URL、參數(shù)等)。
- Servlet 容器:負(fù)責(zé)加載和管理 Web 應(yīng)用中的 Servlet 組件。當(dāng)接收到請求時,根據(jù)請求的 URL 等信息找到對應(yīng)的 Servlet 實例,并調(diào)用其
service()方法(或根據(jù)請求方法調(diào)用doGet()、doPost()等具體方法)來處理請求。 - JSP 引擎:對于包含 JSP 頁面的 Web 應(yīng)用,Tomcat 會將 JSP 頁面編譯成 Servlet 類,然后按照處理 Servlet 的方式來處理 JSP 頁面的請求,動態(tài)生成 HTML 內(nèi)容返回給客戶端。
- 資源管理:管理 Web 應(yīng)用的靜態(tài)資源(如 HTML、CSS、JavaScript 文件等),當(dāng)客戶端請求這些靜態(tài)資源時,Tomcat 直接從文件系統(tǒng)中讀取并返回給客戶端。
5、Tomcat 的啟動過程
當(dāng)啟動 Spring Boot 應(yīng)用時,Spring Boot 會自動創(chuàng)建并啟動一個嵌入式 Tomcat 實例。
- 加載配置:Spring Boot 從 application.properties 或 application.yml 中加載配置。
- 創(chuàng)建 Spring 上下文:初始化 Spring 應(yīng)用上下文,注冊相關(guān)的 Bean。
- 創(chuàng)建 Tomcat 實例:通過 TomcatServletWebServerFactory 創(chuàng)建并配置 Tomcat 實例。
- 啟動 Tomcat:啟動 Tomcat,監(jiān)聽指定端口,等待 HTTP 請求。
Tomcat 的目錄結(jié)構(gòu)
- bin:存放可執(zhí)行文件,如 startup.sh 和 shutdown.sh。
- conf:存放配置文件,如 server.xml 和 web.xml。
- lib:存放 Tomcat 運行所需的 JAR 包。
- logs:存放運行日志文件。
- webapps:默認(rèn)的 Web 應(yīng)用部署目錄。
- work:存放 Web 應(yīng)用編譯后的臨時文件。
Tomcat 是一個輕量級、高性能的 Java Web 應(yīng)用服務(wù)器,支持 Servlet 和 JSP 規(guī)范。在 Spring 或 Spring Boot 項目中,Tomcat 作為嵌入式 Servlet 容器,提供了運行時環(huán)境和 HTTP 請求處理能力。Spring Boot 的內(nèi)置 Tomcat 使得項目部署更加便捷,同時保持了高度的靈活性。
三、SpringBoot 發(fā)現(xiàn)并解析 Servlet
在 Spring Boot 項目中,雖然沒有傳統(tǒng)的 web.xml 文件,也沒有顯式使用注解(如 @WebServlet),但 Spring Boot 仍然能夠發(fā)現(xiàn)并解析 Servlet。這主要依賴于 Spring Boot 的自動配置機(jī)制和 Servlet 3.0 規(guī)范的支持。
1、Servlet 3.0 規(guī)范的支持
- Servlet 3.0 引入了無
web.xml配置的機(jī)制,允許通過編程方式注冊 Servlet、Filter 和 Listener。 - Servlet 3.0 提供了
ServletContainerInitializer接口,允許在 Servlet 容器啟動時動態(tài)注冊 Servlet。 - Spring 提供了
WebApplicationInitializer接口,我們可以通過實現(xiàn)該接口以編程方式注冊 Servlet。 - Spring 實現(xiàn)了
SpringServletContainerInitializer類,該類會在容器啟動時被調(diào)用,進(jìn)而加載所有實現(xiàn)了WebApplicationInitializer接口的類。 - 例如,Spring Boot 的
DispatcherServlet就是通過這種方式注冊的。 - Spring Boot 的自動配置機(jī)制會檢測并加載這些實現(xiàn)類,完成 Servlet 的注冊。
2. Spring Boot 的自動配置機(jī)制
- Spring Boot 默認(rèn)會自動配置
DispatcherServlet,并將其映射到根路徑 (/)。這是通過DispatcherServletAutoConfiguration類實現(xiàn)的,該類會根據(jù)條件自動創(chuàng)建并注冊DispatcherServlet。 - Spring Boot 默認(rèn)使用嵌入式 Tomcat 作為 Servlet 容器。在啟動時,Spring Boot 會通過
ServletWebServerFactory創(chuàng)建并配置嵌入式 Servlet 容器,同時注冊所有必要的 Servlet。 - 如果需要自定義 Servlet,Spring Boot 提供了
ServletRegistrationBean,可以通過編程方式將 Servlet 注冊到容器中。
@Bean
public ServletRegistrationBean<MyServlet> myServlet() {
return new ServletRegistrationBean<>(new MyServlet(), "/myServlet/*");
}
這種方式無需 web.xml 或注解,完全通過代碼配置。
3、Spring Boot 的 SPI 機(jī)制
Spring Boot 利用 Java 的 SPI(Service Provider Interface)機(jī)制,在啟動時自動加載和初始化相關(guān)組件。
META-INF/spring.factories文件- Spring Boot 通過
spring.factories文件加載自動配置類。 - 例如,
DispatcherServletAutoConfiguration就是通過該文件被加載的。
- Spring Boot 通過
@EnableAutoConfiguration注解- Spring Boot 的啟動類通常帶有
@SpringBootApplication注解,該注解包含了@EnableAutoConfiguration。 @EnableAutoConfiguration會觸發(fā) Spring Boot 的自動配置邏輯,包括 Servlet 的注冊。
- Spring Boot 的啟動類通常帶有
由以上總結(jié)可得出 Spring Boot 通過以下方式實現(xiàn) Servlet 的發(fā)現(xiàn)和解析。
- Servlet 3.0 規(guī)范:利用
ServletContainerInitializer和WebApplicationInitializer動態(tài)注冊 Servlet。 - 自動配置:通過
DispatcherServletAutoConfiguration和ServletWebServerFactory自動配置 Servlet 容器和DispatcherServlet。 - 編程式注冊:通過
ServletRegistrationBean等類以編程方式注冊自定義 Servlet。 - SPI 機(jī)制:通過
spring.factories和@EnableAutoConfiguration加載自動配置類。
這些機(jī)制共同作用,使得 Spring Boot 能夠在沒有 web.xml 和注解的情況下,仍然能夠發(fā)現(xiàn)并解析 Servlet。
到此這篇關(guān)于啟動 Spring 或 Spring Boot 項目需要 Tomcat的原因解析的文章就介紹到這了,更多相關(guān)Spring Boot 項目啟動 Tomcat內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud升級最新Finchley版本的所有坑
這篇文章主要介紹了Spring Cloud升級最新Finchley版本的所有坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
SpringBoot 數(shù)據(jù)存儲實戰(zhàn)指南
Elasticsearch是一個基于Apache Lucene開發(fā)的的搜索服務(wù),提供了一個分布式多用戶能力的全文搜索引擎,本文介紹如何在SpringBoot項目中整合ElasticSearch來完成數(shù)據(jù)的存儲,感興趣的朋友跟隨小編一起看看吧2026-03-03
Javabean簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Javabean簡介,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
java中for循環(huán)執(zhí)行的順序圖文詳析
關(guān)于java的for循環(huán)想必大家非常熟悉,它是java常用的語句之一,這篇文章主要給大家介紹了關(guān)于java中for循環(huán)執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下2021-06-06
認(rèn)識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)
這篇文章主要介紹了認(rèn)識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07
SpringBoot Session共享實現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實現(xiàn)圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01

