衡阳市网站建设_网站建设公司_Figma_seo优化
2026/1/13 16:02:47 网站建设 项目流程

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!


一、真实场景:你写的接口是怎么被浏览器访问到的?

假设你用 Spring Boot 写了这样一个接口:

@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello World!"; } }

当你启动项目,在浏览器输入http://localhost:8080/hello,页面立刻返回 “Hello World!”。

但你有没有想过:

  • 谁在监听 8080 端口?
  • 谁把 HTTP 请求解析成 Java 对象?
  • 谁调用了你的hello()方法?
  • 谁把返回值转成 HTTP 响应发回浏览器?

👉答案就是:Servlet 容器!


二、Servlet 容器到底是什么?

✅ 定义(通俗版):

Servlet 容器是一个“管家”,专门负责管理 Java Web 应用中的 Servlet 组件,并处理所有 HTTP 请求与响应。

✅ 技术定义(规范层面):

根据Java EE(现 Jakarta EE)规范,Servlet 容器是实现了javax.servlet.Servlet接口生命周期管理的运行环境。它必须支持:

  • 接收 HTTP 请求
  • 创建HttpServletRequestHttpServletResponse对象
  • 调用对应 Servlet 的service()方法
  • 管理 Servlet 的创建、初始化、销毁

三、常见的 Servlet 容器有哪些?

容器类型特点
Apache Tomcat轻量级最流行,Spring Boot 默认内嵌
Jetty轻量级启动快,适合嵌入式场景
Undertow轻量级高性能,WildFly 默认容器
WebLogic / WebSphere重量级支持完整 Java EE,企业级

💡 在 Spring Boot 中,默认使用内嵌 Tomcat作为 Servlet 容器。


四、动手实战:看 Spring Boot 如何依赖 Servlet 容器

1️⃣ 创建一个最简 Spring Boot Web 项目

<!-- pom.xml --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>

🔍 注意:spring-boot-starter-web会自动引入spring-boot-starter-tomcat,而后者包含:

  • tomcat-embed-core
  • tomcat-embed-el
  • tomcat-embed-websocket

这些 JAR 包共同构成了一个可编程的内嵌 Servlet 容器


2️⃣ 验证 Servlet 容器是否生效

写一个简单的 Servlet(非 Controller):

@WebServlet("/myservlet") public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.getWriter().write("Hello from raw Servlet!"); } }

并在主类上启用 Servlet 扫描:

@SpringBootApplication @ServletComponentScan // 启用 @WebServlet 注解扫描 public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

启动后访问:http://localhost:8080/myservlet

✅ 输出:Hello from raw Servlet!

🎯 这说明:Spring Boot 底层确实在运行一个完整的 Servlet 容器,它能识别并执行原生 Servlet!


五、Servlet 容器的核心职责(重点!)

职责说明
1. 网络通信监听端口(如 8080),接收 TCP 连接,解析 HTTP 协议
2. 请求封装将原始 HTTP 请求转为HttpServletRequest对象
3. 响应封装提供HttpServletResponse用于写回数据
4. Servlet 生命周期管理控制init()service()destroy()
5. 线程池管理用线程池处理并发请求(如 Tomcat 的工作线程)
6. Session 管理自动维护用户会话(基于 Cookie 或 URL 重写)
7. 安全与过滤支持 Filter 链(如 Spring Security 底层依赖)

⚠️ 没有 Servlet 容器,你的@RestController只是一堆无法被调用的普通 Java 类!


六、反例警告 ❌ —— 新手常见误区

❌ 反例1:以为 Spring Boot 不需要 Servlet 容器

// 错误认知:“我只用了 Spring,没用 Servlet” @RestController public class TestController { @GetMapping("/test") public String test() { return "OK"; } }

💥 事实:@RestController本质是@Controller + @ResponseBody,而 Spring MVC 的底层DispatcherServlet就是一个标准的 Servlet!它由 Servlet 容器调用。


❌ 反例2:试图在非 Web 环境中启动 Web 功能

// 错误配置:缺少 web starter <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <!-- 没有 -web --> </dependency>

启动时你会发现:

  • 项目以REACTIVENONE模式运行
  • 无法绑定 8080 端口
  • 访问/hello返回连接拒绝

✅ 正确做法:必须引入spring-boot-starter-web(或webflux)才能获得 Servlet 容器。


❌ 反例3:手动管理 HTTP 连接(重复造轮子)

有些初学者尝试用ServerSocket自己写 HTTP 服务器:

// 千万别这么干! ServerSocket server = new ServerSocket(8080); while (true) { Socket socket = server.accept(); // 手动解析 HTTP 请求... }

⚠️ 问题:你要自己处理协议解析、多线程、Keep-Alive、Chunked 编码……极易出错且性能差。

Servlet 容器已经帮你做好了这一切!


七、如何查看当前使用的 Servlet 容器?

在 Spring Boot 启动日志中,你会看到类似:

Tomcat initialized with port(s): 8080 (http) Tomcat started on port(s): 8080 (http)

或者通过代码检测:

@RestController public class InfoController { @Autowired private ServletContext servletContext; @GetMapping("/container") public String getContainerInfo() { return "Servlet Container: " + servletContext.getServerInfo(); } }

访问/container,输出:

Servlet Container: Apache Tomcat/10.1.15

八、总结:一句话记住 Servlet 容器

Servlet 容器 = Web 服务器(HTTP 通信) + Servlet 生命周期管家 + 并发执行引擎

没有它,Java Web 应用根本无法对外提供服务!


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询