2012-09-13 83 views
4

我一直在考慮這個問題,現在還沒有想出如何在表示層的JSF項目中組織我的bean/classes的最佳實踐。顯然有很多因素起作用,但我想討論一下。這裏是我目前的思路:在JSF中支持Bean組織

考慮一個基本的JSF(仍然堅持在JSF 1.xx這裏不幸)包含一個視圖頁面(查看數據)和一個編輯頁面(添加,更新,刪除數據)。這裏是我會組織項目:

請求範圍BackingBean:

  • 查看相關的東西(保存狀態,繪製邏輯等)。僅在一個請求中需要的東西
  • 動作,動作偵聽器和值更改偵聽器。如果它們適用於多個視圖,則可以將它們分離爲它們自己的文件。

會話範圍BackingBean:

  • 任何需要將保持在超過一個請求。數據庫中的數據,一個SelectItems等
  • 這個bean被注入到請求Bean,任何數據的存儲實例對象

數據對象:

  • 它似乎沒有任何意義使數據對象變成bean,因此它們被分開存儲。這可能是用戶,書籍,汽車以及您要在頁面上顯示的任何對象。所述對象可包含視圖助手方法以及如getFormattedName()等

DAO:

  • 非bean對象處理與業務邏輯層的所有交互。它加載數據bean並準備提交等。我通常將其作爲一類公共靜態方法。

轉換器,驗證:

  • 單獨的文件

這似乎是所有需要在你的平均JSF應用程序。我已閱讀了這個:http://java.dzone.com/articles/making-distinctions-between,以及這裏的答覆:JSF backing bean structure (best practices),但我從來沒有覺得我們有一個完整的圖片。 BalusC的迴應很有幫助,但似乎沒有涵蓋完整的應用程序。讓我知道你的想法!

+1

這不是我是誰回答了這個問題。更重要的是,我個人不同意這個答案。也http://stackoverflow.com/questions/7223055/distinction-between-different-types-of-managed-beans見爲了補充這個答案,你可能會發現下面的答案有幫助:http://stackoverflow.com/questions/ 7031885 /如何選擇正確的bean範圍True,JSF 2.x,但同樣的原則適用於JSF 1.x。 – BalusC

+0

第一個鏈接是我的意思鏈接。儘管如此,我仍然遇到了一些麻煩。如果我理解正確的,你的模型bean是類似我的數據對象,和你說的控制器/託管bean應該是一個豆,類似我backingbean,雖然我以儘量減少會議的數量把它分解成兩個數據。這是否準確? – bhouse

回答

1

我認爲你是在正確的軌道上一般,但是我會做一些不同的事情:

  1. 我把你的DAO層,它分成兩個單獨的層,一個純DAO層,僅僅負責從各種來源獲取數據(例如數據庫調用,Web服務調用,文件讀取等)。那麼我有一個包含快速導入到調用DAO是不針對任何一個JSF視圖業務邏輯層以及任何額外的計算,算法或其他通用業務邏輯。

  2. 在MVC模式,你的ManagedBean起着控制器的作用,因此也應是表示邏輯(特定於操縱視圖或各種視圖組件之間的交互的邏輯)的存儲庫。它也將您的業務邏輯與事件行爲聯繫起來。

  3. 我不會用公共靜態方法爲您的業務邏輯或DAO層。這不適用於自動化單元測試,並阻止您的應用程序使用依賴注入框架(如CDI或Spring)。相反,爲您的BO和DAO創建一個接口,然後爲此創建一個實現類。

  4. 在那個筆記上,使用CDI或Spring之類的依賴注入框架:)它可以讓您自動將Business Logic對象或DAO注入ManagedBeans以及您的單元測試。它也允許你交換實現或DAO,而不需要耦合到應用程序其他層的代碼。

+0

感謝您的回覆!我想我的帖子中可能不太清楚,但我已經把這個項目分成了三層。所以我的文章只是關於表現層。還有一個構建「業務」層的Spring Framework,可以完成數據庫調用和類似的事情。我的「DAO」只是一個基本上需要Business Objects並將它們映射到我的表示層數據對象的類。然後在提交回業務層時採用其他方式。 – bhouse

+0

至於點數2:我同意支持bean應該扮演控制器的角色,而這正是我的要求範圍的bean會做。它也可以像你說的那樣提供視圖操作或交互。 – bhouse

+0

那麼在JSF中究竟扮演着Model的角色呢? –