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

J2EE 基礎核心知識體系:中間件、容器、ServletContext、Session 與 HTTP 協議詳解

     編輯:Java 綜合教學

前言

J2EE (Java EE / Jakarta EE) 企業級開發的基石在於理解**中間件架構**、**容器機制**、**Web 核心組件**與 **HTTP 協議細節**。本文系統梳理中間件/容器/服務器關係、ServletContext 作用域與用法、HTTP Session 機制、GET/POST 差異,構建扎實的 J2EE 基礎知識圖譜。

一、中間件、容器與 Web 服務器:概念辨析

1. 中間件 —— 連接系統與應用的橋樑

  • 定義:位於作業系統與應用程式之間,提供通用企業級服務(事務、消息、連接池、安全、集群)的軟體層。
  • 背景:企業應用中數據庫連接、郵件、事務等通用模塊重複造輪子效率低、可靠性差 → 大廠封裝為中間件服務 → 需統一規範(J2EE 標準)實現互操作。
  • 核心功能:隔離應用與底層 OS/硬體細節,開發者專注業務邏輯。
  • 主流陣營:Microsoft (.NET)、Java (J2EE)、開源 (Tomcat, JBoss, WildFly)。
  • 常見產品:Tomcat (Servlet 容器)、WebLogic、WebSphere、JBoss/WildFly、Apusic。

2. 容器 —— 中間件的核心執行環境

容器是中間件的具體實現形態,負責管理組件生命週期、提供標準服務介面。

容器類型管理組件核心服務交互對象
Web 容器 (Servlet 容器)Servlet, JSP, Filter, Listener請求/響應處理、生命週期管理、會話管理、安全認證HTTP 請求/響應
EJB 容器Enterprise JavaBeans (Session/Entity/Message Driven Bean)事務管理、安全、遠程訪問、持久化、併發控制、資源池化RMI/IIOP、數據庫、JMS、其他服務
區別本質:Web 容器面向 HTTP 協議,隔離 HTTP 細節;EJB 容器面向企業級服務(事務、遠程調用、持久化),隔離分布式系統複雜性。

3. Web 服務器 —— 提供 HTTP 服務的程式

  • 廣義上,Servlet 容器嵌入 Web 服務器功能(如 Tomcat 的 Coyote 連接器)。
  • 常見:大型 (IIS, WebSphere, WebLogic, Apache HTTPD, Tomcat)、輕量級 (Nginx, Lighttpd, Thttpd)。
  • 支持完整 J2EE 的應用服務器:WebSphere, WebLogic, JBoss, Oracle AS, GlassFish 等。

二、ServletContext:Web 應用的全局上下文

1. 核心特性

  • 單例全局:每個 Web 應用僅有一個 `ServletContext` 實例,容器啟動創建、關閉銷毀。
  • 共享數據存儲:所有用戶、所有 Servlet 共享同一上下文,適合存放**只讀、全局、線程安全**的配置/緩存數據(如字典表、系統參數、初始化資源)。
  • 資源訪問:提供 `getResource`, `getResourceAsStream`, `getRealPath` 訪問應用內部資源。
  • 初始化參數:通過 `web.xml` `` 配置,`getInitParameter` 獲取。

2. 典型應用場景:緩存商品目錄

// 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");
        // 直接使用,無需每請求查庫
    }
}

3. 分布式環境注意

分布式部署時,每個 JVM 有獨立 `ServletContext` 實例,**上下文屬性不共享**。跨 JVM 共享需用 Session、資料庫、Redis 或 EJB。

三、HTTP Session:無狀態協議上的有狀態會話

1. 會話特徵

  • 用戶隔離:不同用戶 Session 互不干擾。
  • 生命週期:建立後持續存在,直到用戶超過最大閒置時間或顯式銷毀。
  • 數據攜帶:存儲用戶相關狀態(登錄信息、購物車、權限等)。

2. 機制原理

  1. 客戶端首次請求 → 服務端創建 Session → 生成唯一 `JSESSIONID`。
  2. 服務端通過 `Set-Cookie: JSESSIONID=xxx` 發送給瀏覽器。
  3. 後續請求瀏覽器自動攜帶 Cookie → 服務端根據 ID 找到 Session 對象。
  4. 若禁用 Cookie,需用 **URL 重寫** (`jsessionid=xxx` 附在 URL) 維持會話。

3. HTTP 連接 vs 會話

HTTP 1.1 默認**持久連接** 復用 TCP 鏈接傳輸多個請求/響應;**Session 是應用層邏輯概念**,跨越多個 HTTP 請求/響應週期,不依賴單一 TCP 連接。

四、GET vs POST:不止於參數位置

維度GETPOST
語義獲取資源(冪等、安全)提交/修改資源(非冪等)
參數位置URL 查詢字串 (`?k=v&k2=v2`)請求體
長度限制受限於瀏覽器/服務器 URL 長度 (~2KB~8KB)理論無限制(受限於服務器配置 `maxPostSize`)
緩存可被瀏覽器/CDN/代理緩存默認不緩存
歷史/書籤參數留在歷史記錄,可收藏書籤參數不在歷史/書籤中
編碼URL 編碼,非 ASCII 必須編碼請求體編碼由 `Content-Type` 指定(如 `application/x-www-form-urlencoded` 或 `multipart/form-data`)
安全性參數暴露在 URL,不適合敏感數據參數在體中,相對隱蔽(仍需 HTTPS)
幂等性是(多次請求無副作用)否(多次提交可能重複創建/修改)

關鍵補充

  • GET 請求體:HTTP 規範未禁止 GET 有 Body,但許多服務器/框架忽略,不推薦使用。
  • POST 書籤:無法直接收藏 POST 請求為書籤。
  • 安全:HTTPS 下傳輸層加密,GET 參數在加密通道中同樣安全,但仍可能泄露於服務器日誌、瀏覽器歷史、Referer 標頭,**敏感操作必須用 POST + 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`)深入理解容器內部運作機制。

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