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

Servlet 技術全景:核心原理、與 CGI/Applet/JSP 比較與優勢

     編輯:Java 程式設計入門

Servlet 是 Java Web 技術的基石,運行於伺服器端容器中,以執行緒模型處理 HTTP 請求,產生動態回應。本文系統梳理 Servlet 核心架構、生命週期、與 CGI/Applet/JSP 的本質差異,建立正確技術認知。

Servlet 核心定位

  • 平台無關:純 Java 實作,編譯一次,部署於任何支援 Servlet 規範的容器 (Tomcat、Jetty、JBoss、WebLogic、WebSphere)。
  • 協定無關 (理論上):javax.servlet.Servlet 介面定義通用契約,HttpServlet 專為 HTTP 協定特化。
  • 伺服器端元件:無 GUI,生命週期由容器管理 (載入、初始化、服務、銷毀)。
  • 執行緒模型:每個請求一條輕量執行緒,共享單一 Servlet 實例 (單例模式),記憶體效率遠優於 CGI 進程模型。

生命週期:三大關鍵方法

public interface Servlet {
    void init(ServletConfig config) throws ServletException;  // 1. 載入後調用一次
    void service(ServletRequest req, ServletResponse resp)      // 2. 每請求調用
        throws ServletException, IOException;
    void destroy();                                             // 3. 卸載前調用一次
    ServletConfig getServletConfig();
    String getServletInfo();
}

HttpServlet 進一步將 service() 分派為 doGet(), doPost(), doPut(), doDelete() 等對應 HTTP 方法。

深度比較:為什麼 Servlet 取代 CGI?

維度傳統 CGIJava Servlet優勢結論
進程模型每請求 fork 新進程 (重量級)每請求一執行緒 (輕量級),共享 JVMServlet 效能高 10-100 倍
記憶體N 請求 = N 份程式碼載入N 請求 = 1 份類別碼 + N 執行緒棧Servlet 記憶體佔用極低
啟動開銷每請求支付進程啟動成本容器啟動時載入,請求零啟動成本高併發下 CGI 癱瘓,Servlet 穩健
持久連線/連線池極難實現 (進程隔離)自然支援資料庫連線池、快取共享Servlet 適合企業級應用
平台移植C/Perl/Shell 依賴作業系統Write Once, Run AnywhereServlet 移植零成本
開發生產力手工解析 Query String、Header、表單API 內建解析、Session、Cookie、上傳Servlet 開發效率高
投資成本免費但維護成本高免費容器 (Tomcat/Jetty) + 免費工具Servlet 總擁有成本低

Servlet vs Applet:同樣是 Java,卻截然不同

特性AppletServlet
運行位置客戶端瀏覽器 (需 JVM 外掛)伺服器端容器
GUIAWT/Swing 豐富介面無 GUI,純邏輯
安全沙箱嚴格限制 (無本地檔案/網路存取)伺服器端完全信任,存取資源庫
部署HTML <applet> 標籤,客戶端下載類別WAR 部署至容器,客戶端零安裝
現狀已淘汰 (瀏覽器移除 Java 外掛)企業級主流,持續演進 (Jakarta EE)

Servlet vs JSP:互補而非對立

  • JSP 本質:編譯為 Servlet (_jspService()),無新功能,純粹是「HTML 模板 + Java 片段」的語法糖。
  • 分工最佳實踐 (Model 2 / MVC):
    • Servlet (Controller):接收請求、驗證參數、呼叫 Service、決定導向、設定 Model 屬性。
    • JSP (View):純粹渲染 HTML,使用 EL (${...})、JSTL (<c:forEach>) 存取 Model,零 Java 程式碼片段。
    • JavaBean/Entity (Model):封裝業務資料與邏輯。
  • 避免:在 JSP 寫複雜 Java 邏輯 (Scriptlet),在 Servlet 手工拼接 HTML 字串。

Servlet 容器核心服務

  1. 生命週期管理:載入、實例化、初始化、銷毀。
  2. 請求分派:URL 映射 → Servlet 實例 → 執行緒池分配 → service()。
  3. 多執行緒安全:開發者負責確保共享狀態 (實例變數、靜態變數) 的執行緒安全,或使用 ThreadLocal/synchronized/無狀態設計。
  4. 資源注入:@Resource, @EJB, @PersistenceContext 注入 DataSource、EJB、EntityManager。
  5. 安全整合:web.xml / @ServletSecurity 宣告式安全、角色基礎存取控制 (RBAC)。
  6. Session 管理:Cookie/URL 重寫追蹤、叢集 Session 複寫 (容器支援)。

現代演進:Jakarta EE 10 / Servlet 6.0

  • 套件名遷移:javax.servlet.* → jakarta.servlet.*。
  • HTTP/2、WebSocket (jakarta.websocket) 原生整合。
  • 非同步 Servlet (@WebServlet(asyncSupported=true)) + CompletableFuture / Reactive Streams 支援長輪詢、SSE、串流。
  • Multipart 檔案上傳內建 (@MultipartConfig),無需 Commons FileUpload。

總結

Servlet 以 輕量執行緒模型、標準化 API、容器管理服務、平台無關性 徹底解決 CGI 效能與開發痛點,確立 Java 伺服器端統治地位。理解 Servlet 本質,是掌握 Spring MVC、Spring WebFlux、JAX-RS、gRPC-Java 等所有上層框架的前提。現代開發雖少直接寫原生 Servlet,但其核心契約 (Request/Response/Filter/Listener/AsyncContext) 仍貫穿整個 Java Web 技術棧。

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