Tomcat 是最流行的 Servlet 容器。本文提供從 JDK 安裝、Tomcat 部署、Web 應用目錄結構、Servlet/JSP/JavaBean 開發部署到驗證的標準化全流程指南,適用於 Tomcat 5.x 至 10.x 版本。
JAVA_HOME=D:\Java\jdk-17
PATH=%JAVA_HOME%\bin;%PATH%
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
CATALINA_HOME=D:\Java\apache-tomcat-9.0.85
CATALINA_BASE=D:\Java\apache-tomcat-9.0.85
PATH=%CATALINA_HOME%\bin;%PATH%
myapp/ ← Context Root
├── index.jsp ← 歡迎頁
├── WEB-INF/ ← 安全目錄,客戶端不可直接訪問
│ ├── web.xml ← 部署描述符 (Servlet 3.0+ 可選)
│ ├── classes/ ← 編譯後類文件 (包結構)
│ │ └── com/example/
│ │ ├── MyServlet.class
│ │ └── MyBean.class
│ └── lib/ ← 應用專用 jar (不共享)
│ └── ojdbc8.jar
└── static/ ← 靜態資源
├── css/
├── js/
└── images/
文件:`myapp/index.jsp`
<%@ page contentType="text/html; charset=UTF-8" %>
JSP 測試
當前時間: <%= new java.util.Date() %>
`https://localhost:8080/myapp/index.jsp`
文件:`myapp/WEB-INF/classes/com/example/HelloServlet.java`
package com.example;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("Servlet 3.0+ 註解模式測試成功
");
}
}
注意:Tomcat 10+ 使用 `jakarta.servlet.*`,Tomcat 9 及以下用 `javax.servlet.*`
# 進入 WEB-INF/classes 父目錄
javac -cp "$CATALINA_HOME/lib/servlet-api.jar" com/example/HelloServlet.java
# 或使用 Maven/Gradle 管理依賴編譯
HelloServlet
com.example.HelloServlet
HelloServlet
/hello
`https://localhost:8080/myapp/hello`
文件:`myapp/WEB-INF/classes/com/example/UserBean.java`
package com.example;
public class UserBean {
private String name;
private int age;
// 無參構造器 (必要)
public UserBean() {}
// Getter/Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
// 業務方法
public String greet() { return "Hello, " + name + " (age " + age + ")"; }
}
同 Servlet 編譯方式
文件:`myapp/useBean.jsp`
<%@ page contentType="text/html; charset=UTF-8" %>
<%= user.greet() %>
`https://localhost:8080/myapp/useBean.jsp`
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 404 Not Found | Context Path 錯誤、部署未生效、url-pattern 不匹配 | 檢查 `webapps` 目錄、Tomcat 日誌、`web.xml`/`@WebServlet` 映射 |
| 500 Internal Server Error | 類找不到、方法異常、編碼問題 | 查看 `catalina.out`/`localhost. |
| ClassNotFoundException | 類未編譯、包結構錯誤、放錯目錄 | 確認 `WEB-INF/classes/包名/類名.class` 存在 |
| 中文亂碼 | JSP 編碼、請求/響應編碼、資料庫編碼不一致 | 統一 UTF-8:JSP `pageEncoding`、Filter 設定 `request/response` 編碼、DB 連線字串 |
| 修改 JSP 不生效 | 生產環境 `reloadable=false`、JSP 編譯快取 | 開發環境啟用熱部署、清理 `work` 目錄、重啟 Tomcat |
Tomcat 配置核心在於:JDK 基礎 → 容器安裝 → 標準目錄結構 → 類文件正確編譯部署 → 部署描述符/註解映射 → 驗證訪問。掌握此標準流程,可避開 90% 初學者配置坑。現代開發建議:Maven/Gradle 管理構建、Spring Boot 內嵌容器簡化部署、Docker 容器化交付、Kubernetes 編排運維。