我希望在进一步处理之前使用多个动作侦听器来设置两个支持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.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如何做到正确?
答案 0 :(得分:14)
我看到你促进传统方法猜测它是如何工作 - 使用 - 直觉 - 随机 - 关联 - 然后 - 行为 - 惊讶: - )
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>
答案 1 :(得分:0)
binding
属性值需要指向实现ActionListener
接口的对象,而不是方法。
来自f:actionListener
的{{1}}属性的文档:
值绑定表达式,其求值为实现javax.faces.event.ActionListener的对象。
讨论了类似的问题here。