我最近阅读了Neil Griffin的这篇文章,对不同种类的JSF Managed-Beans进行了区分,这让我想起了我自己的应用程序中不同bean之间的区别。 要快速总结这个要点: Model Managed-Bean:这种types的托pipebean参与了MVCdevise模式的“Model”关注。 当你看到“模型”这个词 – 想想DATA。 JSF模型bean应该是一个遵循JavaBeandevise模式的POJO,使用getter / setter封装属性。 备份Managed-Bean:这种types的托pipebean参与了MVCdevise模式的“View”关注。 支持bean的目的是支持UI逻辑,并且与JSF视图或Facelet组合中的JSF表单具有1 :: 1的关系。 虽然它通常具有与关联的getter / setter相关联的JavaBean样式的属性,但它们是View的属性 – 而不是底层的应用程序数据模型的属性。 JSF支持bean也可能有JSF actionListener和valueChangeListener方法。 Controller Managed-Bean:这种types的托pipebean参与了MVCdevise模式的“Controller”关注。 控制器bean的目的是执行某种业务逻辑,并将导航结果返回给JSF导航处理程序。 JSF控制器bean通常具有JSF操作方法(而不是actionListener方法)。 支持Managed-Bean:这种types的bean在MVCdevise模式的“View”关注中“支持”一个或多个视图。 典型的用例是将ArrayList提供给出现在多个JSF视图中的JSF h:selectOneMenu下拉列表。 如果下拉列表中的数据是用户特有的,那么这个bean将被保存在会话范围内。 Utility Managed-Bean:这种types的bean为一个或多个JSF视图提供某种types的“实用程序”function。 一个很好的例子就是可以在多个Web应用程序中重用的FileUpload bean。 这对我有意义,在过去的几个小时里,我一直在重构我的代码,并提出了以下有关用户login: AuthenticationController是Controller Managed-Bean的一个例子。 它是请求范围的,具有设置用户名和密码的两个获取者和设置者,以及两种导航方法: authenticate和logout ,成功login时将用户导航到其私有区域,或者在注销时返回到主页面。 UserBean是Support Managed-Bean的一个例子。 它是会话范围的,并且具有一个User类的实例(当你没有通过身份validation时它将是空的)和一个getter和setter,仅此而已。 AuthenticationController将这个用户作为一个托pipe属性( @ManagedProperty(value = "#{userController.user} private User user; ))。validation成功后, AuthenticationController会将托pipe属性设置为实际用户实例,用于login。 任何新的bean都可以作为托pipe属性来抓取用户,如果User类具有包含组名的列表,则可以提取他们需要的数据,例如组成员身份。 这样才能成为分离问题的正确方法吗?