gpt4 book ai didi

java - 每次刷新时重新创建 JSF 2.1 View 作用域受管 bean

转载 作者:行者123 更新时间:2023-11-29 10:15:27 24 4
gpt4 key购买 nike

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

每次刷新这些 View 时,都会创建该 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;
}
}

每次我使用浏览器刷新按钮或简单地在浏览器地址字段中按下回车来刷新 View 时,我都会清楚地看到 @PostConstruct 方法调用。

如果我让应用程序长时间保持 Activity 状态,我看不到 @PreDestroy 方法被调用,并且进行堆转储显示 ViewScopedBean 具有相同的编号实例数作为我重新加载 View 的数量,即使我销毁 session ,它们似乎仍保留在堆上。

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

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

最佳答案

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

关于java - 每次刷新时重新创建 JSF 2.1 View 作用域受管 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19153374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com