【问题标题】:What's the correct way of binding to a JSF property that is expensive?绑定到昂贵的 JSF 属性的正确方法是什么?
【发布时间】:2012-06-10 08:31:26
【问题描述】:

这是我的场景:

我正在使用 JSF。

  1. 我有一个每 5 秒刷新一次的页面(但用户没有注意到它,因为所有内容都经过 ajaxified)
  2. 我想要一个模式窗口,当用户单击某物(例如,一个按钮)时,它会向用户显示一个事物列表。因此,每次用户单击该按钮时,模式都会显示最新列表。

现在我有以下内容:加载了 a 属性的模式。此属性从 DB 加载内容并将列表返回到 JSF 页面。

主要问题是由于页面每 5 秒刷新一次,因此该属性每 5 秒调用一次(即对 DB 的请求)。

总结:我希望有一个模式,每次用户点击一个按钮时加载一个列表,在一个每 5 秒刷新(ajaxified)的页面内。

做这些事情的正确方法是什么?指向好的教程是好的答案,我不需要代码,而是了解最佳实践。

谢谢。

【问题讨论】:

    标签: java jsf-2


    【解决方案1】:

    每当用户单击按钮时,我都会从数据库中获取列表,并将其放入在当前请求中幸存的 bean 的属性中(范围 = 会话、视图、会话或其他),然后绑定该属性用 EL 表达式。

    要在单击按钮时获取列表,请让按钮触发重新呈现面板内容的 ajax 请求,并在完成 ajax 请求后使面板可见。您还没有说您使用的是什么 ajax 或组件库;对于 Richfaces,它类似于:

    <a4j:commandButton 
        action="#{mybean.fetchListFromDatabase}" 
        rerender="panelcontent" 
        oncomplete="Richfaces.showModalPanel('thepanel')"
    />
    

    【讨论】:

    • RequestScope bean 不适用于这种场景,请记住 RequestScope 是在对服务器的每个请求(在这种情况下,在每个 ajax 调用中)创建的。 Scope session 也可以完成这项工作,但最好使用窄范围来完成手头的任务。
    • 我知道;我在回答中的哪个位置说要使用请求范围?
    • 感谢您的回答。但是在模态窗口的上下文中我究竟该如何做呢?现在我有一个仅被 CSS 隐藏的表单(因此每次刷新页面时都会提交该表单)。当我单击按钮时,它所做的只是显示带有列表的表单。我需要某种服务器生成的模式吗?
    • 我正在使用 Icefaces。我会看看如何使用它并尽快回复您。
    【解决方案2】:

    模式面板已经在 RichFaces 和 PrimeFaces 库中实现

    这两种实现都包括 ajax 和 jQuery 来管理基本行为。您可以使用其中之一来实现您的模式面板和从 DB 恢复数据的列表(使用 ViewScope 托管 bean)。

    如果您不能或可能不想将这些库中的任何一个添加到您的项目中,您可以使用他们的代码并将其用作实施的启动(这两个库都是开源的)。

    【讨论】:

      猜你喜欢
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2013-06-16
      相关资源
      最近更新 更多