我最近读了Neil Griffin的这篇文章Making Distinctions Between Different Kinds of JSF Managed-Beans,这让我思考起我自己应用程序中不同bean之间的区别。简要总结如下:
为一个或多个JSF视图添加“实用”函数。一个很好的例子可能是文件上传bean,可以在多个Web应用程序中重复使用。
Model Managed-Bean: 这种类型的托管bean参与MVC设计模式中的“Model”关注点。当您看到“model”一词时,请思考数据。JSF模型bean应该是遵循JavaBean设计模式的POJO,具有封装属性的getter / setter。
Backing Managed-Bean: 这种类型的托管bean参与MVC设计模式中的“View”关注点。backing-bean的目的是支持UI逻辑,并且与JSF视图或Facelet组合中的JSF表单具有1:1的关系。虽然它通常具有与关联的getter / setter的JavaBean样式属性,但这些是视图的属性,而不是底层应用程序数据模型的属性。JSF后备bean还可以具有JSF actionListener和valueChangeListener方法。
Controller Managed-Bean: 这种类型的托管bean参与MVC设计模式中的“Controller”关注点。控制器bean的目的是执行某种业务逻辑并向JSF navigation-handler返回导航结果。JSF控制器bean通常具有JSF动作方法(而不是actionListener方法)。
Support Managed-Bean: 这种类型的bean在MVC设计模式中“View”关注点中支持一个或多个视图。典型用例是向显示在多个JSF视图中的JSF h: selectOneMenu下拉列表提供ArrayList。如果下拉列表中的数据特定于用户,则将保留bean会话范围。
Utility Managed-Bean: 此类型的bean提供某种类型的辅助功能,如格式化日期或转换字符串。它们通常没有与视图相关的属性,但可以具有静态方法。
这对我来说很有意义,过去几个小时我一直在重构代码,并得出了以下关于用户登录的方案:
AuthenticationController
是一个控制器托管bean的示例。它是请求范围的,具有两个getter和setter用于设置用户名和密码,以及两个导航方法 authenticate
和 logout
,在成功登录时将用户导航到其私人区域,或在注销时返回主页。
UserBean
是支持托管bean的示例。它是会话范围的,并且具有一个User
类的实例(当您没有经过身份验证时为null)和一个getter和setter,没有其他内容。
AuthenticationController
将此用户作为托管属性(@ManagedProperty(value = "#{userController.user} private User user;
)。在成功认证后,AuthenticationController
会将托管属性设置为实际用户实例,该实例具有用于登录的相应用户名。
任何新的bean也可以将用户作为托管属性获取,并提取他们所需的数据,例如组成员身份,如果User
类具有包含组名的列表。
这种方式是关注点分离的正确方式吗?