f:没有调用ajax监听器

Jos*_*ser 0 java ajax jsf

考虑到JSF和AJAX,我遇到了问题.我试图在访问者插入客户ID后更新一些客户详细信息.

首先,摘自xhmtl代码:

    <h:form>
    <h:panelGrid columns="2">
        <h:panelGrid columns ="2" border="1" id="customer_grid">
            <h:outputLabel value="#{mbean_msg.reservation_lblCustomerNo}" for = "customer_id"/>
            <h:inputText id = "customer_id" value="#{reservationHandler.customer.customer_id}">
                <f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" 
                    render="customer_grid" />
            </h:inputText>

            <h:outputLabel value="#{mbean_msg.reservation_lblLastname}" for="lastname"/>
            <h:inputText id="lastname" value="#{reservationHandler.customer.lastname}" required ="true" 
                requiredMessage="#{error_msg.errmsgLastname}" validator="#{reservationHandler.validateCustomer}"/>

            <h:outputLabel value="#{mbean_msg.reservation_lblFirstname}" for="firstname"/>
            <h:inputText id="firstname" value="#{reservationHandler.customer.firstname}" required ="true"
                requiredMessage="#{error_msg.errmsgFirstname}" validator="#{reservationHandler.validateCustomer}"/> 
Run Code Online (Sandbox Code Playgroud)

监听器方法在我的java文件(ReservationHandler.java)中实现,如下所示:

public void autocompleteCustomerDetails(){
      System.out.println("Auto Complete"); // for testing
}
Run Code Online (Sandbox Code Playgroud)

基本上我试图用监听器调用autocompleteCustomerDetails方法.不幸的是,从未调用此方法.无论如何,渲染似乎工作得很好,因为其他inputTexts自己更新(可见).

有没有人有想法,为什么没有听到听众?

Bal*_*usC 7

到目前为止,代码中存在两个问题:

第一,

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />
Run Code Online (Sandbox Code Playgroud)

这不是有效的EL表达式.EL经历的形式#{}不是{}.相应修复:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />
Run Code Online (Sandbox Code Playgroud)

第二,

public void autocompleteCustomerDetails() {
Run Code Online (Sandbox Code Playgroud)

这不是方法表达式的有效默认签名<f:ajax listener>.该标签文件清楚地告诉了以下内容:

签名必须匹配public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException.

所以,你忘记了这个论点.相应地添加它.该throws声明是不是强制性的unchecked异常,所以我们就可以离开它.

public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实想要摆脱参数,那么您应该在EL方法表达式中加上括号:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails()}" />
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于容器支持EL 2.2的情况.