【问题标题】:JSF 2.1 View scoped managed bean re-created on every refreshJSF 2.1 查看每次刷新时重新创建的作用域托管 bean
【发布时间】:2013-10-09 19:23:35
【问题描述】:

所以我有一个问题,我需要任何关于如何解决这个问题的信息。 我们在 JBoss 7.1 上使用 JSF 2.1,并且我们使用具有与该视图相关的表的视图范围 bean。该表中表示为一行的对象非常大。

每次刷新这些视图时,都会创建该 bean 的一个新实例。

为了验证这是否发生,我创建了一个演示示例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
        <h:outputText value="#{viewScopedBean.i}" />
</h:body>
</html> 

这个模板然后链接到一个像这样定义的bean:

@ManagedBean
@ViewScoped
public class ViewScopedBean {


    private int i = 0;

    @PostConstruct
    public void init(){
        System.out.println("Init - " + i);
    }


    @PreDestroy
    public void dest(){
        System.out.println("Destroy - " + i);
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

每次我使用浏览器刷新按钮或在浏览器地址字段中按 Enter 刷新视图时,我都会清楚地看到 @PostConstruct 方法调用。

如果我让应用程序长时间处于活动状态,我看不到 @PreDestroy 方法被调用,并且进行堆转储显示 ViewScopedBean 具有与我重新加载视图的数量相同的实例数,即使我销毁会话,它似乎仍保留在堆上。

这对我来说是个大问题,因为如果 500 个用户用那个大表重新加载视图,JBoss 就会死掉,因为它的堆空间已满。

这是@ViewScoped beans 的设计行为还是我做错了什么?

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

    每次创建视图时都会创建 ViewScoped bean。就是这样。

    但是你抱怨如果有 500 个用户访问该页面,JBoss 就会死掉。您可以用来防止这种情况的唯一范围是ApplicationScope。但这是个坏主意。

    每个人都会建议您使用最窄的范围。 所以我认为你的问题的解决方案不是另一个范围,而是一个“延迟加载”算法。您应该逐页加载表格。我不认为每个人都需要一口气读完整张桌子。

    这是一个很好的范围描述。 ManagedBeanScopes

    如果您希望 bean 被销毁,您应该选择 requestScope。因为视图范围的 bean 存储在会话中。

    【讨论】:

    • 我们实际上是在延迟加载该表上的内容!刷新页面只会增加使用的堆空间,所以无论我们使用每页有多少行,它只会变得更大,因为它们永远不会被破坏!
    • 另外,bean 在会话失效后不会被销毁。
    【解决方案2】:

    只有当用户通过将回发返回到同一视图(通过从 UICommand 操作方法返回 null/void)与当前视图交互时,视图范围的 bean 才会存在。从操作方法返回当前视图 id、向同一视图发出 get 请求、刷新页面、在浏览器的地址栏中手动输入 URL 以及诸如此类的事件都会导致重新创建视图。因此,您会看到在每个此类操作上都重新实例化了视图范围 bean。

    【讨论】:

    • 好的,我同意这个概念,但是那些视图范围的 bean 什么时候会被销毁?因为,据我所知,它们永远不会被摧毁。
    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2013-02-23
    • 1970-01-01
    • 2011-06-21
    相关资源
    最近更新 更多