Java 区分不同类型的JSF托管bean

Java 区分不同类型的JSF托管bean,java,jsf,jakarta-ee,backing-beans,Java,Jsf,Jakarta Ee,Backing Beans,我最近读了NeilGriffin的这篇文章,这篇文章让我思考了我自己的应用程序中不同bean之间的区别。要快速总结要点,请执行以下操作: 模型托管Bean:这种类型的托管Bean参与 MVC设计模式的“模型”关注点。当你看到这个词 “模型”——想想数据。JSF模型bean应该是如下的POJO 封装getter/setter的JavaBean设计模式 财产 支持托管Bean:这种类型的托管Bean参与 MVC设计模式的“视图”关注点。目的 支持bean是为了支持UI逻辑,并且与 JSF视图,或F

我最近读了NeilGriffin的这篇文章,这篇文章让我思考了我自己的应用程序中不同bean之间的区别。要快速总结要点,请执行以下操作:

  • 模型托管Bean:这种类型的托管Bean参与 MVC设计模式的“模型”关注点。当你看到这个词 “模型”——想想数据。JSF模型bean应该是如下的POJO 封装getter/setter的JavaBean设计模式 财产

  • 支持托管Bean:这种类型的托管Bean参与 MVC设计模式的“视图”关注点。目的 支持bean是为了支持UI逻辑,并且与 JSF视图,或Facelet组合中的JSF表单。虽然 通常具有JavaBean样式的属性和关联的 getter/setter,这些是视图的属性,而不是 底层应用程序数据模型。JSF支持bean也可能有JSF actionListener和valueChangeListener方法

  • 控制器托管Bean:这种类型的托管Bean参与 MVC设计模式的“控制器”关注点。目的 控制器bean是执行某种业务逻辑并返回 JSF导航处理程序的导航结果。JSF控制器bean 通常有JSF动作方法(而不是actionListener方法)

  • 支持托管Bean:这种Bean“支持”一个或多个视图 在MVC设计模式的“视图”方面。典型用例 正在向JSF h:selectOneMenu下拉列表提供ArrayList 在多个JSF视图中显示的列表。如果 下拉列表是特定于用户的,那么bean将被保留 在会话范围内

  • 实用工具管理的Bean:这种Bean提供某种类型的 “实用程序”函数用于一个或多个JSF视图。这是一个很好的例子 可能是可以在多个web站点中重用的文件上载bean 应用程序

这对我来说很有意义,在过去的几个小时里,我一直在重构我的代码,并就用户登录提出了以下建议:

AuthenticationController
是控制器管理Bean的一个示例。它属于请求范围,具有两个用于设置用户名和密码的getter和setter,以及两种导航方法,
验证
注销
,在成功登录时将用户导航到其私人区域,或在注销时返回主页

UserBean
是支持管理Bean的一个示例。它是会话范围的,具有一个带有getter和setter的
User
类的实例(未经身份验证时将为null),仅此而已

AuthenticationController
将此用户作为托管属性(
@ManagedProperty(value=“#{userController.user}private user;
)。身份验证成功后,
AuthenticationController
将使用用于登录的相应用户名将托管属性设置为实际用户实例

如果
user
类具有一个包含组名的列表,那么任何新的bean都能够将用户作为托管属性抓取,并提取他们需要的数据,例如组成员资格


这是一个非常主观的问题。我个人不同意这篇文章,并发现它给初学者提供了非常糟糕的建议


模型托管Bean:这种类型的托管Bean参与MVC设计模式的“模型”关注点。当你看到“模型”这个词时——想想数据。JSF模型Bean应该是遵循JavaBean设计模式的POJO,带有封装属性的getter/setter

我绝对不会让它成为或称之为托管bean。只是让它成为
@ManagedBean
的属性。例如DTO或JPA
@实体


支持托管Bean:这种类型的托管Bean参与“视图”"MVC设计模式的关注点。支持bean的目的是支持UI逻辑,并且与JSF视图或Facelet组合中的JSF表单具有1::1关系。尽管它通常具有JavaBean样式的属性和关联的getter/setter,但这些属性是视图的属性,而不是底层应用程序数据模型的属性。JSF bacKingBeans也可能有JSF actionListener和valueChangeListener方法

通过这种方式,您可以不断复制和映射托管bean中实体的属性。这对我来说毫无意义。如上所述,只需将实体作为托管bean的属性,并让输入字段直接引用它,就像
{authenticator.user.name}
而不是
{authenticator.username}


控制器托管Bean:这种类型的托管Bean参与MVC设计模式的“控制器”关注点。控制器Bean的目的是执行某种业务逻辑并将导航结果返回给JSF导航处理程序。JSF控制器Bean通常具有JSF操作方法(而不是actionListener方法)

这基本上描述了
@RequestScoped
/
@ViewScoped
@ManagedBean
类。是否允许事件侦听器方法取决于它们是否特定于绑定到bean的视图和/或其作业依赖于bean的状态。如果是,则它们属于bean。如果ot,那么它们应该是任何bean的独立实现,但绝对不是托管bean


支持托管Bean:这种Bean“支持”MVC设计模式的“视图”关注点中的一个或多个视图