[英]Making Distinctions Between Different Kinds of JSF Managed-Beans
我最近閱讀了Neil Griffin的《區分不同類型的JSF托管豆》中的這篇文章,這讓我開始思考自己的應用程序中不同bean之間的區別。 快速總結要點:
Model Managed-Bean:這種類型的Managed-Bean參與MVC設計模式的“模型”關注。 當您看到“模型”一詞時,請考慮一下數據。 JSF模型bean應該是遵循JavaBean設計模式且具有getters / setter封裝屬性的POJO。
支持Managed-Bean:這種類型的Managed-Bean參與MVC設計模式的“視圖”關注。 支持bean的目的是支持UI邏輯,並且與JSF視圖或Facelet組合中的JSF表單具有1 :: 1的關系。 盡管它通常具有帶有關聯的getter / setter的JavaBean樣式的屬性,但它們是View的屬性,而不是基礎應用程序數據模型的屬性。 JSF支持bean也可以具有JSF actionListener和valueChangeListener方法。
Controller Managed-Bean:這種類型的Managed Bean參與了MVC設計模式的“ Controller”關注。 控制器bean的目的是執行某種業務邏輯並將導航結果返回給JSF導航處理程序。 JSF控制器bean通常具有JSF動作方法(而不是actionListener方法)。
支持托管的Bean:這種類型的Bean在MVC設計模式的“視圖”方面“支持”一個或多個視圖。 典型的用例是向JSF h:selectOneMenu下拉列表提供一個ArrayList,這些列表出現在多個JSF視圖中。 如果下拉列表中的數據特定於用戶,則Bean將保留在會話范圍內。
實用程序托管Bean:這種類型的Bean為一個或多個JSF視圖提供某種“實用程序”功能。 一個很好的例子就是FileUpload bean,它可以在多個Web應用程序中重用。
這對我來說很有意義,在過去的幾個小時中,我一直在重構代碼,並針對用戶登錄提出了以下建議:
AuthenticationController
是控制器受管Bean的示例。 它是請求范圍的,具有兩個用於設置用戶名和密碼的getter和setter,以及兩個導航方法( authenticate
和logout
,可在成功登錄后將用戶導航到其專用區域,或在logout
時導航到主頁。
UserBean
是Support Managed-Bean的示例。 它是會話作用域的,具有User
類的實例(如果未通過身份驗證,則為null),該實例具有getter和setter,僅此而已。
AuthenticationController
將此用戶作為托管屬性( @ManagedProperty(value = "#{userController.user} private User user;
)。)身份AuthenticationController
成功后, AuthenticationController
會將Managed屬性設置為實際用戶實例,並使用相應的用戶名用於登錄。
如果User
類具有包含組名的列表,則任何新bean都將能夠將用戶作為托管屬性,並提取所需的數據,例如組成員身份。
這樣就可以解決關注點分離問題嗎?
這是一個非常主觀的問題。 我個人不同意該文章,並發現它給初學者提供了非常不好的建議。
Model Managed-Bean:這種類型的Managed-Bean參與MVC設計模式的“模型”關注。 當您看到“模型”一詞時,請考慮一下數據。 JSF模型bean應該是遵循JavaBean設計模式且具有getters / setter封裝屬性的POJO。
我絕對不會制造或稱其為托管bean。 只需將其設置為@ManagedBean
的屬性即可。 例如DTO或JPA @Entity
。
支持Managed-Bean:這種類型的Managed-Bean參與MVC設計模式的“視圖”關注。 支持bean的目的是支持UI邏輯,並且與JSF視圖或Facelet組合中的JSF表單具有1 :: 1的關系。 盡管它通常具有帶有關聯的getter / setter的JavaBean樣式的屬性,但它們是View的屬性,而不是基礎應用程序數據模型的屬性。 JSF支持bean也可以具有JSF actionListener和valueChangeListener方法。
這樣,您就可以重復復制和映射托管Bean中實體的屬性。 這對我來說毫無意義。 如前所述,只需將實體設置為托管bean的屬性,然后讓輸入字段像#{authenticator.user.name}
而不是#{authenticator.username}
一樣直接引用它即可。
Controller Managed-Bean:這種類型的Managed Bean參與了MVC設計模式的“ Controller”關注。 控制器bean的目的是執行某種業務邏輯並將導航結果返回給JSF導航處理程序。 JSF控制器bean通常具有JSF動作方法(而不是actionListener方法)。
這幾乎描述了@RequestScoped
/ @ViewScoped
@ManagedBean
類。 是否允許使用事件偵聽器方法取決於它們是否特定於綁定到Bean的視圖和/或用於其工作的方式取決於Bean的狀態。 如果它們是,則它們屬於bean。 如果不是,那么它們應該是任何FacesListener
接口的獨立實現,但絕對不是托管Bean。
支持托管的Bean:這種類型的Bean在MVC設計模式的“視圖”方面“支持”一個或多個視圖。 典型的用例是向JSF h:selectOneMenu下拉列表提供一個ArrayList,這些列表出現在多個JSF視圖中。 如果下拉列表中的數據特定於用戶,則Bean將保留在會話范圍內。
精細。 對於應用程序范圍的數據(如下拉列表),只需使用@ApplicationScoped
bean;對於會話范圍的數據,如登錄的用戶及其首選項,只需使用@SessionScoped
。
實用程序托管Bean:這種類型的Bean為一個或多個JSF視圖提供某種“實用程序”功能。 一個很好的例子就是FileUpload bean,它可以在多個Web應用程序中重用。
這對我來說真的沒有意義。 支持bean通常綁定到單個視圖。 這聽起來太像一個ActionListener
實現,供您選擇的命令組件中的<f:actionListener>
使用。 絕對不是托管bean。
有關正確方法的啟動示例,另請參閱:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.