Servlet 是JavaEE的一套Web规范接口;
Servlet容器就是实现这套规范的服务器软件,最常见:Tomcat、Jetty、Undertow。
通俗大白话
浏览器发HTTP请求(http://xxx/api/xxx),请求先到达 Servlet容器,容器解析http报文,再把请求交给Spring框架处理;Spring处理完,结果再还给Servlet容器,容器组装成HTTP响应返回浏览器。
Servlet容器 = Web服务器,负责网络层IO、HTTP协议解析;Spring负责业务、Controller、IOC。
SpringBoot两种模式
1️⃣ 内嵌Servlet容器(最常用,我们平时开发)
Spring‑boot‑starter‑web 默认自带 内嵌Tomcat。
你打jar包直接
java -jar就能跑,不用单独装Tomcat软件,就是内嵌Servlet容器。 可选替换:Jetty、Undertow,替换starter即可。
2️⃣ 外部Servlet容器(传统war包部署)
把项目打成war,放到外部独立Tomcat服务器里面运行。此时Tomcat就是外部Servlet容器。
Servlet容器主要职责(核心干什么)
- 监听端口,接收TCP网络请求(比如8080端口) 接收浏览器/客户端发过来的http请求,处理Socket网络通信。
- 解析HTTP协议 把原始http字节流,解析成
HttpServletRequest对象;把Spring返回的数据封装成HttpServletResponse。 Spring MVC 根本不处理TCP、HTTP报文,这活全部交给Servlet容器。 - 管理Servlet、Filter、Listener生命周期 DispatcherServlet本质就是一个Servlet! SpringMVC的入口
DispatcherServlet注册到Servlet容器,容器收到请求,转发给DispatcherServlet,再进入Spring的MVC流程。
javascript
浏览器HTTP请求
↓
Servlet容器(Tomcat) 解析http、socket
↓ 转发请求
DispatcherServlet(SpringMVC的Servlet)
↓
Spring:HandlerMapping → Controller → Service
↓ 返回结果
DispatcherServlet
↓
Servlet容器组装http响应报文
↓
返回浏览器
- 线程池管理:容器开启工作线程,每个http请求分配一条线程执行。
- 处理异常、编码、session管理、文件上传基础能力。
✔分工记忆: Servlet容器:管网络、HTTP协议、Socket; Spring(MVC):管路由、Controller、业务逻辑、IOC容器。
面试常问:Spring IOC容器 和 Servlet容器区别
很多人搞混两个容器:
- Spring IOC容器(Spring容器) :管理所有Bean:Controller、Service、Repository,做依赖注入。属于业务对象容器。
- Servlet容器(Tomcat/Jetty) :web服务器,处理http网络请求。属于web运行环境容器。
SpringBoot启动的时候:先启动Servlet容器(Tomcat),再启动Spring IOC容器;把DispatcherServlet注册进Tomcat,打通两者。
补充关键点
- SpringBoot3 web场景默认就是内嵌Tomcat作为Servlet容器。
- 可以排除tomcat,换成 undertow/jetty作为Servlet容器。
html
<!-- 排除tomcat,使用undertow示例 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‑boot‑starter‑undertow</artifactId>
</dependency>
- 非web项目,没有Servlet容器,IOC容器独立运行。
极简总结
Servlet容器(Tomcat)是http服务器,负责接收、解析网络请求; 它把请求转发给SpringMVC的DispatcherServlet,之后交给Spring IOC容器里面写的Controller、Service执行业务。
SpringBoot Web 完整请求链路
- 客户端浏览器发送 HTTP 请求,到达Tomcat (Servlet 容器) 的 8080 端口;
- Tomcat Connector 接收 socket,解析 http 协议,封装
HttpServletRequest、HttpServletResponse对象; - Tomcat 把请求转发给注册好的 DispatcherServlet(SpringMVC 唯一 Servlet);
- DispatcherServlet 接收请求,调用
HandlerMapping,根据 url 匹配到对应的 Controller 方法; - 通过
HandlerAdapter适配器执行 Controller 方法; - Controller 调用 Service、Dao 完成业务逻辑;
- 方法返回结果,如果是
@RestController,直接封装 ResponseBody;普通页面走 ViewResolver 视图解析; - 结果交还给 DispatcherServlet;
- DispatcherServlet 把结果写入
HttpServletResponse; - Tomcat (Servlet 容器) 组装完整 HTTP 响应报文,通过 Socket 返回浏览器。