首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Servlet 技術全解析:從 CGI 到 Java Web 核心組件的演進與本質

     編輯:Java 綜合教學

動態 Web 技術的演進:從靜態 HTML 到 Servlet

早期 Web 僅能展示靜態 HTML 頁面,內容固定、缺乏交互。隨著業務需求增長,動態頁面技術應運而生——根據用戶、時間、數據庫狀態動態生成內容。早期主流方案是 CGI (Common Gateway Interface),通常用 Perl/C 編寫,每請求啟動一個進程,開銷極大、擴展性差。

Servlet 作為 Java EE 規範核心組件,以「一次編寫,到處運行」的跨平台優勢,配合容器管理生命週期、線程池復用、安全沙箱等特性,徹底改變了服務端開發模式,成為 Java Web 生態的基石。

Servlet 核心定義與運行機制

Servlet 是運行在 Web 容器(如 Tomcat、Jetty)中的 Java 類,實現 javax.servlet.Servlet 接口,由容器實例化、初始化、調用服務方法、銷毀。其核心職責是處理 HTTP 請求/響應,生成動態內容。

生命週期三大階段

  1. 初始化:容器加載類 → 實例化 → 調用 init(ServletConfig),僅執行一次
  2. 服務:每個請求分配線程,調用 service(ServletRequest, ServletResponse),HTTP 請求會分發至 doGet/doPost 等方法
  3. 銷毀:容器關閉或重新部署時調用 destroy(),釋放資源

Servlet 與 CGI 的本質區別

維度 CGI Servlet
進程模型 每請求啟動新進程 容器內線程復用,單實例多線程
性能 進程創建銷毀開銷大 輕量級線程,啟動快、內存共享
平台相關性 依賴操作系統進程機制 純 Java,跨平台
狀態維持 困難,需外部存儲 易於實現 Session、Application 共享
安全性 進程隔離,但配置複雜 Java 安全管理器 + 容器沙箱

核心 API 體系

  • Servlet 接口:定義生命週期方法 init, service, destroy, getServletConfig, getServletInfo
  • GenericServlet:协議無關的抽象實現,簡化開發
  • HttpServlet:HTTP 專用,提供 doGet, doPost, doPut, doDelete 等語義化方法
  • ServletRequest / ServletResponse:封裝請求參數、頭信息、輸入流及響應輸出流、狀態碼、頭設置
  • ServletConfig:單個 Servlet 初始化參數
  • ServletContext:Web 應用全局上下文,資源訪問、屬性共享、日志、RequestDispatcher 轉發/包含

部署描述符 web.xml 與註解配置

傳統 XML 配置

<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>

Servlet 3.0+ 註解配置(推薦)

@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(),釋放容器線程處理耗時操作(如長輪詢、推送),提升吞吐量。

過濾器與監聽器

  • Filter:請求/響應攔截鏈,用於編碼、認證、日志、XSS 防護等橫切關注點
  • Listener:監聽 ServletContext、HttpSession、ServletRequest 生命週期及屬性變更

線程安全警示

Servlet 單實例多線程模型意味著成員變量非線程安全。 請勿在 Servlet 類中定義可變實例字段,請求相關數據應放在方法局部變量或 Request 域中。

現代框架中的 Servlet 角色

Spring MVC 的 DispatcherServlet、Struts2 的 StrutsPrepareAndExecuteFilter 等均本質上是 Servlet/Filter。理解 Servlet 規範有助於深入掌握框架原理、排查疑難雜癥、編寫高性能中間件。

總結

Servlet 作為 Java Web 的基石,以標準化接口、容器托管、線程池復用、豐富的擴展機制,支撐起整個 Java 企業級開發生態。從 CGI 到 Servlet,再到 Spring Boot 內嵌容器簡化部署,技術演進的核心始終是:降低開發複雜度、提升運行效率、增強可擴展性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved