【问题标题】:JSF/Facelets backing beans and EJB3JSF/Facelets 支持 bean 和 EJB3
【发布时间】:2012-06-27 05:41:06
【问题描述】:

关于将 JSF 与 EJB3.1 结合使用时的各种选项和最佳实践,我有几个问题。考虑到可用的选择和组合数量之多,我的心智模型远非清晰,因此有些问题可能没有意义。

JSF/Facelets 通过与所使用的实际注释无关的 EL 代码引用支持 bean(我使用术语“支持 bean”来表示从 Facelets 页面写入或读取属性的 bean)在 bean 类中(javax.faces.bean.* 或 javax.enterprise.context.*)。

说一个人可以在 JSFCDI 范围注释之间切换是否正确,只需更改 bean 类中的导入而不对 Facelets 进行任何更改 xhtml 代码?

JSF/Facelets 是否应该只用于 xhtml 标记代码的既定模式,并且所有范围和生命周期(加上注入)注释都使用 CDI 完成?

JBoss AS 设置中,JSF 支持 bean 的生命周期管理在哪里进行(使用 JSFCDI 注释) ?在 Web 容器中还是在 EJB3 容器中?

在一个典型的 Web 应用程序中,考虑到 SessionScoped bean 可以由 CDI 提供,是否需要使用除 @Entity 类型之外的 EJB3 bean,例如当信息要持久保存在数据库中时,每个“流程”的最后一个典型步骤是什么?

【问题讨论】:

    标签: jsf cdi ejb-3.1


    【解决方案1】:

    是否可以通过更改 bean 类中的导入而不对 Facelets xhtml 代码进行任何更改来在 JSF 和 CDI 范围注释之间切换?

    是的。


    JSF/Facelets 应该只用于 xhtml 标记代码,所有范围和生命周期(加上注入)注释都使用 CDI 完成,这是一种既定模式吗?

    JSF 正在向 CDI 发展。即将到来的JSF 2.2 的新@FlowScoped 注释就是证明这一点,因为它从CDI API 扩展而来。唯一的缺点是 CDI 没有为非常有用的 JSF @ViewScoped 注释提供标准注释。您需要@ConversationScoped,在其中手动开始和结束对话,或者查看像MyFaces CODI 这样的CDI 扩展。


    在 JBoss AS 设置中,JSF 支持 bean 的生命周期管理(使用 JSF 或 CDI 注释)在哪里进行?在 Web 容器中还是在 EJB3 容器中?

    Web 容器(类似于 WAR)。 JSF 是建立在 Servlet API 之上的,所以它绝对是 web 容器。


    在一个典型的 Web 应用程序中,考虑到 SessionScoped bean 可以由 CDI 提供,是否需要使用除 @Entity 类型之外的 EJB3 bean,例如当信息被持久化到数据库中时,每个“流程”中的最后一个典型步骤是什么?

    @Entity 是 JPA 的一部分,而不是 EJB 的一部分。 @Entity 用于映射到数据库表的模型类,通常仅用于跨层传输数据。您最后描述的内容听起来像是@Stateful EJB 的候选人。要更好地了解 @Stateless@Stateful EJB,请参阅此详细答案:JSF request scoped bean keeps recreating new Stateful session beans on every request?

    【讨论】:

    • 抱歉,被可怕的“堆栈溢出需要来自另一个域的外部 JavaScript”问题所困扰,无法及时接受您的回答。
    • 你的回答很清楚。我意识到 EJB 的生命周期与支持 bean 的生命周期之间的关系有点棘手。在我看来,原则上,EJB bean 是完全不同的野兽,与 JSF 页面及其支持 bean 没有任何直接联系。然而,在各个 bean 的生命周期中似乎存在某种脆弱的依赖关系以及一些有效和无效的组合。您分享的文章提供了一些启示,但我想没有什么可以替代亲身体验。
    • EJB 应该用作业务服务。他们根本不应该关心任何 JSF 工件,而只处理模型对象(@Entity 实例)。 JSF backing bean(一个控制器)应该有一个模型对象(一个@Entity)作为视图使用的属性,还有一个作为服务的EJB(由@EJB注入)。 JSF 支持 bean 应该具有将执行 EJB 方法的操作方法。然后将这些操作方法绑定到视图中的命令链接/按钮/ajaxlisteners。
    • 您可能会发现此答案底部的启动示例很有帮助:stackoverflow.com/questions/8626291/… 请注意,EJB 的设计方式应该是它们可以独立于自己的客户端使用。例如。通过 JSF webapp,或者通过 oldschool JSP/Servlet webapp,或者通过 JAX-RS webservice 等等..等等..
    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2011-02-10
    • 1970-01-01
    • 2011-06-29
    • 2012-09-06
    • 2013-05-08
    • 2010-12-28
    相关资源
    最近更新 更多