我想在进一步处理之前使用多个操作监听器设置两个备用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.ELException:/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
实例。
您有两种选择:
像这样:
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/