我想在进一步处理之前使用多个操作监听器设置两个备用Bean的状态

第一种方式:

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

它给出了一个异常(exception):

警告:/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

怎么做才对?

最佳答案

我看到您使用传统的方法来猜测如何使用裸觉和随机联想进行工作,然后惊讶地采取行动:-)
f:actionListener仅允许您将整个对象添加为观察者,而不是任意方法。您可以使用type属性指定类名(它将由JSF实例化),也可以使用binding属性给出您自己创建的对象的实例(而不是方法!)。该对象必须实现javax.faces.event.ActionListener

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

您有两种选择:

  • 是最聪明的一种:只需创建一个调用每个目标方法的方法即可。由于它们位于不同的bean上,因此可以将其中一个注入(inject)另一个。
  • 如果这对您不起作用,则可以创建一个创建监听器对象的方法。

  • 像这样:
    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>
    

    关于jsf - JSF中的多个 Action 监听器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16374012/

    10-11 17:20