系列第一篇介紹了 Seam 如何增強 JSF、實現組件化架構。本文將透過構建 Open 18 高爾夫球場管理應用,實戰展示 Seam 如何簡化 CRUD 開發、自動管理多請求狀態、整合 Hibernate Validator 進行模型驗證,並降低資料庫負載。
Open 18 採用無狀態分層架構,服務層與 DAO 由 Spring 綁定,不依賴 EJB3。Seam 的 Conversation 作用域將有狀態行為引入 POJO 管理 Bean,證明 Seam 可整合任何現有 JSF 應用。
`DelegatingVariableResolver` 串聯 JSF 與 Spring 容器:先查 JSF Managed Bean,失敗再查 Spring `WebApplicationContext`。Seam 作為 JSF 擴展,自然繼承此解析能力(清單 1)。
傳統 JSF 需在 `faces-config.xml` 定義 Managed Bean 與依賴注入(清單 2)。Seam 以註解簡化一切(清單 3):
配置貼近代碼,新進開發者一目瞭然。
JSF 生命週期多次呼叫 Getter,若在 `getCourses()` 直接查詢資料庫(清單 5),單頁載入就觸發多次查詢:
Retrieving courses... Retrieving courses... Retrieving courses...
臨時快取(清單 6)僅能緩解單請求內重複,跨請求仍失效。
Seam 以 `@Factory` 初始化資料,`@DataModel` 自動包裝為 `DataModel` 供 `h:dataTable` 使用(清單 7-8)。視圖直接綁定 `#{courses}`,工廠方法在 Conversation 內僅執行一次:
Retrieving courses... ← 僅出現一次

將 `CourseAction` 放入 `@Scope(CONVERSATION)`,`@DataModelSelection` 自動注入被點擊行的實體(清單 9-10)。`@Begin(join=true)` 將臨時對話提升為長效,課程列表跨請求保持可用。`selectCourse()` 重新載入完整實體(含延遲關聯),導航至詳情頁。
同一屬性同時標註 `@DataModelSelection`、`@In`、`@Out`,Seam 暗中協調雙向綁定(清單 11)。
實體類以註解定義驗證規則(清單 13:`@NotNull`、`@Length`、`@Pattern` 等)。視圖僅需包裝 `
完整列表視圖整合所有操作(清單 18),編輯器頁面複用新增/編輯邏輯(清單 15)。
Seam 以註解簡化代碼、Conversation 自動管理狀態、整合 Hibernate Validator 實現模型驗證,是 JSF 的強力擴展而非替代品。可平滑整合無狀態服務層或 EJB3。下集將展示 Seam 的 Ajax Remoting,打造球場與 Google Maps 的 Mashup 應用。