【问题标题】:web app design issue regarding to JSF2 managed bean scope mechanism (request scope)关于 JSF2 托管 bean 范围机制(请求范围)的 Web 应用程序设计问题
【发布时间】:2013-12-12 09:35:27
【问题描述】:

我有一个关于 JSF2 托管 bean 范围机制(请求范围)引起的设计问题的问题。

我正在使用 primefaces4 的 tabview 组件和 datatable 组件构建一个 Web 应用程序。每个选项卡都有一个数据表,其中包含从具有请求范围的托管 bean 检索的数据,该数据表使用 JDBC 从数据库中获取数据。因此,每次用户单击选项卡时,托管 bean 都会从数据库中检索数据。这就是整个架构的设计方式。很简单。

为每个 ManagedBean 使用 @RequestScoped 的目的是用户希望在选择每个选项卡(每个请求)时查看来自数据库的实时数据。所有其他范围均不适用。问题是当用户选择一个选项卡时,所有选项卡数据库访问逻辑都会执行。我认为这是因为 Ajax 调用请求,所以每个 @RequestScoped bean 都会被调用。

这会导致两个缺点: 1.表现不佳。用户需要等待 4-5 秒才能看到所有 bean 执行完毕后数据表出现。 2. 对数据库的无用访问过多。

我的解决方案是使用 Spring 调度程序在托管 bean 的单独线程中管理所有数据库访问,然后添加数据缓存层以与托管 bean 交互。 Spring 调度器可能被设计为每 10 分钟访问一次数据库,轮询数据并将它们放入数据缓存中。这样托管 bean 将访问内存中的所有数据。然后我想使用 Primefaces Push API 将数据推送到客户端,所以用户不需要刷新浏览器。

显然它不是实时的,但解决了上述两个问题。

还有其他更好或简化的解决方案吗?

谢谢!

-------解决方案-----------

  1. 将 ManagedBean 更改为 sessionScoped
  2. 添加tabviewListener
  3. 添加tabview类来处理tab切换
  4. 在 tabview 类中,使用本文中的方法在运行时获取托管 bean。
    JSF 2 : Accessing managed bean's instance in the phase listener object?
  5. 在 tabview 页面中,使用 cache="true" 来提高性能,并让 tabViewListner 更新整个 tabview 组件,该组件将更新内部的数据表。

【问题讨论】:

    标签: java jsf primefaces


    【解决方案1】:

    您应该更改 bean 的视图范围并更改页面逻辑以在单击选项卡时更新表格,而不是在每次请求后丢弃整个 bean。查看 PrimeFaces ajax 请求,并在单击选项卡时调用 bean 上的方法,该方法检索新数据,然后 p:dataTable 等可以引用这些数据。

    【讨论】:

    • 太棒了!这是我想要的解决方案。我将对此进行调查并提供解决方案。谢谢。
    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2012-05-26
    • 2012-11-13
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多