关于JSF2托管bean范围机制的Web应用程序设计问题(请求范围)

时间:2013-11-27 00:21:26

标签: java jsf primefaces

我对JSF2托管bean作用域机制(请求范围)引起的设计问题有疑问。

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

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

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

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

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

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

谢谢!

-------溶液-----------

  1. 将ManagedBean更改为sessionScoped
  2. 添加tabviewListener
  3. 添加tabview类以处理制表符开关
  4. 在tabview类中,使用此帖子中的方法在运行时获取托管bean。
    JSF 2 : Accessing managed bean's instance in the phase listener object?
  5. 在tabview页面中,使用cache =“true”来提高性能,让tabViewListner更新整个tabview组件,它将更新内部的数据表。

1 个答案:

答案 0 :(得分:1)

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