Mojarra:2.1.26
说明
我有非常简单的复合组件 hello.xhtml :
<composite:interface>
<composite:attribute name="value" />
<composite:attribute name="changeListener" method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)" />
</composite:interface>
<composite:implementation>
<h:inputText id="inputNameId" value="#{cc.attrs.value}">
<f:ajax execute="@this" event="change" listener="#{cc.attrs.changeListener}"/>
</h:inputText>
</composite:implementation>
如您所见,实现非常简单。这里的主要关键是ajax支持事件更改。
使用omposite组件:
<h:form id="formId">
<hla:hello id="compositeId" value="#{helloController.name}" changeListener="#{helloController.nameChangedListener}">
</hla:hello>
</h:form>
如您所见,使用了attrbiute changeListener 。我只是想听一听。在复合组件中,提供了方法签名。让我们看看支持bean,这非常简单:
@ManagedBean
@ViewScoped
public class HelloController implements Serializable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void nameChangedListener(AjaxBehaviorEvent event){
System.out.println("-nameChangedListener-");
System.out.println("\tphase: " + event.getPhaseId());
}
}
监听器方法没有做任何特殊的事情,只是为了保持这个简单。
问题:
当我尝试运行此代码时,我总是遇到异常:
java.lang.ArrayIndexOutOfBoundException:0
...
如果我将复合组件中的method-signature更改为:
<composite:attribute name="changeListener" method-signature="void listener()" />
和支持bean的方法:
public void nameChangedListener(){ ... }
一切正常。
问题:
是否有机会将AjaxBehaviorEvent用作侦听器方法参数? 怎么做?