学习目标:
- 理解 Tomcat 的定位,并说清它与浏览器、HTTP、Java Web 应用之间的关系
- 掌握 Tomcat 的安装、目录结构、启动与停止流程
- 掌握直接部署、虚拟映射、WAR 包部署三种常见发布方式
- 理解 URL 与本地资源路径之间的映射关系
- 能完成端口、ROOT 应用、欢迎页等基础配置,并处理常见故障
本章重点:
- Tomcat 在 Java Web 体系中的职责
webapps、conf、bin等核心目录的作用- 直接部署、虚拟映射、WAR 包部署的差异与适用场景
server.xml、ROOT、欢迎页、端口配置等高频操作
前置知识准备
- 已理解 HTTP 请求与响应的基本结构
- 已具备基本命令行操作能力
- 已安装 JDK,并知道如何配置
JAVA_HOME
如果你还不熟悉 JSON 和数据交换格式,请先补充学习扩展课《数据交换格式》;本章不再重复展开 JSON 细节,而是聚焦 Tomcat 本身。
一、Tomcat 在 Web 开发中的定位
1.1 什么是服务器
“服务器”通常有两层含义:
| 层面 | 说明 | 例子 |
|---|---|---|
| 软件层面 | 能把本地资源发布到网络中的程序 | Tomcat、Nginx、Apache |
| 硬件层面 | 运行这些服务程序的主机 | 云服务器、机房服务器、本地高性能机器 |
在当前课程语境中,我们重点讨论的是软件层面的服务器。
1.2 什么是 Tomcat
Tomcat 是一个 Java Web 服务器,也可以理解为一个 Java Web 容器。
它的核心职责是:
- 接收浏览器发来的 HTTP 请求
- 找到对应的静态资源或动态资源
- 调用 Java Web 组件处理请求
- 把结果再返回给浏览器
可以用下面这条链路理解:
浏览器 -> HTTP请求 -> Tomcat -> Web资源 / Servlet -> HTTP响应 -> 浏览器1.3 静态资源和动态资源
| 类型 | 特点 | 例子 |
|---|---|---|
| 静态资源 | 内容通常固定,服务器直接读取并返回 | HTML、CSS、JS、图片、字体 |
| 动态资源 | 需要服务器程序参与处理后再生成结果 | Servlet、JSP、接口返回数据 |
Tomcat 既能发布静态资源,也能承载 Java Web 动态资源。
1.4 Tomcat 和 Java Web 的关系
Tomcat 不是普通文件服务器,它更重要的价值在于:
- 能运行符合 Java Web 规范的程序
- 能帮我们统一处理请求分发、资源发布、Web 应用加载等工作
在 Java Web 学习路径中,它的角色大致如下:
HTTP 协议 -> Tomcat -> Servlet -> Request/Response -> 会话技术 -> Web组件 -> MVC也就是说,Tomcat 是后续 Servlet、过滤器、监听器等内容的运行基础。
二、Tomcat 的安装与目录结构
2.1 版本选择建议
| 版本 | Servlet 规范 | JDK 要求 | 适用场景 |
|---|---|---|---|
| Tomcat 9 | Servlet 4.0 | JDK 8+ | 稳定成熟,课程推荐 |
| Tomcat 10 | Servlet 5.0 | JDK 11+ | 新项目或升级项目 |
| Tomcat 10.1 | Servlet 6.0 | JDK 11+ | 追新特性时使用 |
如果你当前是 Java Web 入门阶段,优先选用 Tomcat 9 更稳妥。
2.2 安装步骤
1. 下载与解压
官网:https://tomcat.apache.org/
下载:apache-tomcat-9.0.x.zip
解压:D:\apache-tomcat-9.0.x2. 路径命名要求
Tomcat 安装路径尽量避免:
- 中文
- 空格
- 特殊符号
例如:
❌ C:\Program Files\Tomcat 9
❌ D:\服务器\Tomcat
✅ D:\apache-tomcat-9.0.802.3 环境变量
Tomcat 运行前,至少要保证 JDK 可用。
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_xxx可选配置:
CATALINA_HOME=D:\apache-tomcat-9.0.80其中:
JAVA_HOME用来告诉 Tomcat 去哪里找 JDKCATALINA_HOME用来标识当前 Tomcat 的安装目录
2.4 核心目录结构
apache-tomcat-9.0.80/
├── bin/ # 启动、停止脚本
├── conf/ # 核心配置文件
├── lib/ # 依赖 jar 包
├── logs/ # 日志
├── temp/ # 临时文件
├── webapps/ # 默认部署目录
└── work/ # 运行时生成文件重点目录说明:
| 目录 | 作用 |
|---|---|
bin/ |
放 startup、shutdown 等脚本 |
conf/ |
放 server.xml、web.xml 等配置 |
webapps/ |
默认 Web 应用部署目录 |
logs/ |
启动、运行过程中的日志输出 |
lib/ |
Tomcat 自带依赖库 |
三、Tomcat 的启动、停止与基础排错
3.1 启动方式
Windows
cd D:\apache-tomcat-9.0.80\bin
startup.batLinux / macOS
cd /usr/local/tomcat/bin
./startup.sh对新手来说,直接双击 startup.bat 也可以。
3.2 如何判断启动成功
默认访问地址:
http://localhost:8080能看到 Tomcat 欢迎页,说明启动成功。
3.3 停止方式
| 方式 | 操作 | 说明 |
|---|---|---|
| 标准停止 | shutdown.bat / shutdown.sh |
推荐 |
| 控制台停止 | 在启动窗口按 Ctrl + C |
方便但不够规范 |
| 强制结束 | 关闭进程 | 仅在异常情况下使用 |
3.4 常见问题排查
问题1:启动窗口一闪而过
通常原因是 JAVA_HOME 没配好。
可以先检查:
echo %JAVA_HOME%如果为空,先修复环境变量,再重启 Tomcat。
问题2:8080 端口被占用
常见报错:
Address already in use: bind 0.0.0.0:8080排查方式:
netstat -ano | findstr :8080
taskkill /PID 1234 /F如果不想结束占用进程,也可以改 Tomcat 端口。
问题3:控制台中文乱码
Windows 控制台常见原因是编码不一致。
可以在 conf/logging.properties 中调整:
java.util.logging.ConsoleHandler.encoding = GBK四、Tomcat 部署 Web 应用的三种方式
4.1 三种部署方式总览
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 直接部署 | 简单直接,适合入门 | 位置固定在 webapps |
本地开发、演示 |
| 虚拟映射 | 灵活,项目目录可自定义 | 需要配置 | 开发机、多项目管理 |
| WAR 包部署 | 方便分发,符合发布习惯 | 需要先打包 | 测试、上线发布 |
4.2 直接部署
基本思路
把应用文件夹直接放到 webapps 下。
webapps/
└── myapp/
├── index.html
├── css/
├── js/
└── images/访问方式:
http://localhost:8080/myapp/index.html特点
- 最容易理解
- 最适合教学和本地验证
- 但项目位置必须跟着 Tomcat 走
4.3 虚拟映射
适用场景
项目不想放到 webapps 中,但仍希望通过 Tomcat 访问。
推荐做法是在 conf/Catalina/localhost/ 下添加映射文件。
例如:
<!-- 文件:conf/Catalina/localhost/user1.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\my-projects\app1" />此时:
http://localhost:8080/user1/index.html会映射到:
D:\my-projects\app1\index.html注意点
- 文件名决定访问路径
docBase必须指向目录,而不是单个文件- 这种方式通常比直接改
server.xml更安全
4.4 WAR 包部署
WAR 本质上就是 Web 应用的标准压缩包。
打包后把它放进 webapps/,Tomcat 会自动解压并部署。
jar -cvf myapp.war .部署后通常会看到:
webapps/
├── myapp.war
└── myapp/这种方式更接近实际发布流程。
4.5 理解部署本质:URL 到本地路径的映射
部署问题的核心,实际上就是:
用户访问的 URL
↓
Tomcat 如何解析路径
↓
最终找到本地哪个资源例如:
http://localhost:8080/myapp/index.html直接部署时通常对应:
webapps/myapp/index.html所以部署方式看起来不同,本质上都在解决同一个问题:访问路径如何映射到磁盘路径。
五、Tomcat 的常见配置
5.1 修改端口
默认端口是 8080,配置位置在 conf/server.xml:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />如果改成 80:
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />访问时就可以省略端口:
http://localhost/5.2 配置 ROOT 应用
ROOT 应用就是缺省应用。
方式1:直接部署 ROOT
webapps/ROOT/方式2:配置 ROOT 虚拟映射
conf/Catalina/localhost/ROOT.xml例如:
<Context docBase="D:\test333" />此时访问:
http://localhost:8080/就会直接进入该应用,而不用再写应用名。
5.3 配置欢迎页
欢迎页用于控制“访问目录时默认打开哪个文件”。
配置位置通常在 conf/web.xml:
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>访问逻辑可以理解为:
访问 /myapp/
-> 先找 index.html
-> 再找 index.htm
-> 再找 index.jsp
-> 都没有则 4045.4 一个完整配置场景
需求:通过 http://localhost/ 直接访问 D:\test333 中的资源。
可以分三步:
- 把端口改成 80
- 创建
ROOT.xml,把docBase指向D:\test333 - 配置欢迎页,比如
1.html
这样浏览器访问根路径时,就能直接进入目标资源。
六、Tomcat 使用中的高频问题
6.1 中文资源名乱码
如果访问中文文件名资源时出现乱码或 404,可以在 Connector 中补:
<Connector port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" />6.2 虚拟映射配错路径
错误示例:
<Context docBase="D:\app1\1.png" />正确做法:
<Context docBase="D:\app1" />docBase 指向的是应用目录,不是某一个具体文件。
6.3 外部机器访问不到
常见原因有三个:
- 本机防火墙未放行
- 云服务器安全组未开放端口
- 服务只绑定到本机回环地址
遇到“自己能访问,别人不能访问”时,优先从这三项排查。
七、本章小结
7.1 核心知识点回顾
1. Tomcat 是 Java Web 应用的运行容器
2. webapps 是默认部署目录
3. bin 负责启停,conf 负责配置,logs 负责日志
4. 直接部署最简单,虚拟映射最灵活,WAR 包更接近发布流程
5. URL 访问背后,本质是 Tomcat 做路径映射
6. ROOT、欢迎页、端口配置是最常见的三个基础操作7.2 部署方式选择决策
资源放在哪里?
│
├─ 在 webapps 下 -> 直接部署
│
├─ 不在 webapps 下 -> 虚拟映射
│
└─ 需要分发或上线 -> WAR 包部署7.3 一句话记忆
Tomcat 的学习主线,不是死记命令,而是始终抓住三件事:它是谁、它怎么启动、它如何把 URL 映射到本地应用。
附录:为什么理解手写服务器仍然有价值
虽然实际开发中我们不会自己重写一个完整的 Tomcat,但理解简化版服务器模型,能帮助你真正理解:
- 服务端为什么要监听端口
- 请求到来后为什么先解析请求行和请求头
- 为什么最终一定要构造 HTTP 响应报文
一个极简服务器的核心逻辑可以概括成:
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket client = serverSocket.accept();
// 读取请求
// 找资源
// 写响应
client.close();
}学习建议是:
- 理解原理即可
- 真正做 Web 开发时,优先使用 Tomcat 这类成熟容器