一、什么是Tomcat?

定义:Tomcat是一个开源的、轻量级的Web容器(也叫Servlet容器),由Apache基金会开发。它的核心作用是:接收浏览器发来的HTTP请求,调用你写的Java代码(Servlet/JSP),然后把结果返回给浏览器

一句话:你在浏览器输入网址,Tomcat接收请求、执行Java程序、返回网页内容。没有它,你的Java代码只能自己跑,没法被外部访问。

为什么需要Web容器?
写Java程序处理HTTP请求,你需要自己监听端口、解析HTTP报文、管理线程、处理并发……Tomcat把这些脏活累活全包了,你只需要专注写业务逻辑(Servlet)。


二、Tomcat的特点

特点 说明
基于Java 跨平台:Windows/Linux/Mac都能跑,只要有JRE
实现了Servlet和JSP规范 遵守Java EE标准,你只要按规范写代码,Tomcat就能自动调用
内置HTTP服务器 不需要额外安装Apache或Nginx,自己就能处理HTTP请求和响应
轻量级 相比商业的WebLogic、WebSphere,Tomcat免费、简单、启动快
支持静态资源 也能放HTML、CSS、图片、JS,但动态处理是它的强项
开源、社区活跃 文档丰富,遇到问题容易找到解决方案

三、Tomcat的核心概念

1. Web容器(Container)

容器 = 一个管理Java类生命周期、分配请求、提供底层服务的环境。
Tomcat实现了Servlet规范,所以也叫Servlet容器

  • 你写一个类继承HttpServlet,Tomcat就能自动调用它的doGet()/doPost()

  • Tomcat负责创建你的Servlet实例、调用它、销毁它。

没有容器时你要自己做:监听端口、解析HTTP报文、反射调用方法、拼响应报文……
有了容器你只需要:写Servlet类、加注解或配置web.xml、启动Tomcat。

2. 连接器(Connector)

Tomcat里有一块叫连接器的组件,专门负责:

  • 监听HTTP端口(默认8080)。

  • 接收HTTP请求报文,解析成Java对象(HttpServletRequest)。

  • 把你要返回的Java对象(HttpServletResponse)转成HTTP响应报文。

连接器 + 容器 = Tomcat的核心架构(很多人称它们为“心脏”)。

3. 部署(Deploy)

把你的Java Web应用放到Tomcat里运行的过程叫部署

最简单的方式:

  • 把你的项目打成.war文件(Web Archive)。

  • 复制到Tomcat的webapps/目录下。

  • 启动Tomcat,它会自动解压并运行。

访问地址:http://localhost:8080/你的项目名/你的路径


四、Tomcat如何处理一个HTTP请求?(对应HTTP的“请求/响应”)

你已经学过了HTTP请求和响应。Tomcat在其中的角色如下表:

步骤 谁在做 说明
1. 浏览器发请求 客户端 GET /myapp/hello HTTP/1.1
2. 接收TCP连接,解析HTTP报文 Tomcat的Connector 把报文变成HttpServletRequest对象
3. 根据URL找到对应的Servlet Tomcat的Container 通过映射(注解或web.xml)定位到你的类
4. 执行业务逻辑 你写的Servlet doGet()/doPost()里写代码
5. 把结果包装成HTTP响应 Tomcat的Connector HttpServletResponse转成响应报文
6. 浏览器收到并渲染 客户端 看到网页

所以:你学HTTP时看的请求行、请求头、状态码,Tomcat内部都会帮你解析和生成。


五、Tomcat的目录结构(看一眼就够)

目录 作用
bin/ 启动/关闭脚本(startup.batshutdown.sh
conf/ 配置文件:server.xml(核心配置,改端口在这)、web.xml(全局默认配置)
lib/ Tomcat运行依赖的JAR包(Servlet API等)
logs/ 日志文件(启动报错、访问日志都在这)
webapps/ 放你的Web应用.war文件或文件夹)
work/ JSP编译后的Servlet文件(不用管)

六、常见配置(修改端口等)

配置项 配置文件 常见修改
端口号 conf/server.xml 把8080改成80(省去输入端口)或改成8081(避免冲突)
是否显示目录列表 conf/web.xml listings 改为 true(调试用,生产环境要关)
虚拟主机 conf/server.xml 添加<Host>,支持多个域名
JVM内存设置 bin/catalina.bat(Windows)或setenv.sh JAVA_OPTS="-Xmx512m"

七、Tomcat vs 其他Web服务器(对比表格)

