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

JSF + Spring + Hibernate 實戰:構建在線產品目錄系統 JCatalog

     編輯:J2EE

專案背景與需求

JCatalog:典型電子商務產品目錄系統。用戶瀏覽/查看產品;管理員登錄後增刪改產品。業務規則:產品 ID 唯一、至少屬於一個分類、ID 創建後不可修改。假設:英文默認語言、產品 <500、目錄低頻變更。

系統架構設計:五層非分佈式架構

Client (Browser)
    ↓
Presentation Layer (JSF: Backing Bean + Facelets/JSP)
    ↓
Business Logic Layer (Spring POJO Services: CatalogService, UserService)
    ↓
Integration Layer (Hibernate DAO: CatalogDao, UserDao)
    ↓
EIS Layer (RDBMS)

所有中間層部署在同一 Web 容器,通過良好定義接口隔離職責,兼具簡單性與擴展性。

技術選型理由

層選擇核心理由
PresentationJSF組件化、事件驅動、Backing Bean 管理、可擴展 UI/渲染/轉換驗證模型、標準規範
Business LogicSpring POJO非分佈式無需 EJB 遠程接口,Spring IOC/AOP/聲明式事務/異常轉換/Hibernate 整合完美支援 POJO 輕量級開發
IntegrationHibernateO/R Mapping 物件中心方法,高可移植性,優於 JDBC 低級 API 與 Entity Bean 重量級 CMP

Presentation 層深度實踐:JSF 關鍵模式

MVC 與 JSF 角色映射

  • Model: Backing Bean (View Object) + Domain Object (Service Layer)。
  • View: JSF 標籤頁面 (JSP/Facelets)。
  • Controller: Faces Servlet (框架內建) + Backing Bean 中的 Action 方法 (委派給 Service)。

Managed Bean vs Backing Bean vs Domain Object

  • Managed Bean: JSF 容器管理的 JavaBean 定義 (faces-config.xml/註解),描述創建/作用域/屬性注入,無業務邏輯。
  • Backing Bean (View Object): 綁定 UI 組件屬性/事件/導航/驗證的處理器,包含視圖專用數據與行為。多頁面可共享同一 Backing Bean (如 Create/Edit 共用 ProductBean)。
  • Domain Object: 業務層核心模型,包含業務數據與邏輯。複雜應用需與 View Object 分離,通過 Builder (Commons BeanUtils) 映射轉換。

核心難點解決方案

挑戰JCatalog 方案
安全認證Servlet Filter (SecurityFilter) 攔截受保護頁面 (硬編碼 3 頁),分離於 JSF 生命週期,最佳實踐。
分頁假設數據量小,全量緩存 SessionScope ProductListBean,Managed Bean 屬性配置分頁參數。
雙級緩存L1: Spring Singleton Service Bean (CachedCatalogServiceImpl) 應用級讀寫緩存。L2: SessionScope ProductListBean 簡化分頁提速,接受數據短暫失效 (低頻變更前提)。
文件上傳JSF RI 不支援,採用 Commons FileUpload + 自定義處理,圖片以產品 ID 命名存文件系統。
驗證與錯誤訊息JSF 標準驗證器 + 自定義驗證器 + 訊息包國際化定制。

Business Logic 層:Spring 核心價值落地

  • IOC 容器管理中間層對象: 消除 Singleton 泛濫,貫徹「面向接口編程」。
  • 聲明式事務管理 (AOP): 無侵入式事務邊界,支援 Hibernate/JTA 多策略,JCatalog 採用 Hibernate 事務管理器。
  • 數據訪問異常層級: 將 SQLException 轉為 Spring DataAccessException 體系 (如 DuplicateKeyException → DuplicateProductIdException),業務層差錯處理。
  • Hibernate 整合: SessionFactory/數據源配置於 ApplicationContext,提供 HibernateTemplate/SessionHolder 安全管理 Session 生命週期,極大簡化 DAO 編碼並利於測試。

Integration 層:Hibernate DAO 模式

  • 接口:CatalogDao, UserDao (純業務語義,無 Hibernate 依賴)。
  • 實現:HibernateCatalogDaoImpl, HibernateUserDaoImpl (封裝 HQL/Criteria/原生 SQL)。
  • Spring 注入實現類,上層服務僅依賴接口,實現 ORM 框架零耦合可替換。

整合啟動:ServiceLocator 橋接 JSF 與 Spring

JSF Backing Bean 通過 ServiceLocator (或 Spring DelegatingVariableResolver/SpringBeanFacesELResolver) 從 Spring 容器獲取 Service Bean,完成依賴注入。

源碼獲取與序列圖演示

完整源碼可從文中鏈接下載。以 Use Case CreateProduct 為例,序列圖展示了從 JSF 頁面提交 → Backing Bean Action → Service → DAO → Hibernate → DB → 返回導航的端到端流程。

總結與啟示

  1. 分層架構 + 接口隔離 是應對複雜性的根本。
  2. JSF 組件模型 極大降低 UI 開發難度,但需妥善處理 View Object 與 Domain Object 映射。
  3. Spring 是粘合劑,將 POJO 服務、事務、異常、ORM、JSF 整合為有機整體。
  4. Hibernate 解放 JDBC 繁瑣,DAO 模式保持持久化邏輯可測試、可替換。
  5. 緩存、安全、文件上傳、分頁 等橫切關注點需在架構層面統一規劃,而非散落在業務代碼中。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved