【问题标题】:Session scoped managed bean and actionListener会话范围的托管 bean 和 actionListener
【发布时间】:2011-10-06 13:56:51
【问题描述】:

我想用同一个按钮对不同的托管 bean 执行多项操作,一个是作用域会话,另一个是请求。在我的示例中,我对两者使用相同的 bean。

index.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。我做错了什么?

谢谢。

【问题讨论】:

    标签: session jsf


    【解决方案1】:

    这是预期的行为。 &lt;f:actionListener type&gt; 在每个声明中创建并获取自己的 bean 实例。它不重用由 JSF 管理的同一个会话范围 bean。

    您需要改用binding 来绑定到已经创建的会话作用域bean 实例。

    <f:actionListener binding="#{controller}" />
    

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 2012-06-27
      • 1970-01-01
      • 2014-06-30
      • 2013-02-06
      相关资源
      最近更新 更多