Servlet 是運行在 Web 容器 (如 Tomcat、Jetty) 中的 Java 組件,由容器負責實例化、初始化、請求分發、銷毀。相比傳統 CGI (進程級、性能差、開發繁瑣),Servlet 具備:
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>web.xml 或註解開發。init(ServletConfig):初始化,僅調用一次,載入配置、建立連接池等昂貴資源。service(ServletRequest, ServletResponse):核心請求處理入口,每請求一線程調用。destroy():銷毀前釋放資源 (關閉連接池、線程池、緩存)。getServletConfig()、getServletInfo()。getInitParameter()、getServletContext()、log() 等便利方法。HttpServlet,而非直接繼承 GenericServlet。service():根據 HTTP Method 分發至 doGet、doPost、doPut、doDelete、doHead、doOptions、doTrace。HttpServletRequest (請求數據、Header、Session、屬性)、HttpServletResponse (狀態碼、Header、輸出流、Cookie)。getRequestDispatcher() 轉發/包含、sendRedirect() 重定向。request.getSession() 獲取/創建會話,服務端存儲狀態 (購物車、用戶身份)。Cookie 類:new Cookie(name, value)、setMaxAge(sec)、setPath()、setHttpOnly(true) 防 XSS、setSecure(true) 僅 HTTPS 傳輸。response.addCookie(cookie);請求中讀取:request.getCookies()。| 配置項 | web.xml (傳統) | 註解 (現代) |
|---|---|---|
| Servlet 註冊 | <servlet><servlet-class>...</servlet> | @WebServlet("/url") |
| URL 映射 | <servlet-mapping>...</servlet-mapping> | @WebServlet(urlPatterns={"/a","/b"}) |
| 初始化參數 | <init-param>...</init-param> | @WebInitParam(name="k", value="v") |
| 加載順序 | <load-on-startup>1</load-on-startup> | @WebServlet(loadOnStartup=1) |
| Filter/Listener | <filter>...</filter> | @WebFilter / @WebListener |
建議:新項目全面採用註解開發,web.xml 僅用於容器級全局配置 (如 JNDI 數據源、安全約束、錯誤頁面)。
ThreadLocal。init() 初始化連接池/線程池,destroy() 確保關閉,防止內存洩漏。error-page),返回友好錯誤頁/JSON,記錄完整堆棧。setContentType("application/json;charset=UTF-8")、setCharacterEncoding("UTF-8")。request.startAsync() 釋放容器線程,提升吞吐量。Spring MVC 的核心 DispatcherServlet 本質是一個 HttpServlet,封裝了參數綁定、視圖解析、異常處理、攔截器鏈等企業級功能。理解 Servlet 原理有助於深度掌握 Spring MVC 運行機制、排查疑難雜症、編寫高性能 Filter/Interceptor。