Apache Tomcat 是最廣泛使用的 Servlet 容器,實現 Jakarta Servlet、JSP、WebSocket、EL 等規範。本文從下載安裝、目錄結構、啟動驗證、Web 應用部署、JSP 實戰、端口配置、常見問題七個維度,手把手帶你建立生產級開發環境。
# Linux/macOS
tar -zxvf apache-tomcat-10.1.x.tar.gz
mv apache-tomcat-10.1.x /opt/tomcat
# Windows
解壓到 D:\dev\tomcat (路徑無中文、無空格)
# Linux/macOS ~/.bashrc / ~/.zshrc
export CATALINA_HOME=/opt/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
# Windows 系統環境變數
CATALINA_HOME = D:\dev\tomcat
Path 新增 %CATALINA_HOME%\bin
| 目錄/文件 | 用途 |
|---|---|
| `bin/` | 啟動/關閉腳本 (`startup.sh|bat`, `shutdown.sh|bat`)、`catalina.sh` 主控腳本、`setenv.sh` 自定義 JVM 參數 |
| `conf/` | 核心配置:`server.xml` (主配置)、`web.xml` (全局 Servlet 映射)、`context.xml` (Context 默認配置)、`tomcat-users.xml` (管理用戶) |
| `lib/` | 容器共享 JAR:`servlet-api.jar`、`jsp-api.jar`、`websocket-api.jar`、JDBC 驅動建議放這裡 |
| `webapps/` | Web 應用部署目錄:WAR 包自動解壓、目錄部署、ROOT 為根應用 |
| `logs/` | 日誌:`catalina.out/yyy-MM-dd.log` (標準輸出)、`localhost_access_log` (訪問日誌) |
| `work/` | JSP 編譯生成的 Servlet 源碼/類文件、會話序列化持久化 |
| `temp/` | 臨時文件 (上傳文件緩存等) |
# 前台運行 (開發調試推薦,可看控制台輸出)
$CATALINA_HOME/bin/catalina.sh run
# 後台運行
$CATALINA_HOME/bin/startup.sh
https://localhost:8080
# 在 webapps 下創建目錄結構
webapps/
└── myapp/
├── index.html
├── index.jsp
├── WEB-INF/
│ ├── web.xml (可選,Servlet 3.0+ 可全註解)
│ ├── classes/ (編譯後 .class)
│ │ └── com/example/MyServlet.class
│ └── lib/ (項目依賴 JAR)
└── static/
├── css/style.css
└── js/app.js
# Maven 打包
mvn clean package -DskipTests
# 生成 target/myapp.war
# 部署
cp target/myapp.war $CATALINA_HOME/webapps/
# Tomcat 自動解壓到 webapps/myapp/
# $CATALINA_HOME/conf/Catalina/localhost/myapp.xml
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
Hello JSP
當前時間: <%= new java.util.Date() %>
<%-- 表達式輸出 --%>
<%
// Scriptlet: Java 代碼片段 (不推薦大量使用)
String user = "Admin";
%>
歡迎: <%= user %>
訪問次數:
| 對象 | 類型 | 作用域 |
|---|---|---|
| `request` | `HttpServletRequest` | 請求 |
| `response` | `HttpServletResponse` | 響應 |
| `session` | `HttpSession` | 會話 |
| `application` | `ServletContext` | 應用 |
| `out` | `JspWriter` | 頁面 |
| `pageContext` | `PageContext` | 頁面 |
| `config` | `ServletConfig` | Servlet |
| `page` | `Object` (this) | 頁面 |
| `exception` | `Throwable` | 錯誤頁面 |
# Linux/macOS $CATALINA_HOME/bin/setenv.sh
export CATALINA_OPTS="-Xms512m -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
-Dfile.encoding=UTF-8 -Duser.timezone=GMT+08"
# Windows %CATALINA_HOME%\bin\setenv.bat
set CATALINA_OPTS=-Xms512m -Xmx2g ...
example.com
| 現象 | 可能原因 | 排查步驟 |
|---|---|---|
| 啟動報錯 `Address already in use` | 端口被佔用 | `netstat -anp | grep 8080` / 修改 server.xml port |
| 訪問 404 | 路徑錯誤/未部署/Context path 不匹配 | 檢查 webapps 目錄、url-pattern、server.xml Host appBase |
| JSP 修改不生效 | 生產模式 `reloadable="false"` / work 目錄殘留 | 刪除 work 目錄、重啟、Context 設 `reloadable="true"` |
| 中文亂碼 (GET 參數) | Tomcat 8+ 默認 ISO-8859-1 | Connector 加 `URIEncoding="UTF-8"` |
| 中文亂碼 (POST 表單) | 請求編碼未設置 | Filter 統一 `req.setCharacterEncoding("UTF-8")` |
| 類找不到 `ClassNotFoundException` | JAR 缺失/版本衝突/類載入器隔離 | 檢查 WEB-INF/lib、Maven 依賴、lib 目錄共享 JAR |
| 內存溢出 `OutOfMemoryError` | Heap/Metaspace 不足/洩漏 | 調整 `CATALINA_OPTS`、Heap Dump 分析、排查 ThreadLocal/靜態集合洩漏 |
Tomcat 雖非唯一選擇 (Jetty、Undertow、WildFly),但作為 Servlet 規範參考實現,掌握其安裝、部署、配置、調試全流程,是 Java Web 開發者的必修課。從「能跑起來」到「調優穩定跑」,關鍵在於理解 `server.xml` 連接器模型、`web.xml`/`ServletContext` 初始化參數、`Jasper` JSP 編譯機制、`ClassLoader` 隔離體系。下一篇將進階《Tomcat 核心組件架構解析:Connector、Container、Valve、Pipeline 與線程池模型》。