Tomcat 到底是什么?一篇文章搞懂 Java Web 的 Tomcat

如果开始学习 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 的技术体系就会顺很多。

相关推荐
vipxieliang1 小时前
ValidX 多租户系统的数据验证方案
java·spring boot
国奉1 小时前
iOS 音频格式转换怎么实现?从 AVAudioFile、AAC、MP3 到 FLAC 与批量转码架构
前端·后端
旺仔不是程序员1 小时前
索引膨胀与重建:PostgreSQL REINDEX 生产实践
数据库·后端·sql
AllFiles1 小时前
K8s Node Exporter 异常 Write 超时排查实录
运维·后端·kubernetes
Thneonl1 小时前
etcd 不只是数据库:K8s 控制面的命脉
后端·kubernetes
SimonKing1 小时前
一个 jar 搞定实时推送:我的轻量级 SSE 中间件 Stream Nexus
java·后端·程序员
the局外人1 小时前
轻松掌握 LangGraph 的状态与节点
后端·langchain·llm
IT_陈寒1 小时前
Vite的静态资源引用把我坑惨了
前端·人工智能·后端
mldong1 小时前
13 套工作流后端共用一个 App 检查更新接口:0 张表,一行 SQL 没写
后端·架构
杨杨杨大侠1 小时前
聊几句就能让 AI 写代码,Spec 还有必要吗?
java·openai·ai编程