我想用同一个按钮对不同的托管 bean 执行多项操作,一个是作用域 session ,另一个是请求。在我的示例中,我对两者使用相同的 bean。
索引.xhtml
<h:form>
<p:commandButton image="ui-icon ui-icon-notice" action="#{controller.inc()}" update="result">
<f:actionListener type="controller.Controller" />
</p:commandButton>
</h:form>
<p:panel id="result">
#{controller.count}
</p:panel>
Controller .Controller.java
@Named(value = "controller")
@SessionScoped
public class Controller implements ActionListener, Serializable
{
int count = 0;
public Controller(){
System.out.println("new");
}
public void inc(){
count += 1;
}
public int getCount(){
return count;
}
@Override
public void processAction(ActionEvent event) throws AbortProcessingException{
count += 1000;
}
}
当我按下按钮时,计数增加 1,而不是 1001,并创建一个新 bean。我做错什么了 ?
谢谢。
最佳答案
这是预期的行为。 <f:actionListener type>
在每个声明中创建并获取自己的 bean 实例。它不重用由 JSF 管理的同一个 session 范围 bean。
您需要使用 binding
而是绑定(bind)到已经创建的 session 范围 bean 实例。
<f:actionListener binding="#{controller}" />
关于 session 范围的托管 bean 和 actionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7675319/