Servlet (Server Applet) 是運行在支持 Java 的 Web 伺服器 (或 Servlet 容器) 中的 Java 類,用於擴展伺服器功能,處理客戶端請求並生成動態響應。它是 Java Web 技術的基石,JSP、Spring MVC、Struts 等框架底層皆建立於 Servlet API 之上。
「單實例、多線程」 是 Servlet 容器處理併發的核心機制。
load-on-startup 的 Servlet 實例化 (或首次請求時)。service(request, response) 方法。關鍵含義:
ThreadLocal。init(ServletConfig config):容器創建實例後調用,**僅一次**。用於載入配置、建立連接池、初始化緩存。拋出 ServletException 標誌初始化失敗。service(ServletRequest req, ServletResponse res):每請求調用一次。核心業務邏輯入口。HttpServlet 會根據 HTTP 方法分派至 doGet, doPost 等。destroy():容器卸載 Servlet 前調用,**僅一次**。釋放資源 (關閉連接池、停止線程、保存狀態)。| 接口/類 | 包 | 描述 |
|---|---|---|
Servlet | javax.servlet | 核心接口,定義生命周期方法。 |
GenericServlet | javax.servlet | 協議無關抽象實現,簡化 init/destroy/log。 |
HttpServlet | javax.servlet.http | HTTP 協議專用,提供 doGet/doPost/doPut/doDelete 等分派。 |
ServletRequest | javax.servlet | 客戶端請求信息封裝 (參數、屬性、輸入流)。 |
HttpServletRequest | javax.servlet.http | HTTP 請求增強 (Header、Cookie、Session、Method、Path)。 |
ServletResponse | javax.servlet | 響應輸出封裝 (輸出流、Content-Type、緩衝)。 |
HttpServletResponse | javax.servlet.http | HTTP 響應增強 (狀態碼、Header、Cookie、重定向)。 |
ServletContext | javax.servlet | **應用級上下文** (全域唯一),資源訪問、初始化參數、屬性共享、日誌、RequestDispatcher。 |
HttpSession | javax.servlet.http | **會話級上下文**,用戶狀態維持、屬性存取、超時控制。 |
RequestDispatcher | javax.servlet | 請求轉發 (forward) 與包含 (include) 核心接口。 |
JSP 內嵌 Java 代碼 (Scriptlet) 處理業務邏輯、訪問數據庫、生成 HTML。缺點:邏輯與視圖混雜,難維護,Java 開發與前端協作衝突。
// Controller Servlet 示例
@WebServlet("/user/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
UserService service = new UserService();
User user = service.login(username, password);
if (user != null) {
req.getSession().setAttribute("loginUser", user); // 存入會話
resp.sendRedirect(req.getContextPath() + "/index.jsp"); // 重定向
} else {
req.setAttribute("error", "用戶名或密碼錯誤");
req.getRequestDispatcher("/login.jsp").forward(req, resp); // 轉發
}
}
}
框架封裝了 DispatcherServlet 作為前端控制器,開發者編寫 @Controller + @RequestMapping (或 @GetMapping) 的 POJO 處理器,框架負責參數綁定、類型轉換、視圖解析、異常處理。本質仍是 Servlet,但極大提升了開發效率與代碼結構。
| 版本 | 年份 | 核心特性 | 對應 JDK |
|---|---|---|---|
| 2.5 | 2005 | 註解支援 (@WebServlet 尚未標準化,需 web.xml),JSP 2.1 | JDK 1.5 |
| 3.0 | 2009 | 註解配置 (@WebServlet, @WebFilter, @WebListener)、異步處理 (startAsync)、模組化部署 (web-fragment.xml)、動態註冊 API | JDK 1.6 |
| 3.1 | 2013 | 非阻塞 IO (NIO2) 支援、HTTP 升級機制 (WebSocket 基礎) | JDK 1.7 |
| 4.0 | 2017 | HTTP/2 支援、Jakarta EE 命名空間變更 (javax.servlet -> jakarta.servlet) | JDK 1.8 |
| 5.0 / 6.0 | 2020+ | Jakarta EE 9/10 規範,移除過時 API,支援 JDK 11+ / 17+ | JDK 11+ |
Servlet 是 Java Web 技術的「心臟」。深入理解其單實例多線程模型、生命周期、請求/響應封裝、ServletContext/HttpSession 作用域、轉發與重定向機制、異步處理,不僅是應對面試的必備知識,更是排查線上疑難雜症 (如線程安全 Bug、內存洩漏、請求卡死)、進行架構優化 (如異步 Servlet 提升吞吐、Filter 鏈設計) 的理論基石。無論技術棧如何演進 (Spring Boot, Quarkus, Micronaut),Servlet 規範始終是容器與應用之間的標準契約。
]]>