gpt4 book ai didi

多次调用 JSF Backing Bean 构造函数

转载 作者:行者123 更新时间:2023-12-04 23:31:15 25 4
gpt4 key购买 nike

我正在尝试 JSF 2.0(在过去几个月使用 ICEfaces 1.8 之后)并且我试图弄清楚为什么在 JSF 2.0 中我的支持 bean 构造函数被多次调用。

bean 应该在创建时实例化一次,但是每当我单击 commandButton 时都会显示“Bean Initialized”文本,表明正在实例化一个新的 Bean 对象。

facelet页面:

    <?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">

<h:body>
<div id="content">
<h:form id="form">
<h:commandButton value="Toggle" action="#{bean.toggleShowMe}"/>
</h:form>


<h:panelGrid rendered="#{bean.showMe}">
<h:outputText value="Show me!"/>
</h:panelGrid>
</div>
</h:body>
</html>

支持 bean :
@ManagedBean
@RequestScoped
public class Bean {
private boolean showMe = false;

public boolean isShowMe() {
return showMe;
}

public void setShowMe(boolean showMe) {
this.showMe = showMe;
}

public void toggleShowMe(){
System.out.println(showMe);
if(showMe==true){
showMe=false;
}else{
showMe=true;
}
}
/** Creates a new instance of Bean */
public Bean() {
System.out.println("Bean Initialized");
}

}

就是这样。只是一个简单的测试。如果我使用 ICEfaces 2.0 并代替我使用的 panelGrid,则会显示相同的行为:
<ice:panelPopup visible="#{bean.showMe}">

我很感激这里的任何帮助。我不知道该怎么解释。

更新 :为了回应 Aba Dov,我 @SessionScoped 这个 bean,认为它不会在每个请求时调用构造函数并遇到相同的行为。我错过了什么?

最佳答案

您已将 bean 声明为放置在请求范围内,并且每次都通过命令按钮触发一个新的 HTTP 请求。确实,每个请求都会创建 bean。

如果您希望 bean 的生命周期与 View 本身一样长(就像 IceFaces 为所有 ajax 内容所做的那样),那么您需要声明 bean View 的作用域(这是 JSF 2.0 中的新功能)。

@ManagedBean
@ViewScoped
public class Bean implements Serializable {}

关于多次调用 JSF Backing Bean 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4826377/

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