本文結合總體架構設計、多層架構理論與 JCatalog 實戰案例,系統闡述 JSF 在表現層的定位、優勢、Managed Bean/Backing Bean/View Object/Domain Model 區分與安全實現策略。
多層架構標準劃分
- 客戶層:數據模型消費與呈現,通常為瀏覽器(瘦客戶端,無表現邏輯)。
- 表現層:暴露業務服務給用戶,處理請求、與業務層交互、選擇下一視圖。
- 業務邏輯層:業務物件與服務,接收請求處理邏輯,受益於安全/事務/資源等系統級服務。
- 集成層:業務層與 EIS(企業資訊系統)間橋梁,封裝數據交互邏輯,有時與業務層合稱中間層。
- EIS 層:數據持久化,含關係/物件資料庫、遺留系統。
JCatalog 架構選型
- 非分散式多層框架:表現層、業務層、集成層同在一 Web 容器,定義良好介面隔離職責,簡單可擴展。
- 表現層選 JSF:成熟、經考驗的 Web 框架,優於自建。
- 業務層用 Spring POJO:無遠程訪問需求,EJB 遠程介面非必需,Spring POJO 輕量靈活。
- 集成層選 Hibernate:對比 Pure JDBC(靈活但笨重)、Entity Bean CMP(昂貴、綁定容器),Hibernate 以物件為中心、輕便、成熟。
JSF 與 MVC:天然契合
- JSF 為服務端 UI 組件框架,含 API(組件狀態、事件、驗證、轉換、導航、國際化、可擴展)與兩個 JSP 自定義標籤庫。
- JSF 完美支援 MVC:Backing Bean = Model(含 Controller 擴展)、JSP 頁面 = View、Faces Servlet = Controller。行為與表現清晰分離,支援熟悉 UI 組件概念,不綁定腳本技術。
為什麼選 JSF?五大差異化優勢
- 像 Swing 一樣的 OO Web 開發:服務端宣告、事件監聽/處理器的 UI 組件模型。
- Backing Bean 管理:組件定義與數據處理物件分離,框架在適當作用域儲存管理實例。
- 可擴展 UI 組件模型:標準組件可配置、重用、繼承開發複雜組件(選單、樹)。
- 靈活表現模型:Renderer 分離功能與視圖,可為同一組件定義 HTML/WML 不同渲染器。
- 可擴展轉換/驗證模型:基於標準 Converter/Validator 開發更強功能。
現狀與不足
JSF 尚不成熟:內建組件/轉換器/驗證器基礎簡單;單組件驗證模型不支援多對多驗證;JSF 標籤與 JSTL 無縫連接不足。
Managed Bean vs Backing Bean vs View Object vs Domain Model
- Managed Bean:JSF 管理的 JavaBean,描述如何創建/管理,與功能無關。
- Backing Bean:定義頁面 UI 組件屬性與處理邏輯(驗證、事件、導航),每頁通常一個,但實戰可共享(如 CreateProduct/EditProduct 共用 ProductBean)。
- View Object:僅表現層使用的模型物件,含顯示數據、驗證、事件處理、業務層交互邏輯。JSF 中 Backing Bean 即 View Object。
- Domain Model:業務物件(BO),屬業務邏輯層,含業務數據與邏輯。複雜應用需與 View Object 分離,透過 Data Mapping(如 Commons BeanUtils 反射)轉換。
對比 Struts:ActionForm(數據)+ Action(邏輯)分離;JSF Backing Bean 數據與行為合一,更符合 OO 設計習慣。
安全實現:Servlet Filter 最佳
JSF 無內建安全。方案比較:
- Backing Bean 基類:簡單但耦合繼承結構。
- ViewHandler 包裝:安全邏輯綁定 JSF 技術。
- Servlet Filter:JSF 應用本質是 Java Web 應用,Filter 處理認證最恰當,安全邏輯不綁定特定 Web 框架。示例應用用
SecurityFilter 硬編碼保護三頁面,建議改為配置文件驅動。