tomcat是干什么的

百科 2026-10-17 04:17:36 65

Tomcat 就是一个跑 Java Web 应用的服务器。你写好的 Servlet、JSP,或者打包成 WAR 文件的项目,扔到它指定的目录里,它就能让浏览器通过 HTTP 请求访问到。没有它,你的 Java 代码就只是一堆 .class 文件,别人根本访问不了。

我第一次接触 Tomcat 是在一个后台管理系统项目里。当时写了一个简单的登录页面,用 Servlet 处理表单提交。代码写完了,却不知道怎么让浏览器打开。同事指着 Eclipse 里那个绿色小三角说,启动 Tomcat。几秒后控制台刷出一串日志,浏览器输入 localhost:8080/项目名,页面真的出来了。那一刻我才明白,Tomcat 就是 Java Web 的“插座”——你的应用插上去,它通电,浏览器就能用。

它本质上是一个 Servlet 容器。Servlet 是 Java 定义的一套规范,规定了怎么接收 HTTP 请求、怎么返回响应。Tomcat 实现了这套规范。你写一个类继承 HttpServlet,重写 doGet 或 doPost 方法,Tomcat 就会在收到对应请求时调用你的代码。它负责解析 HTTP 报文、管理会话、处理静态资源,你只管写业务逻辑。

JSP 也是同样道理。JSP 文件看起来像 HTML 里嵌 Java 代码,Tomcat 会把它翻译成 Servlet 的 Java 文件,再编译成 class 执行。第一次访问某个 JSP 会慢一点,就是因为它在做翻译和编译。后面再访问就快了。这个细节很多人没注意,但排查性能问题时很关键。

Tomcat 和 Apache HTTP Server 不是一回事。Apache 是通用的 Web 服务器,擅长处理静态文件、做反向代理。Tomcat 专注 Java 应用。实际部署中常见组合是 Apache 在前面处理图片、CSS、JS,动态请求转发给 Tomcat。当然现在更多用 Nginx 做前端。Tomcat 自己也能处理静态资源,只是性能不如专业 HTTP 服务器。

版本选择上,Tomcat 9 支持 Servlet 4.0,Tomcat 10 换成了 Jakarta EE 命名空间,包名从 javax.servlet 变成 jakarta.servlet。这个改动坑了不少人。老项目升级到 Tomcat 10,所有 import 都得改,否则直接报 ClassNotFoundException。我见过一个团队没注意这点,部署后 404,查了一下午才发现是包名问题。

配置文件主要是 server.xml 和 web.xml。server.xml 里改端口、配虚拟主机、设连接器参数。默认端口 8080,改成 80 就能直接通过域名访问。web.xml 是应用级别的部署描述符,配 Servlet 映射、过滤器、监听器。不过现在注解用得多了,web.xml 反而没那么重要。

启动 Tomcat 就是执行 bin 目录下的 startup.sh 或 startup.bat。Windows 下双击 startup.bat 会弹出一个命令行窗口,关掉窗口服务就停了。生产环境通常注册成系统服务,或者用 systemd 管理。日志在 logs 目录,catalina.out 是主日志,排查问题先看它。

内存调优是绕不开的。默认 JVM 堆内存可能只有 256M,稍微大点的应用就 OutOfMemoryError。在 bin/setenv.sh 里设 JAVA_OPTS,比如 -Xms512m -Xmx1024m。具体设多少看应用规模和服务器配置。设太小频繁 GC,设太大浪费资源,还可能触发 Full GC 停顿。这个需要根据实际监控数据调整。

热部署是个双刃剑。把 WAR 文件丢进 webapps 目录,Tomcat 会自动解压部署。改完代码重新打包丢进去,它也能重新加载。但频繁热部署容易导致内存泄漏,PermGen 或 Metaspace 被占满。开发环境方便,生产环境还是老老实实重启。

Tomcat 轻量、稳定、文档全,中小型 Java Web 项目用它足够了。Spring Boot 内嵌的也是 Tomcat,只是打包成了可执行 JAR。你写 Spring Boot 应用时没感觉到 Tomcat 存在,但它就在那里,默默处理着每一个 HTTP 请求。

本文地址:http://www.79wt.cn/news/1476e9599757.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

友情链接