名称 类型 能做什么 是否免费
Tomcat Web容器(Servlet容器) 运行Java动态Web,也能做静态资源
Jetty 类似Tomcat 更轻量,适合嵌入式
Apache HTTP Server Web服务器 擅长静态文件、反向代理,不能直接跑Java
Nginx Web服务器 高并发、反向代理、负载均衡,不跑Java
WebLogic / WebSphere Java EE容器 全功能(EJB、JMS等),重型企业级 否(收费)

实际开发常见组合:Nginx(前端反向代理) + Tomcat(后端Java应用)。


八、无状态?Tomcat怎么记住用户?

你已经学过HTTP是无状态的。Tomcat提供了内置的Session管理来记住用户:

  • 当第一次请求调用request.getSession()时,Tomcat会创建一个HttpSession对象,并生成一个唯一的JSESSIONID

  • Tomcat通过Cookie(名叫JSESSIONID)把这个id发给浏览器。

  • 浏览器后续请求自动带上这个Cookie,Tomcat根据id找到之前创建的Session对象。

一句话:Tomcat自己实现了基于Cookie+Session的“有状态”能力,让多个HTTP请求之间能共享数据。


九、动手实验(5分钟体验)

实验1:下载并启动Tomcat

  1. 访问 https://tomcat.apache.org,下载Tomcat 9或10(Windows选.zip,Linux/Mac选.tar.gz)。

  2. 解压到任意目录(路径不要有中文或空格)。

  3. 进入 bin/ 目录:

    • Windows:双击 startup.bat

    • Mac/Linux:运行 ./startup.sh

  4. 打开浏览器,访问 http://localhost:8080

    • 看到一只猫的图片和“Tomcat”字样 → 启动成功 ✅

截图保存,这是你跑起的第一个Java Web服务器。

常见问题:

  • 如果双击 startup.bat 后黑窗一闪就关闭,通常是因为没有配置 JAVA_HOME 环境变量。请确认已安装 JDK(不是 JRE),并设置 JAVA_HOME 指向 JDK 目录(例如 C:\Program Files\Java\jdk-17)。

  • 如果 Tomcat 窗口正常启动,但浏览器访问 http://localhost:8080 失败(提示无法连接),可能是端口 8080 被其他程序占用。可以修改 conf/server.xml 中的 8080 为其他端口(如 8888),保存后重启 Tomcat 再试。

实验2:部署一个静态HTML

  1. 在 webapps/ 下新建一个文件夹,比如 myapp

  2. 用记事本写一个 hello.html,内容 <h1>Hello Tomcat!</h1>

  3. 把 hello.html 放进 myapp/ 文件夹。

  4. 访问 http://localhost:8080/myapp/hello.html → 看到大标题。

这证明Tomcat也能当静态文件服务器。

说明:这里的 myapp 就是上下文路径(Context Path),所以访问 URL 是 /myapp/hello.html。
如果你想直接通过 http://localhost:8080/hello.html 访问(不带项目名),可以把 hello.html 放到 webapps/ROOT/ 目录下(ROOT 是 Tomcat 的默认根应用)。

实验3:用F12观察Tomcat的响应头

  1. 启动 Tomcat,访问 http://localhost:8080/examples/(如果下载的 Tomcat 不带 examples 应用,请直接访问 http://localhost:8080/)。

  2. 按F12 → Network → 刷新页面。

  3. 点击第一个请求,看Response Headers:

    • 找到 Server: Apache-Coyote/1.1(表示背后是Tomcat)

    • 找到 Set-Cookie: JSESSIONID=...(Tomcat自动发的Session Cookie)

实验4:关闭Tomcat

在 bin/ 目录下:

  • Windows:双击 shutdown.bat

  • Mac/Linux:运行 ./shutdown.sh
    刷新浏览器会看到“无法连接”。

提示:如果双击 shutdown.bat 后 Tomcat 窗口没有关闭,可以打开命令行,进入 bin 目录,手动执行 catalina.bat stop(Windows)或 ./catalina.sh stop(Mac/Linux)。

实验5:修改端口,体会配置文件的作用

  1. 关闭 Tomcat(确保完全停止)。

  2. 用记事本打开 conf/server.xml,找到下面这行:

    <Connector port="8080" protocol="HTTP/1.1" ... />

  3. 把 8080 改成 8888,保存文件。

  4. 重新启动 Tomcat。

  5. 打开浏览器,访问 http://localhost:8080 → 失败(无法连接)。

  6. 访问 http://localhost:8888 → 成功看到 Tomcat 首页。

  7. (可选)改回 8080,重启后恢复。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