我希望在这篇文章中,我可以得到人们对JSF页面和支持bean之间接口的最佳实践的看法.
我永远无法解决的一件事是我的支持豆的结构.此外,我从未找到关于这个主题的好文章.
什么属性属于哪个支持bean?何时适合向给定bean添加更多属性,而不是创建新bean并将属性添加到其中?对于简单的应用程序,考虑到将一个bean注入另一个bean所涉及的复杂性,为整个页面只有一个支持bean是否有意义?支持bean是否应该包含任何实际的业务逻辑,还是应该严格包含数据?
随意回答这些问题以及可能出现的任何其他问题.
至于减少JSF页面和支持bean之间的耦合,我从不允许JSF页面访问任何支持bean属性的属性.例如,我从不允许以下内容:
<h:outputText value="#{myBean.anObject.anObjectProperty}" />
Run Code Online (Sandbox Code Playgroud)
我总是需要这样的东西:
<h:outputText value="#{myBean.theObjectProperty}" />
Run Code Online (Sandbox Code Playgroud)
支持bean值为:
public String getTheObjectProperty()
{
return anObject.getAnObjectProperty();
}
Run Code Online (Sandbox Code Playgroud)
当我循环遍历集合时,我使用包装类来避免向下钻取到数据表中的对象.
一般来说,这种方法对我来说是"正确的".它避免了视图和数据之间的任何耦合.如果我错了,请纠正我.
在JSF MVC框架中谁是Model,View和Controller?
我最近阅读了来自Neil Griffin的这篇文章,在不同种类的JSF Managed-Beans之间做出区分,这让我想到了我自己的应用程序中不同bean之间的区别.要快速总结一下要点:
Model Managed-Bean:这种类型的托管bean参与MVC设计模式的"模型"关注.当你看到"模型"这个词时 - 想想数据.JSF模型bean应该是遵循JavaBean设计模式的POJO,其中getter/setter封装属性.
支持托管Bean:这种类型的托管bean参与MVC设计模式的"视图"关注.backing-bean的目的是支持UI逻辑,并且与Facef组合中的JSF视图或JSF表单具有1 :: 1的关系.虽然它通常具有带有关联getter/setter的JavaBean样式属性,但它们是View的属性 - 而不是底层应用程序数据模型的属性.JSF支持bean也可能有JSF actionListener和valueChangeListener方法.
Controller Managed-Bean:这种类型的托管bean参与MVC设计模式的"Controller"关注.控制器bean的目的是执行某种业务逻辑并将导航结果返回给JSF导航处理程序.JSF控制器bean通常具有JSF操作方法(而不是actionListener方法).
支持Managed-Bean:这种类型的bean"支持"MVC设计模式的"View"关注中的一个或多个视图.典型的用例是向JSF h:selectOneMenu下拉列表提供ArrayList,这些列表出现在多个JSF视图中.如果下拉列表中的数据特定于用户,则bean将保留在会话范围内.
Utility Managed-Bean:这种类型的bean为一个或多个JSF视图提供某种类型的"实用程序"功能.一个很好的例子可能是FileUpload bean,它可以在多个Web应用程序中重用.
这对我来说很有意义,在过去的几个小时里,我一直在重构我的代码,并针对用户登录提出以下内容:
这AuthenticationController是Controller Managed-Bean的一个例子.它是请求范围的,具有两个用于设置用户名和密码的getter和setter,以及两种导航方法,authenticate并logout在成功登录时将用户导航到其私有区域,或者在注销时返回主页面.
这UserBean是一个支持管理Bean的示例.它是会话范围的,并且具有User类的实例(当您未经过身份验证时将使用getter和setter,它将为null),仅此而已.
该AuthenticationController有这个用户作为托管属性(@ManagedProperty(value = "#{userController.user} private User user;).验证成功后,AuthenticationController将使用用于登录的相应用户名将托管属性设置为实际用户实例.
任何新的bean都可以将用户作为托管属性获取并提取他们需要的数据,例如组成员资格,如果User该类具有包含组名的列表.
这种方式是关于分离问题的正确方法吗?
我开始学习 JSF,但首先我想了解它作为 MVC 框架的总体情况。
有几个得到很多赞同的答案解释了 JSF 中的 MVC 层,但它们通常是相互矛盾的。
BalusC的回答: JSF MVC框架中的MVC是什么组件?
在大的架构图中,您自己的 JSF 代码是V:
M - 业务领域/服务层(例如 EJB/JPA/DAO)
V - 您的 JSF 代码
C - FacesServlet在开发者图中,架构V依次可分如下:
M - 实体
V - Facelets/JSP 页面
C - 托管 bean
Jigar Joshi 在同一线程中的回答:
模型将是你的
ManagedBean视图将是
jsp,XHTML(好吧,你可以在这里容纳各种视图)控制器将是
FacesServlet
这里,对这个问题的另一种看法:
在 JSF 中,您不实现控制器。因此,支持 bean 或任何其他类型的托管 bean 都不是控制器。
还有一个,这次不是来自 Stackoverflow:
在 JSF 中,主控制器始终是 FacesServlet。子控制器被合并到各种控制元素标签实现中。您几乎从未在 JSF 中编写控制器代码,因为它都是预先提供的。因此,您只需提供视图模板 (xhtml) 和模型(支持 …