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

Seam 無縫整合 JSF 實戰(二):善用對話上下文簡化狀態管理

     編輯:Java 相關知識

前言:從理論走向實作

系列第一篇介紹了 Seam 如何增強 JSF、實現組件化架構。本文將透過構建 Open 18 高爾夫球場管理應用,實戰展示 Seam 如何簡化 CRUD 開發、自動管理多請求狀態、整合 Hibernate Validator 進行模型驗證,並降低資料庫負載。

應用架構:無狀態分層 + Spring 服務層

Open 18 採用無狀態分層架構,服務層與 DAO 由 Spring 綁定,不依賴 EJB3。Seam 的 Conversation 作用域將有狀態行為引入 POJO 管理 Bean,證明 Seam 可整合任何現有 JSF 應用。

兩個容器的協作:JSF 變數解析器與 Spring

`DelegatingVariableResolver` 串聯 JSF 與 Spring 容器:先查 JSF Managed Bean,失敗再查 Spring `WebApplicationContext`。Seam 作為 JSF 擴展,自然繼承此解析能力(清單 1)。

Seam 上下文組件:註解取代 XML

傳統 JSF 需在 `faces-config.xml` 定義 Managed Bean 與依賴注入(清單 2)。Seam 以註解簡化一切(清單 3):

  • `@Name("courseAction")`:宣告組件名稱,Seam 實例化並暴露
  • `@In("#{courseManager}")`:注入 Spring Bean 或其他上下文變數

配置貼近代碼,新進開發者一目瞭然。

資料庫負載危機與 Seam 解方

傳統 JSF 的 N+1 查詢問題

JSF 生命週期多次呼叫 Getter,若在 `getCourses()` 直接查詢資料庫(清單 5),單頁載入就觸發多次查詢:

Retrieving courses...
Retrieving courses...
Retrieving courses...

臨時快取(清單 6)僅能緩解單請求內重複,跨請求仍失效。

Seam 工廠模式 + Conversation 作用域

Seam 以 `@Factory` 初始化資料,`@DataModel` 自動包裝為 `DataModel` 供 `h:dataTable` 使用(清單 7-8)。視圖直接綁定 `#{courses}`,工廠方法在 Conversation 內僅執行一次:

Retrieving courses...  ← 僅出現一次

流程圖解

Seam 工廠方法初始化 DataModel 流程

  1. 視圖請求 `#{courses}`
  2. JSF 解析器找不到 → Seam 搜尋 `@DataModel` 註解屬性
  3. 實例化 `CourseAction`,檢查屬性為 null
  4. 依屬性名尋找 `@Factory("courses")` → 執行 `findCourses()`
  5. 結果自動包裝為 `DataModel` 並放入上下文
  6. 後續請求直接復用已初始化集合

長效對話:跨請求的狀態管理利器

臨時 vs 長效對話

  • 臨時對話:單請求含重導向,解決 JSF 重導向丟失 `FacesMessage` 問題
  • 長效對話:明確邊界(`@Begin`/`@End`),隔離瀏覽器分頁,避免併發衝突,自動清理

實作課程選擇與詳情顯示

將 `CourseAction` 放入 `@Scope(CONVERSATION)`,`@DataModelSelection` 自動注入被點擊行的實體(清單 9-10)。`@Begin(join=true)` 將臨時對話提升為長效,課程列表跨請求保持可用。`selectCourse()` 重新載入完整實體(含延遲關聯),導航至詳情頁。

雙向資料流:`@Out` 與 `@In`

  • `@Out(value="course", required=false)`:將選中課程推送至視圖
  • `@In(value="course", required=false)`:表單提交時重新捕獲更新後實體

同一屬性同時標註 `@DataModelSelection`、`@In`、`@Out`,Seam 暗中協調雙向綁定(清單 11)。

模型驅動驗證:Hibernate Validator + `s:validateAll`

實體類以註解定義驗證規則(清單 13:`@NotNull`、`@Length`、`@Pattern` 等)。視圖僅需包裝 ``,Seam 整合 Hibernate Validator 於 JSF Process Validation 階段執行驗證(清單 15),視圖零驗證標籤,持久化時再次檢查,雙重保障。

完整 CRUD 實作

  • 新增:`addCourse()` 建立新實體,導向編輯頁
  • 編輯:`editCourse()` 重新載入實體(確保延遲關聯初始化)
  • 儲存:`saveCourse()` 更新快取集合,呼叫服務層持久化,顯示 `FacesMessages`
  • 刪除:`deleteCourse()` 移除實體,清空選擇,顯示確認訊息

完整列表視圖整合所有操作(清單 18),編輯器頁面複用新增/編輯邏輯(清單 15)。

結語與展望

Seam 以註解簡化代碼、Conversation 自動管理狀態、整合 Hibernate Validator 實現模型驗證,是 JSF 的強力擴展而非替代品。可平滑整合無狀態服務層或 EJB3。下集將展示 Seam 的 Ajax Remoting,打造球場與 Google Maps 的 Mashup 應用。

來源:IBM developerWorks

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