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 容器,通過良好定義接口隔離職責,兼具簡單性與擴展性。
| 層 | 選擇 | 核心理由 |
|---|---|---|
| Presentation | JSF | 組件化、事件驅動、Backing Bean 管理、可擴展 UI/渲染/轉換驗證模型、標準規範 |
| Business Logic | Spring POJO | 非分佈式無需 EJB 遠程接口,Spring IOC/AOP/聲明式事務/異常轉換/Hibernate 整合完美支援 POJO 輕量級開發 |
| Integration | Hibernate | O/R Mapping 物件中心方法,高可移植性,優於 JDBC 低級 API 與 Entity Bean 重量級 CMP |
| 挑戰 | 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 標準驗證器 + 自定義驗證器 + 訊息包國際化定制。 |
CatalogDao, UserDao (純業務語義,無 Hibernate 依賴)。HibernateCatalogDaoImpl, HibernateUserDaoImpl (封裝 HQL/Criteria/原生 SQL)。JSF Backing Bean 通過 ServiceLocator (或 Spring DelegatingVariableResolver/SpringBeanFacesELResolver) 從 Spring 容器獲取 Service Bean,完成依賴注入。
完整源碼可從文中鏈接下載。以 Use Case CreateProduct 為例,序列圖展示了從 JSF 頁面提交 → Backing Bean Action → Service → DAO → Hibernate → DB → 返回導航的端到端流程。