如果开始学习 Java Web,Tomcat 基本是绕不开的一个东西。很多教程都会告诉你,把项目部署到 Tomcat 上就可以运行,但第一次接触的时候,很多人其实并不知道 Tomcat 到底是什么。
简单来说,**Tomcat 是一个 Java Web 服务器,同时也是一个 Servlet 容器。**它最核心的工作,就是接收浏览器发送过来的 HTTP 请求,然后找到对应的 Java Web 程序进行处理,最后把处理结果返回给浏览器。
一、浏览器访问 Java Web 项目发生了什么?
假设我们访问:
bash
http://localhost:8080/hello
浏览器会向 8080 端口发送一个 HTTP 请求。Tomcat 接收到请求之后,会根据请求路径找到对应的 Servlet,然后调用 Servlet 中的代码进行处理,最后把响应返回给浏览器。
整个过程可以简单理解成:浏览器发送 HTTP 请求,Tomcat 接收请求,然后找到对应的 Servlet,Servlet 执行业务代码,最后 Tomcat 将 HTTP 响应返回给浏览器。
所以从这个角度来看,Tomcat 就是 Java Web 应用和 HTTP 请求之间的一个桥梁。
二、什么是 Servlet?
理解 Tomcat,Servlet 是一个绕不过去的概念。
Servlet 可以简单理解为运行在服务器上的 Java 程序,专门负责处理客户端请求。例如我们定义一个 /hello 接口,当浏览器访问这个地址时,Tomcat 会找到对应的 Servlet,然后执行里面的代码。
scala
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.getWriter().write("Hello World");
}
}
当用户访问 /hello 时,Tomcat 并不是自己去执行这些业务代码,而是负责找到 HelloServlet,然后调用它。
也就是说,Tomcat 更像是一个运行环境,它负责管理 Servlet 的生命周期、接收请求、分发请求以及返回响应。这也是为什么 Tomcat 被称为 Servlet 容器。
三、Tomcat 和 Spring Boot 是什么关系?
以前开发 Java Web 项目,经常需要把项目打包成 WAR 文件,然后部署到 Tomcat 中。Tomcat 启动之后,会加载这个 WAR 包,创建对应的 Web 应用环境,之后浏览器就可以通过 HTTP 请求访问里面的 Servlet。
但是现在使用 Spring Boot,情况发生了变化。Spring Boot 通常会把 Tomcat 直接内嵌到项目中。
比如添加 spring-boot-starter-web 之后,我们启动 Spring Boot 项目:
java -jar app.jar
项目就可以直接运行,并且默认监听 8080 端口。
这并不是说 Spring Boot 不需要 Tomcat 了,而是 Tomcat 已经被放进 Spring Boot 应用里面了。
所以以前可能是:
Tomcat + Java Web 项目
现在更多时候是:
markdown
Spring Boot
↓
内嵌 Tomcat
↓
Spring MVC
↓
Controller
四、Tomcat 到底做了什么?
假设我们在 Spring Boot 中写了一个接口:
kotlin
@RestController
public class UserController {
@GetMapping("/users")
public String users() {
return "users";
}
}
当浏览器访问 /users 时,请求首先会到达 Tomcat,然后进入 Servlet 体系,再进入 Spring MVC。Spring MVC 找到对应的 Controller,执行我们的业务代码,最后把结果交给 Tomcat,由 Tomcat 返回 HTTP 响应。
所以整个过程可以简单理解为:
浏览器
↓
HTTP 请求
↓
Tomcat
↓
Servlet
↓
Spring MVC
↓
Controller
↓
业务代码
↓
HTTP 响应
↓
浏览器
这样再看 @RestController、@GetMapping 这些 Spring 注解,就不会觉得它们是凭空出现的。它们背后依然建立在 Java Web 的 Servlet 模型之上。
五、Tomcat 的核心组件
Tomcat 内部其实有很多组件,比如 Connector、Engine、Host、Context、Wrapper 等。刚开始学习的时候没必要马上去研究源码,先理解两个最重要的概念:Connector 和 Container。
Connector 主要负责网络通信,它监听端口、接收 HTTP 请求并解析请求;Container 则负责处理这些请求,找到对应的 Web 应用和 Servlet。
可以简单记成一句话:
Connector 负责把请求接进来,Container 负责把请求处理掉。
Tomcat 默认使用 8080 端口,所以我们经常看到:
arduino
http://localhost:8080
这里的 8080 并不是 HTTP 固定使用的端口,只是 Tomcat 默认的配置,实际项目中完全可以修改成其他端口。
六、Tomcat 和 Nginx 有什么区别?
Tomcat 和 Nginx 都可以处理 HTTP 请求,但它们解决的问题并不完全一样。
Nginx 更擅长反向代理、负载均衡、静态资源处理等工作,而 Tomcat 更关注 Java Web 应用本身。
所以在传统 Java Web 架构中,经常会看到这样的结构:
用户
↓
Nginx
↓
Tomcat
↓
Java Web 应用
↓
MySQL
用户访问网站时,请求首先到达 Nginx,Nginx 再把请求转发给 Tomcat,Tomcat 最后交给 Java Web 应用处理。
当然,现在很多 Spring Boot 项目也可以直接对外提供 HTTP 服务,不一定非要在前面放 Nginx,这取决于具体的部署架构。
七、Tomcat、JVM 和 Java Web 应用是什么关系?
这三个概念也很容易混淆。
JVM 是运行 Java 程序的虚拟机,Tomcat 本身就是一个运行在 JVM 上的 Java 程序,而 Java Web 应用则运行在 Tomcat 提供的 Web 容器环境中。
可以简单理解成:
操作系统
↓
JVM
↓
Tomcat
↓
Java Web 应用
所以 Tomcat 不是 JVM,它本身也是一个 Java 程序,只不过这个程序专门提供了 Web 应用运行所需要的环境。
八、现在还需要学习 Tomcat 吗?
如果现在主要学习 Spring Boot,可能会觉得:"我直接 java -jar 启动项目就行了,为什么还要学习 Tomcat?"
实际上,Spring Boot 只是把很多底层细节隐藏起来了。你虽然不需要手动安装 Tomcat、配置 WAR 包,但项目运行的时候,Tomcat 依然可能在背后工作。
理解 Tomcat,可以帮助我们把 Java Web 的整个技术链路串起来:
HTTP
↓
Tomcat
↓
Servlet
↓
Spring MVC
↓
Controller
↓
Service
↓
数据库
以后学习 Servlet、Filter、Spring MVC、Spring Boot,甚至研究 Web 请求的底层处理过程时,这些知识都会再次出现。
总结
Tomcat 本质上就是一个运行在 JVM 上的 Java Web 服务器和 Servlet 容器。它负责接收 HTTP 请求,并把请求交给对应的 Servlet 或 Web 应用处理,然后将处理结果返回给客户端。
对于现在的 Spring Boot 开发来说,Tomcat 很多时候已经被隐藏在框架内部,但它并没有消失。理解 Tomcat,其实就是在理解 Java Web 请求到底是怎么进入我们的代码的。
把这一层理解清楚之后,再去学习 Spring MVC 和 Spring Boot,整个 Java Web 的技术体系就会顺很多。