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

Servlet 技術深度解析:Web 伺服器擴展的核心引擎

     編輯:關於JSP
Servlet 是什麼?

Servlet (Server Applet) 是運行在支持 Java 的 Web 伺服器 (或 Servlet 容器) 中的 Java 類,用於擴展伺服器功能,處理客戶端請求並生成動態響應。它是 Java Web 技術的基石,JSP、Spring MVC、Struts 等框架底層皆建立於 Servlet API 之上。

核心架構:容器、線程與生命周期

1. Servlet 容器

  • 角色:管理 Servlet 生命周期、映射 URL 請求至 Servlet、提供運行時環境 (請求/響應對象、Session 管理、安全、資源注入)。
  • 代表產品:Apache Tomcat (最流行,內建 HTTP 伺服器)、Jetty、Undertow (WildFly/JBoss 核心)、GlassFish/Payara、WebLogic、WebSphere。
  • 運行模式:
    • 獨立模式:容器即 Web 伺服器 (如 Tomcat 默認),直接監聽 HTTP 端口。
    • 連接器模式:前端採用 Apache HTTPD / Nginx / IIS 靜態資源/反向代理,動態請求轉發至後端容器 (AJP/HTTP 協議)。

2. 多線程處理模型

「單實例、多線程」 是 Servlet 容器處理併發的核心機制。

  • 容器啟動時,對配置 load-on-startup 的 Servlet 實例化 (或首次請求時)。
  • 同一個 Servlet 類在 JVM 中通常只有一個實例 (單例模式)。
  • 每個客戶端請求到達,容器從線程池分配一個工作線程,調用該實例的 service(request, response) 方法。
  • 請求處理完畢,線程歸還池中。

關鍵含義:

  • 線程安全風險:Servlet 實例變量 (非最終靜態常量) 由所有線程共享,非線程安全。請求相關數據 **必須** 使用局部變量 (方法棧內) 或 ThreadLocal。
  • 高效能**:避免了為每個請求創建進程/實例的開銷,輕量級線程切換支撐高併發。

3. 生命周期三部曲

  1. 初始化 init(ServletConfig config):容器創建實例後調用,**僅一次**。用於載入配置、建立連接池、初始化緩存。拋出 ServletException 標誌初始化失敗。
  2. 服務 service(ServletRequest req, ServletResponse res):每請求調用一次。核心業務邏輯入口。HttpServlet 會根據 HTTP 方法分派至 doGet, doPost 等。
  3. 銷毀 destroy():容器卸載 Servlet 前調用,**僅一次**。釋放資源 (關閉連接池、停止線程、保存狀態)。

Servlet API 核心接口與類

接口/類包描述
Servletjavax.servlet核心接口,定義生命周期方法。
GenericServletjavax.servlet協議無關抽象實現,簡化 init/destroy/log。
HttpServletjavax.servlet.httpHTTP 協議專用,提供 doGet/doPost/doPut/doDelete 等分派。
ServletRequestjavax.servlet客戶端請求信息封裝 (參數、屬性、輸入流)。
HttpServletRequestjavax.servlet.httpHTTP 請求增強 (Header、Cookie、Session、Method、Path)。
ServletResponsejavax.servlet響應輸出封裝 (輸出流、Content-Type、緩衝)。
HttpServletResponsejavax.servlet.httpHTTP 響應增強 (狀態碼、Header、Cookie、重定向)。
ServletContextjavax.servlet**應用級上下文** (全域唯一),資源訪問、初始化參數、屬性共享、日誌、RequestDispatcher。
HttpSessionjavax.servlet.http**會話級上下文**,用戶狀態維持、屬性存取、超時控制。
RequestDispatcherjavax.servlet請求轉發 (forward) 與包含 (include) 核心接口。

Servlet 與 JSP 的協作與演進

早期模式:Model 1 (JSP 單打獨鬥)

JSP 內嵌 Java 代碼 (Scriptlet) 處理業務邏輯、訪問數據庫、生成 HTML。缺點:邏輯與視圖混雜,難維護,Java 開發與前端協作衝突。

經典模式:Model 2 (MVC) - Servlet + JSP

  • Controller (Servlet):接收請求、調用 Service/DAO、決定視圖、設置數據至 Request/Session。
  • Model (JavaBean/POJO/Service/DAO):封裝業務邏輯與數據訪問。
  • View (JSP):純展示邏輯,使用 EL/JSTL 讀取數據渲染 HTML。
// 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); // 轉發
        }
    }
}

現代演進:框架時代 (Spring MVC 等)

框架封裝了 DispatcherServlet 作為前端控制器,開發者編寫 @Controller + @RequestMapping (或 @GetMapping) 的 POJO 處理器,框架負責參數綁定、類型轉換、視圖解析、異常處理。本質仍是 Servlet,但極大提升了開發效率與代碼結構。

Servlet 規範關鍵版本演進

版本年份核心特性對應 JDK
2.52005註解支援 (@WebServlet 尚未標準化,需 web.xml),JSP 2.1JDK 1.5
3.02009註解配置 (@WebServlet, @WebFilter, @WebListener)、異步處理 (startAsync)、模組化部署 (web-fragment.xml)、動態註冊 APIJDK 1.6
3.12013非阻塞 IO (NIO2) 支援、HTTP 升級機制 (WebSocket 基礎)JDK 1.7
4.02017HTTP/2 支援、Jakarta EE 命名空間變更 (javax.servlet -> jakarta.servlet)JDK 1.8
5.0 / 6.02020+Jakarta EE 9/10 規範,移除過時 API,支援 JDK 11+ / 17+JDK 11+

總結

Servlet 是 Java Web 技術的「心臟」。深入理解其單實例多線程模型、生命周期、請求/響應封裝、ServletContext/HttpSession 作用域、轉發與重定向機制、異步處理,不僅是應對面試的必備知識,更是排查線上疑難雜症 (如線程安全 Bug、內存洩漏、請求卡死)、進行架構優化 (如異步 Servlet 提升吞吐、Filter 鏈設計) 的理論基石。無論技術棧如何演進 (Spring Boot, Quarkus, Micronaut),Servlet 規範始終是容器與應用之間的標準契約。

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