JSF 支持豆结构(最佳实践)

2022-08-31 08:56:26

我希望在这篇文章中,我可以获得人们对JSF页面和支持bean之间接口的最佳实践的意见。

有一件事我永远无法解决,那就是我的后备豆的结构。此外,我从未找到关于这个主题的好文章。

哪些属性属于哪些后备豆?何时适合向给定的 Bean 添加更多属性,而不是创建新的 Bean 并将属性添加到其中?对于简单的应用程序,考虑到将一个支持Bean注入另一个bean所涉及的复杂性,整个页面只有一个支持Bean是否有意义?支持 Bean 应该包含任何实际的业务逻辑,还是应该严格包含数据?

请随时回答这些问题以及可能出现的任何其他问题。


至于减少 JSF 页和后备 Bean 之间的耦合,我从不允许 JSF 页访问任何后备 Bean 属性的属性。例如,我从不允许这样的事情:

<h:outputText value="#{myBean.anObject.anObjectProperty}" />

我总是需要这样的东西:

<h:outputText value="#{myBean.theObjectProperty}" />

后备豆值为:

public String getTheObjectProperty()
{
    return anObject.getAnObjectProperty();
}

例如,当我循环访问集合时,我使用包装类来避免向下钻取到数据表中的对象。

总的来说,这种方法对我来说是“正确的”。它避免了视图和数据之间的任何耦合。如果我错了,请纠正我。


答案 1

您可能想检查一下:区分不同类型的 JSF 托管 Bean

以下是对Neil Griffin在上面的文章中定义的不同bean类型的描述:

  • 模型托管 Bean通常为会话作用域。这种类型的托管 Bean 参与 MVC 设计模式的“模型”关注点。当你看到“模型”这个词时,想想DATA。JSF 模型 bean 应该是一个遵循 JavaBean 设计模式的 POJO,其中包含封装属性的 getters/setter。模型 Bean 最常见的用例是成为数据库实体,或者只是表示数据库查询结果集中的一组行。
  • 支持托管 Bean通常请求范围。这种类型的托管 Bean 参与 MVC 设计模式的“视图”关注点。支持 Bean 的目的是支持 UI 逻辑,并且与 JSF 视图或 Facelet 组合中的 JSF 表单具有 1::1 的关系。尽管它通常具有 JavaBean 样式的属性和关联的 getters/setter,但这些属性是 View 的属性,而不是底层应用程序数据模型的属性。JSF 支持 Bean 也可能具有 JSF actionListener 和 valueChangeListener 方法。
  • 控制器托管 Bean通常请求作用域。这种类型的托管 Bean 参与 MVC 设计模式的“控制器”关注点。控制器 Bean 的用途是执行某种业务逻辑,并将导航结果返回到 JSF 导航处理程序。JSF 控制器 bean 通常具有 JSF 操作方法(而不是操作Listener 方法)。
  • 支持托管 Bean通常是会话或应用程序范围。这种类型的Bean“支持”MVC设计模式的“视图”关注点中的一个或多个视图。典型的用例是向 JSF h:selectOneMenu 提供一个 ArrayList,这些下拉列表出现在多个 JSF 视图中。如果下拉列表中的数据特定于用户,则 Bean 将保留在会话范围内。但是,如果数据适用于所有用户(例如省份的下拉列表),则 Bean 将保留在应用程序范围内,以便为所有用户缓存它。
  • 实用程序托管 Bean通常为应用程序范围。这种类型的 Bean 为一个或多个 JSF 视图提供某种类型的“实用程序”函数。一个很好的例子可能是可以在多个Web应用程序中重用的FileUpload Bean。

答案 2

好问题。当我搬到JSF时,我遭受了同样的困境。这实际上取决于您的应用。我来自Java EE世界,所以我建议在你的支持bean中尽可能少地使用业务逻辑。如果逻辑纯粹与页面的呈现有关,那么将其放在后备豆中是可以的。

我相信 JSF 的(许多)优势之一实际上是,您可以直接在受管 Bean 上公开域对象。因此,我强烈建议使用这种方法,否则您最终会在手动公开每个属性时为自己做太多工作。此外,如果封装了所有属性,则在插入或更新数据时会有点混乱。在某些情况下,单个域对象可能不够用。在这些情况下,我先准备一个值对象,然后再将其公开到bean上。<:outputText value="#{myBean.anObject.anObjectProperty}" />

编辑:实际上,如果您要封装要公开的每个对象属性,我建议您将UI组件绑定到支持Bean,然后将内容直接注入组件的值中。

就bean结构而言,我的转折点是当我强行忽略我所知道的关于构建Web应用程序的所有内容并开始将其视为GUI应用程序时。JSF 经常模仿 Swing,因此开发 Swing 应用程序的最佳实践主要也适用于构建 JSF 应用程序。


推荐