【问题标题】:JSF + REST WebApp running on Apache Tomcat 7在 Apache Tomcat 7 上运行的 JSF + REST WebApp
【发布时间】:2013-06-20 09:18:36
【问题描述】:

我有一个简单的 JSF WebApp,其后端服务在 Tomcat 7.0.34 上运行

如果您有一个 JSF ManagedBean 负责处理数据模型以呈现 UI 组件,那么后端服务如何通知 JSF 数据模型的更改?

我基本上是想弄清楚如何从后端服务获取对 ApplicationScoped JSF ManagedBeam 的引用,但似乎不可能?

我想避免使用 ManagedBean 轮询后端服务以检测数据模型更改的轮询机制。我曾尝试使用 CDI 和 Spring IoC,但这些尝试已被证明是不成功的。

如果需要,我可以提供示例代码..

谢谢

【问题讨论】:

    标签: java spring jsf primefaces tomcat7


    【解决方案1】:

    我建议不要这样做。更有意义的是,您的 managedbean 会向您的服务添加某种侦听器实现,并以这种方式得到通知。在适当的设计中,您的后端服务不知道您的托管 bean 存在。

    如果你仍然想这样做,诀窍是让 Spring 管理你的 jsf managedbeans,而不是 jsf 本身。然后,您可以将(应用程序范围!)托管 bean 注入您的服务。

    要将 spring 用于您的 bean,您需要将 Spring 解析器添加到您的 faces-config。

    <el-resolver>
      org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
    

    【讨论】:

    • 谢谢大家,我还没有在 faces-config 中尝试过 Spring 解析器方法。当您谈到使用侦听器实现时,您是否建议查看 PropertyChangeListener 和 PropertyChangeSupport Observer 模式的使用?
    • @James 这取决于您的用例。我只会创建一个侦听器接口和支持您要中继的消息的实现。它不必来自标准 API。
    【解决方案2】:

    也许不是您要查找的内容,但您可以在数据模型中使用一种方法来计算数据模型的哈希值 - 并将该值存储在哈希计算中未包含的表中。

    如果数据模型发生变化,那么后端的存储过程应该更新哈希。

    虽然您想避免使用轮询机制,但您现在有一个您想知道已更改的值。与@Joeri 的回答类似,您的模型和控制器应该解耦——因为您将来可能有多个控制器。

    如果您有一个定期检查散列的应用程序范围的 bean - 它不会给您所需的东西吗?

    【讨论】:

    • 虽然这是使用散列方法检查模型更改的一种很好的优雅方式,但我更喜欢使用侦听器实现。但是,如果我无法对最初的问题取得任何进展,我肯定会考虑您建议的技术。
    猜你喜欢
    • 2011-06-27
    • 2012-06-11
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多