Servlet 執行於 Web 容器,無 UI,單實例多執行緒模型賦予其高效能優勢。本文系統梳理 Servlet 類別體系、生命週期、HTTP 方法對應、執行緒安全陷阱,並對比 JSP 適用場景。
Servlet (interface)
↑
GenericServlet (協議無關)
↑
HttpServlet (HTTP 專用) ← 我們繼承的基類
| 方法 | 呼叫時機 | 頻率 |
|---|---|---|
init(ServletConfig) | Servlet 初始化 | 一次 |
service(req, resp) | 每次請求 | 多次 |
destroy() | 容器卸載 Servlet | 一次 |
HttpServlet 的 service() 會依 HTTP 方法分派到 doGet()/doPost()/doPut()/doDelete() 等。
doGet()doPost()doPut()doDelete()doHead() 等(較少用)一般只需覆寫 doGet()/doPost();JBuilder 向導可勾選需產生的方法。
Servlet 預設單實例多執行緒:所有請求共用同一個 Servlet 實例。
原則:除非刻意設計共享狀態,否則不要用成員變數儲存可變資料;必須用時,採用 synchronized、ThreadLocal 或 java.util.concurrent 同步機制。
| 特性 | Servlet | JSP |
|---|---|---|
| 本質 | 含 HTML 的 Java 程式 | 含 Java 的 HTML 網頁 |
| 自動啟動 | ✓ <load-on-startup> | ✗ 首次請求才編譯初始化 |
| 路徑映射 | ✓ 通配符 <url-pattern> | ✗ 單一固定 URI |
| 過濾器/監聽器 | ✓ 原生支援 | ✗ |
| 適合場景 | 業務邏輯重、需預載、框架基礎設施 | 頁面呈現邏輯重、UI 導向 |
<load-on-startup> 完成啟動初始化(載入字典、啟動後台任務)。「業務邏輯重、需預載、做基建 → Servlet;頁面呈現重、UI 導向 → JSP。」