Servlet 與 JSP 是 Java EE(現 Jakarta EE)Web 開發的雙子星。本文從容器實現機制、生命周期、標簽本質到 MVC 框架演進,梳理核心知識體系,助你建立正確認知。
J2EE 只是規範,servlet-api.jar 由各容器(Tomcat、JBoss、Jetty 等)自行實現,體積差異即是鐵證。開發時必須依賴具體容器提供的 jar 才能編譯運行。
| 組件 | 關鍵階段 | 本質 |
|---|---|---|
| Servlet | init() → service() → destroy() | 容器實例化、初始化、請求分發、銷毀的回調方法 |
| JSP | 請求 → 首次/變更編譯為 Servlet → 裝載 → service() | 本質是 Servlet,首次訪問慢、後續快 |
回調模式:容器只認接口,將組件注入自身並在適當時機調用接口方法,這是學習所有 Java EE 組件(EJB、Filter、Listener 等)的關鍵認知。
JSP 初衷是「前後端分離」:頁面寫 HTML/標簽,業務邏輯交給 Servlet。但其真正遺產是標簽庫(Tag Library):
javax.servlet.jsp.tagext.Tag 接口)+ TLD 配置文件。doStartTag()/doEndTag()。c:if、c:forEach 等讓頁面邏輯標記化,美工無需懂 Java。Struts 1/2、JSF、Spring MVC 等框架本質上都是「封裝更高級標簽 + 提供控制器調度」:
<html:form>、<logic:iterate>(Struts)<h:inputText>、<f:view>(JSF)理解標簽機制,即理解了所有基於 JSP 的框架內核。
HTTP 無狀態指「請求響應結束即斷開連接」。AJAX/Fetch/WebSocket 等技術並未改變這一本質,只是在客戶端發起異步請求或建立長連接。前端框架(React/Vue)將視圖渲染移至瀏覽器,JSP 退居為模板引擎或 API 閘道角色。