【发布时间】:2014-02-09 18:48:51
【问题描述】:
据我了解,ViewScoped bean 仅在发生以下情况之一时才会被销毁:
1) JSF 向另一个页面发送一个 POST 请求,其中包含 <h:commandLink...> 之类的内容
2)打开的bean数量超过最大阈值设置(默认为15)
3) 用户会话过期
这是我的困惑:
#1 是否意味着如果用户使用 GET 请求离开页面,bean 将保持打开状态,即使最终 JSF POST 发生在另一个页面的同一浏览器选项卡中?或者,无论用户在哪个页面上,一旦发送 JSF POST,该浏览器选项卡的所有活动 @ViewScoped 实例都会被销毁?
#2 是否意味着用户可以为每个 @ViewScoped 类激活 15 个 bean 实例?还是不管类是 15 个 bean 实例——这意味着我可以有 5 个 Class1 实例、5 个 Class2 实例和 5 个 Class3 实例,而一个新 bean 会破坏最旧的活动 bean?
对于#3,如果 STATE_SAVING_METHOD 设置为“client”,这会对 ViewScoped bean 被销毁有任何影响吗?据我所知,如果将 STATE_SAVING_METHOD 设置为客户端,则需要一种手动控制会话过期的方法。
最后,有没有办法管理活动的 ViewScoped bean,以便在用户单击“注销”时销毁它们?
【问题讨论】:
-
这将是一个漫长的故事,但简而言之,它与 JSF 自己的
@ViewScoped的工作方式没有什么不同。 -
关于管理
@ViewScopedbean 的最后一个问题,如果会话删除保证它们将被删除,我看不出有任何理由进行这样的操作。 -
我猜最后一个问题是存在的,以防当 STATE_SAVING_METHOD 设置为客户端时,bean 在会话到期时不会被销毁。我主要担心的是我在 ViewScoped bean 中存储了太多没有被破坏的信息(例如表数据)。我想确保我正确使用了这个范围。看起来 ViewScoped 可能只是为表单的页面设计的,这些表单会被提交按钮破坏,但它也可以方便地缓存计算数据,只要使用它不会出现内存问题。
-
只需使用 JPA 处理实体并利用缓存作业。请记住,在 Java 中,您不是在内存中存储值的副本,而是在内存中存储引用。
-
@BalusC,那么什么时候用omnifaces viewscope代替jsf viewscope呢?
标签: jsf omnifaces view-scope