J2EE (Java EE / Jakarta EE) 企業級開發的基石在於理解**中間件架構**、**容器機制**、**Web 核心組件**與 **HTTP 協議細節**。本文系統梳理中間件/容器/服務器關係、ServletContext 作用域與用法、HTTP Session 機制、GET/POST 差異,構建扎實的 J2EE 基礎知識圖譜。
容器是中間件的具體實現形態,負責管理組件生命週期、提供標準服務介面。
| 容器類型 | 管理組件 | 核心服務 | 交互對象 |
|---|---|---|---|
| Web 容器 (Servlet 容器) | Servlet, JSP, Filter, Listener | 請求/響應處理、生命週期管理、會話管理、安全認證 | HTTP 請求/響應 |
| EJB 容器 | Enterprise JavaBeans (Session/Entity/Message Driven Bean) | 事務管理、安全、遠程訪問、持久化、併發控制、資源池化 | RMI/IIOP、數據庫、JMS、其他服務 |
區別本質:Web 容器面向 HTTP 協議,隔離 HTTP 細節;EJB 容器面向企業級服務(事務、遠程調用、持久化),隔離分布式系統複雜性。
// ServletContextListener 初始化緩存
public class AppInitializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext ctx = sce.getServletContext();
List catalog = productService.loadAll(); // 啟動時查一次庫
ctx.setAttribute("productCatalog", catalog); // 存入上下文
}
}
// Controller 中讀取
@WebServlet("/products")
public class ProductServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
List catalog = (List) getServletContext().getAttribute("productCatalog");
// 直接使用,無需每請求查庫
}
}
分布式部署時,每個 JVM 有獨立 `ServletContext` 實例,**上下文屬性不共享**。跨 JVM 共享需用 Session、資料庫、Redis 或 EJB。
HTTP 1.1 默認**持久連接** 復用 TCP 鏈接傳輸多個請求/響應;**Session 是應用層邏輯概念**,跨越多個 HTTP 請求/響應週期,不依賴單一 TCP 連接。
| 維度 | GET | POST |
|---|---|---|
| 語義 | 獲取資源(冪等、安全) | 提交/修改資源(非冪等) |
| 參數位置 | URL 查詢字串 (`?k=v&k2=v2`) | 請求體 |
| 長度限制 | 受限於瀏覽器/服務器 URL 長度 (~2KB~8KB) | 理論無限制(受限於服務器配置 `maxPostSize`) |
| 緩存 | 可被瀏覽器/CDN/代理緩存 | 默認不緩存 |
| 歷史/書籤 | 參數留在歷史記錄,可收藏書籤 | 參數不在歷史/書籤中 |
| 編碼 | URL 編碼,非 ASCII 必須編碼 | 請求體編碼由 `Content-Type` 指定(如 `application/x-www-form-urlencoded` 或 `multipart/form-data`) |
| 安全性 | 參數暴露在 URL,不適合敏感數據 | 參數在體中,相對隱蔽(仍需 HTTPS) |
| 幂等性 | 是(多次請求無副作用) | 否(多次提交可能重複創建/修改) |
J2EE 基礎架構
├── 中間件/應用服務器 (WebLogic, WebSphere, JBoss, Tomcat*)
│ ├── Web 容器 (Servlet, JSP, Filter, Listener) ← HTTP 交互
│ └── EJB 容器 (EJB) ← 事務/遠程/持久化
├── 核心 API
│ ├── ServletContext (應用級全局共享、資源訪問、初始化參數)
│ ├── HttpSession (用戶級會話狀態、Cookie/URL重寫)
│ ├── ServletRequest/Response (請求響應封裝、參數、屬性、流)
│ └── Filter/Listener (攔截鏈、生命週期監聽)
└── 協議基石
├── HTTP 方法語義 (GET/POST/PUT/DELETE 安全性/冪等性)
├── 狀態碼 (2xx/3xx/4xx/5xx)
├── 標頭 (Cookie, Content-Type, Cache-Control, Authorization)
└── 體格式 (form-data, x-www-form-urlencoded, JSON, XML)
掌握中間件/容器分工、ServletContext/Session 作用域邊界、HTTP 方法語義差異,是構建可擴展、可維護、安全的 Java Web 應用的**必修內功**。建議配合 Servlet 規範文檔與 Tomcat 源碼(`StandardContext`, `StandardSession`, `CoyoteAdapter`)深入理解容器內部運作機制。