【发布时间】:2011-11-05 14:06:28
【问题描述】:
我最近阅读了 Neil Griffin Making Distinctions Between Different Kinds of JSF Managed-Beans 的这篇文章,它让我思考了我自己的应用程序中不同 bean 之间的区别。快速总结要点:
Model Managed-Bean:这种类型的 managed-bean 参与 MVC 设计模式的“模型”关注点。当你看到这个词 “模型”——想想数据。一个 JSF 模型 bean 应该是一个 POJO 封装了 getter/setter 的 JavaBean 设计模式 属性。
Backing Managed-Bean:这种类型的 managed-bean 参与 MVC 设计模式的“视图”关注点。一个目的 backing-bean是支持UI逻辑的,和有1::1的关系 JSF 视图或 Facelet 组合中的 JSF 表单。虽然它 通常具有与关联的 JavaBean 样式的属性 getter/setter,这些是视图的属性——而不是视图的属性 底层应用数据模型。 JSF backing-beans 也可能有 JSF actionListener 和 valueChangeListener 方法。
Controller Managed-Bean:这种类型的 managed-bean 参与 MVC 设计模式的“控制器”关注点。一个目的 控制器 bean 是执行某种业务逻辑并返回一个 JSF 导航处理程序的导航结果。 JSF 控制器-bean 通常有 JSF 操作方法(而不是 actionListener 方法)。
支持 Managed-Bean:这种类型的 bean “支持”一个或多个视图 在 MVC 设计模式的“视图”关注中。典型用例 正在向 JSF h:selectOneMenu 下拉列表提供 ArrayList 出现在多个 JSF 视图中的列表。如果数据在 下拉列表是特定于用户的,那么 bean 将被保留 在会话范围内。
Utility Managed-Bean:这种类型的 bean 提供某种类型的 一个或多个 JSF 视图的“实用程序”功能。一个很好的例子 可能是一个可以在多个 web 中重用的 FileUpload bean 应用程序。
这对我来说很有意义,在过去的几个小时里,我一直在重构我的代码,并就用户登录提出了以下建议:
AuthenticationController 是控制器托管 Bean 的示例。它是请求范围的,具有两个用于设置用户名和密码的 getter 和 setter,以及两种导航方法,authenticate 和 logout,在成功登录时将用户导航到他们的私人区域,或者在成功登录时返回主页退出。
UserBean 是 Support Managed-Bean 的一个示例。它是会话范围的,并具有一个带有 getter 和 setter 的 User 类的实例(当您未通过身份验证时它为 null),仅此而已。
AuthenticationController 将此用户作为托管属性 (@ManagedProperty(value = "#{userController.user} private User user;)。成功验证后,AuthenticationController 会将托管属性设置为具有用于登录的相应用户名的实际用户实例。
如果User 类具有包含组名的列表,那么任何新 bean 都可以将用户作为托管属性获取并提取他们需要的数据,例如组成员身份。
在关注点分离方面,这种方式是否正确?
【问题讨论】:
标签: java jsf jakarta-ee backing-beans