烟消火灭网

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

tomcat是干什么的

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 请求。

访客,请您发表评论:

© 2026. sitemap