Java JSF支持bean结构(最佳实践)

Java JSF支持bean结构(最佳实践),java,jsf,Java,Jsf,我希望在这篇文章中,我能得到人们对JSF页面和支持bean之间接口的最佳实践的意见 有一件事我永远无法确定,那就是我的后盾的结构。此外,我从未找到一篇关于这个主题的好文章 哪些属性属于哪个支持bean?与创建新bean并向其添加属性相比,什么时候适合向给定bean添加更多属性?对于简单的应用程序,考虑到将一个bean注入另一个bean所涉及的复杂性,在整个页面中只使用一个支持bean有意义吗?支持bean应该包含任何实际的业务逻辑,还是应该严格包含数据 请随时回答这些问题以及可能出现的任何其他问

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

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

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

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


至于减少JSF页面和支持bean之间的耦合,我从不允许JSF页面访问任何支持bean属性。例如,我从不允许出现以下情况:

<h:outputText value="#{myBean.anObject.anObjectProperty}" />
例如,当我在集合上循环时,我使用包装器类来避免深入到数据表中的对象


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

我可能不会回答你的每一个问题,因为很少有人会根据具体情况来回答

  • 在您的支持bean中有一个业务逻辑是很好的。这取决于你从哪里来。如果您正在实践领域驱动的设计,那么您可能会尝试将业务逻辑包括在支持bean中,或者也可能是持久性逻辑。他们争辩说,为什么这么愚蠢的对象。对象不仅应该携带状态,还应该携带行为。另一方面,如果您考虑传统的java EE做事情的方式,您可能感觉像在后台bean中有数据,也可以是实体bean,以及其他会话bean中的其他业务和持久逻辑。那也很好

  • 对于整个页面来说,使用单个支持bean是非常好的。我认为这一点没有任何问题。这看起来可能不对,但这取决于具体情况

  • 你的另一个问题更取决于你手头的情况。我更喜欢在这里使用域驱动,向现有bean添加属性或者为其创建一个新bean可能是合适的。哪个更合适。我不认为这有什么灵丹妙药

  • 哪些属性属于哪个支持bean。那么,它不是依赖于域对象吗?或者问题可能不是那么清楚


此外,在您给定的代码示例中,我没有看到任何巨大的好处。

我不需要每页只保留一个支持bean。这取决于功能,但大多数时候我每页有一个bean,因为大多数情况下一页处理一个功能。例如,在一个页面上,我有一个register链接(我将链接RegisterBean)和一个购物篮链接(ShoopingBasketBean)


我确实使用它,因为我通常将支持bean作为保存数据对象的动作bean。我不想在我的支持bean中编写一个包装器来访问我的数据对象的属性。

好问题。当我转到JSF时,我也经历了同样的困境。这取决于你的应用。我来自JavaEE世界,因此我建议在您的支持bean中尽可能少地使用业务逻辑。如果逻辑纯粹与页面的表示相关,那么将其放在支持bean中就可以了

我相信JSF的(许多)优点之一实际上是,您可以直接在托管bean上公开域对象。因此,我强烈建议使用
方法,否则您将在手动公开每个属性时为自己做太多的工作。此外,如果封装所有属性,则在插入或更新数据时会有点混乱。在某些情况下,单个域对象可能不够。在这些情况下,我在将ValueObject公开到bean之前准备它

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


在bean结构方面,我的转折点是,我强行忽略了所有关于构建web应用程序的知识,转而将其视为GUI应用程序。JSF非常模仿Swing,因此开发Swing应用程序的最佳实践也大多适用于构建JSF应用程序。

我认为,支持bean最重要的事情是分离它们的逻辑。如果你有一个CMS系统的头版,我会认为把每一段代码放在一个bean中是一种不好的做法,因为:

  • 豆子最终会变大
  • 如果其他人正在对登录页面进行故障排除,并且可以轻松地查找loginBean.java文件,那么他们就可以更容易地找到他们要查找的内容
  • 有时,您会有一些与代码其余部分明显不同的小功能,通过分离这些功能,我可以想象,当您已经有了一个结构良好的bean时,您可以更轻松地将这些代码重新开发/扩展为更大的代码
  • 如果/当您必须执行诸如MyBigBean bigBean=new MyBigBean()之类的声明时,拥有1个bigBean将使它更加依赖于内存;而不是通过执行LoginBean LoginBean=new LoginBean()来使用您实际需要的有趣性;(如果我错了,请纠正我??)
  • 在我看来,分离你的豆子就像分离你的方法。你不需要一个运行100多行的大方法,而是用新的方法来处理它们的特定任务
  • <
    <h:outputText value="#{myBean.theObjectProperty}" />
    
    public String getTheObjectProperty()
    {
        return anObject.getAnObjectProperty();
    }