JSF中的多个actionlisteners

时间:2013-05-04 11:56:55

标签: jsf jsf-2 primefaces

我希望在进一步处理之前使用多个动作侦听器来设置两个支持bean的状态

第一路:

<p:commandButton process="@this" >
   <f:attribute name="key" value="#{node.getIdTestGroup()}" />
   <f:actionListener binding="#{testController.nodeListener}" />
<f:actionListener binding="#{testDeviceGroupController.prepareCreate}" />
</p:commandButton>

它给出了一个例外:

警告:/ testGroup/List.xhtml @ 26,88 binding =“#{testController.nodeListener()}”:找不到方法nodeListener javax.el.E​​LException:/ testGroup/List.xhtml @ 26,88 binding =“#{testController.nodeListener()}”:找不到方法nodeListener

第二路:

<p:commandButton process="@this" >
    <f:attribute name="key" value="#{node.getIdTestGroup()}" />
    <f:actionListener binding="#{testController.nodeListener(event)}" />
    <f:actionListener binding="#{testDeviceGroupController.prepareCreate(event)}" />
</p:commandButton>

nodeListener和prepareCreate方法

上的事件为null

如何做到正确?

2 个答案:

答案 0 :(得分:14)

我看到你促进传统方法猜测它是如何工作 - 使用 - 直觉 - 随机 - 关联 - 然后 - 行为 - 惊讶: - )

f:actionListener只允许您将整个对象添加为观察者,而不是任意方法。您可以使用type属性指定类名(它将由JSF实例化)或binding属性,以提供您自己创建的对象的实例(不是方法!)。该对象必须实现javax.faces.event.ActionListener

您的第二次尝试(testDeviceGroupController.prepareCreate(event))在许多级别上都是错误的,但关键是调用这些方法不会处理您的操作,而是创建Actionlistener实例。

您有几个选择:

  • 最诚实的一个:只需创建一个调用每个目标方法的方法。由于它们位于不同的bean上,因此可以将一个注入到另一个bean中。
  • 如果这对您不起作用,您可以创建一个创建侦听器对象的方法。

像这样:

public ActionListener createActionListener() {
    return new ActionListener() {
        @Override
        public void processAction(ActionEvent event) throws AbortProcessingException {
            System.out.println("here I have both the event object, and access to the enclosing bean");
        }
    };
}

并像这样使用它:

<h:commandButton>
    <f:actionListener binding="#{whateverBean.createActionListener()}"/>            
</h:commandButton>

答案 1 :(得分:0)

binding属性值需要指向实现ActionListener接口的对象,而不是方法。

来自f:actionListener的{​​{1}}属性的文档:

  

值绑定表达式,其求值为实现javax.faces.event.ActionListener的对象。

讨论了类似的问题here