早期 Web 僅能展示靜態 HTML 頁面,內容固定、缺乏交互。隨著業務需求增長,動態頁面技術應運而生——根據用戶、時間、數據庫狀態動態生成內容。早期主流方案是 CGI (Common Gateway Interface),通常用 Perl/C 編寫,每請求啟動一個進程,開銷極大、擴展性差。
Servlet 作為 Java EE 規範核心組件,以「一次編寫,到處運行」的跨平台優勢,配合容器管理生命週期、線程池復用、安全沙箱等特性,徹底改變了服務端開發模式,成為 Java Web 生態的基石。
Servlet 是運行在 Web 容器(如 Tomcat、Jetty)中的 Java 類,實現
javax.servlet.Servlet接口,由容器實例化、初始化、調用服務方法、銷毀。其核心職責是處理 HTTP 請求/響應,生成動態內容。
init(ServletConfig),僅執行一次service(ServletRequest, ServletResponse),HTTP 請求會分發至 doGet/doPost 等方法destroy(),釋放資源| 維度 | CGI | Servlet |
|---|---|---|
| 進程模型 | 每請求啟動新進程 | 容器內線程復用,單實例多線程 |
| 性能 | 進程創建銷毀開銷大 | 輕量級線程,啟動快、內存共享 |
| 平台相關性 | 依賴操作系統進程機制 | 純 Java,跨平台 |
| 狀態維持 | 困難,需外部存儲 | 易於實現 Session、Application 共享 |
| 安全性 | 進程隔離,但配置複雜 | Java 安全管理器 + 容器沙箱 |
init, service, destroy, getServletConfig, getServletInfodoGet, doPost, doPut, doDelete 等語義化方法<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<init-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/config.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
@WebServlet(
name = "MyServlet",
urlPatterns = {"/api/*"},
initParams = {@WebInitParam(name = "configPath", value = "/WEB-INF/config.properties")},
loadOnStartup = 1,
asyncSupported = true // 支持異步處理
)
public class MyServlet extends HttpServlet {
// 實現 doGet/doPost 等方法
}
Servlet 3.0 引入 startAsync(),釋放容器線程處理耗時操作(如長輪詢、推送),提升吞吐量。
Servlet 單實例多線程模型意味著成員變量非線程安全。 請勿在 Servlet 類中定義可變實例字段,請求相關數據應放在方法局部變量或 Request 域中。
Spring MVC 的 DispatcherServlet、Struts2 的 StrutsPrepareAndExecuteFilter 等均本質上是 Servlet/Filter。理解 Servlet 規範有助於深入掌握框架原理、排查疑難雜癥、編寫高性能中間件。
Servlet 作為 Java Web 的基石,以標準化接口、容器托管、線程池復用、豐富的擴展機制,支撐起整個 Java 企業級開發生態。從 CGI 到 Servlet,再到 Spring Boot 內嵌容器簡化部署,技術演進的核心始終是:降低開發複雜度、提升運行效率、增強可擴展性。