1

我有一个页面范围的 Seam 组件,它有一个用 @Destroy 注释的无参数 void 方法,如下所示。我的问题是,即使浏览器页面被更改(即页面范围结束),也永远不会调用destroy 方法。

@Name("myPageBean")
@Scope(ScopeType.PAGE)
public class MyPageBean {

    @Destroy
    public void destroy {
        // Code runs when the component is destroyed.
    }

}

你对这个问题有想法吗?

提前致谢。

4

2 回答 2

1

页面上下文何时被破坏?

页面范围与 UI 组件树没有区别。因此,当 JSF 从会话中删除 UI 组件树(也称为视图)时,页面上下文将被破坏。然而,当这种情况发生时,Seam 不会收到回调,因此页面范围组件上的 @Destroy 方法永远不会被调用。如果用户点击离开页面或关闭浏览器,页面上下文必须等待清理到 JSF 中,从而终止它所绑定的视图。这通常发生在会话结束或会话中的视图数量超过限制时。此限制是使用 Sun 实现中的 com.sun.faces.numberOfViewsInSession 和 com.sun.faces.numberOfLogicalViews 上下文参数建立的。两者都默认为 15。但是,通常最好不要弄乱这些值。

页面范围应该仅仅被视为保持数据与视图相关联的一种方式,作为维护 UI 组件完整性的一种方式。这种关注点与历史上一直存在问题的数据表特别相关。我不会将页面范围用作用例或工作流数据的通用存储机制。将其视为缓存的一个好方法。

http://www.seamframework.org/42514.lace

于 2014-01-25T13:05:12.873 回答
0

你曾经在页面中使用过这个bean吗?如果没有,我猜destroy不会被调用,因为它永远不会被创建。或者您可以添加 @StartUp 以在初始化 Scope 时强制创建 bean。

于 2011-04-19T09:58:26.723 回答