本系列系統整理 Servlet 開發核心知識。第一部分涵蓋:Servlet 簡介、運行流程、Eclipse 開發步驟、URL 映射規則、與普通 Java 類差異、load-on-startup、預設 Servlet、執行緒安全問題與解決方案。
javax.servlet.Servlet,開發者實作介面並部署到 Web 容器 (Tomcat/Jetty)。init()。HttpServletRequest、HttpServletResponse。service(req, resp)。destroy() 釋放資源。web.xml (Servlet 3.0+ 可改用註解)。<servlet> <servlet-name>Demo</servlet-name> <servlet-class>com.demo.DemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Demo</servlet-name> <url-pattern>/demo</url-pattern> </servlet-mapping>
一個 Servlet 可映射多個 <servlet-mapping> (多重 URL)。
| 模式 | 範例 | 優先級 |
|---|---|---|
| 精確路徑 | /user/profile | 1 (最高) |
| 目錄通配 | /user/* | 2 |
| 副檔名通配 | *.do, *.action | 3 |
| 預設 Servlet | / | 4 (最低) |
匹配原則:「誰最長 (最具體) 誰優先」。
Servlet1 → /abc/* Servlet2 → /* Servlet3 → /abc Servlet4 → *.do 請求 匹配結果 /abc/a.html Servlet1 (目錄通配 > 預設) /abc Servlet3 (精確 > 目錄通配) /abc/a.do Servlet1 (目錄通配 > 副檔名) /a.do Servlet2 (預設 > 副檔名) /xxx/yyy/a.do Servlet2 (預設 > 副檔名)
| 特性 | Servlet | 普通類 |
|---|---|---|
| 啟動方式 | 容器管理 (實例化、初始化、銷毀) | new / 靜態方法 / 反射 |
| 實例數量 | 單例 (預設),多執行緒共享 | 隨開發者控制 |
| 生命週期 | init → service×N → destroy | 建構子 → 方法 → GC |
| 執行緒模型 | 每請求一執行緒,共享實例變數 | 無內建模型 |
| 方案 | 程式碼 | 評價 |
|---|---|---|
| 區域變數 | int count = 0; 在方法內 | ✅ 最佳:天然線程安全、無鎖 |
| synchronized(this) | synchronized(this){count++;} | ❌ 序列化所有請求,吞吐暴跌 |
| AtomicInteger | AtomicInteger count = new AtomicInteger(); | ✅ 適用簡單計數 |
| ThreadLocal | ThreadLocal<Integer> tl = new ThreadLocal<>(); | ⚠️ 隔離執行緒狀態,易洩漏 |
| 無狀態設計 | 狀態外移 Redis/DB/Request 屬性 | ✅ 架構級最佳,支援叢集 |