关于JSF2托管bean作用域机制(请求作用域)的web应用程序设计问题



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

我正在使用Primeface4的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:访问托管bean;s实例在阶段侦听器对象中
  5. 在tabview页面中,使用cache="true"来提高性能,并让tabViewListner更新整个tabview组件,该组件将更新内部的数据表

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

最新更新