簡體   English   中英

區分不同種類的JSF托管Bean

[英]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,以及兩個導航方法( authenticatelogout ,可在成功登錄后將用戶導航到其專用區域,或在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM