我有一个页面范围的Seam组件,它有一个用@Destroy注释的无参数void方法,如下所示。我的问题是,即使浏览器页面被更改(即页面范围结束),也永远不会调用destroy方法。
@Name("myPageBean")
@Scope(ScopeType.PAGE)
public class MyPageBean {
@Destroy
public void destroy {
// Code runs when the component is destroyed.
}
}
你对这个问题有所了解吗?
提前致谢。
答案 0 :(得分:1)
页面上下文什么时候被破坏?
页面范围与UI组件树无法区分。 因此,当JSF删除UI时,页面上下文将被销毁 会话中的组件树(也称为视图)。但是,什么时候 发生这种情况,Seam没有收到回调,因此 永远不会调用页面范围组件上的@Destroy方法。如果 用户点击页面或关闭浏览器,页面上下文 必须等待清理成JSF杀死它的视图 界。这通常在会话结束或数字时发生 会话中的视图超出限制。确定此限制 使用com.sun.faces.numberOfViewsInSession和 com.sun.faces.numberOfLogical查看Sun中的上下文参数 实现。两者都默认为15.但是,通常最好不要 弄乱这些价值观。
页面范围应仅视为保持数据关联的一种方式 以视图作为维护UI完整性的手段 零件。这一焦点尤其与数据表有关 历史上一直存在问题。我不会将页面范围用作 用例或工作流数据的通用存储机制。一个好方法 把它想象成一个缓存。
答案 1 :(得分:0)
你曾经在一个页面中使用过这个bean吗?如果没有,我想不会因为它永远不会被创建而调用destroy。 或者你可以添加@StartUp来强制在初始化Scope时创建bean。