f:没有调用ajax监听器

时间:2012-12-23 11:40:39

标签: 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}"/> 

listener方法在我的java文件(ReservationHandler.java)中实现,如:

public void autocompleteCustomerDetails(){
      System.out.println("Auto Complete"); // for testing
}

基本上我试图用Listener调用方法 autocompleteCustomerDetails 。不幸的是,从未调用此方法。无论如何,渲染似乎工作正常,因为其他 inputTexts 自我更新(可见)。

是否有人有想法,为什么不调用听众?

2 个答案:

答案 0 :(得分:6)

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

首先,

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />

这不是有效的EL表达式。 EL费用的格式为#{},而不是{}。相应地修复它:

<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />

其次,

public void autocompleteCustomerDetails() {

这不是<f:ajax listener>的方法表达式的有效默认签名。 tag documentation清楚地说明了以下内容:

  

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

所以,你忘记了这个论点。相应地添加它。 <{1}}声明对于未经检查的例外不是强制性的,因此我们可以将其删除。

throws

或者,如果你真的想要摆脱这个论点,那么你应该把括号放在EL方法表达式中:

public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {

请注意,仅当您的容器支持EL 2.2时才有效。

答案 1 :(得分:0)

试试这个:

<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}" 
                render="customer_grid" />

或将方法更改为:     getAutoCompleteCustomerDetails

仅供测试...

无论如何,你不允许使用任何jsf的组件库?像素面一样? 它以如此简单的方式完成工作......

无论如何,对于素数,我会这样做:

 <p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" />

另一个猜测是,将execute =“@ this”添加到ajax标志......

对不起,这些都是疯狂的猜测,但我真的很想帮忙。 请反馈!