考虑到JSF和AJAX,我遇到了一个问题。我试图在访问者插入客户id后更新一些客户详细信息。
首先,摘自html代码:
<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}"/>
侦听器方法在我的java文件(ReservationHandler.java)中实现,如下所示:
public void autocompleteCustomerDetails(){
System.out.println("Auto Complete"); // for testing
}
基本上我试图调用方法autocompleteCustomerDetails与监听器。不幸的是,这个方法永远不会被调用。无论如何,渲染似乎工作得很好,因为其他输入文本更新自己(可见)。
有人知道为什么不调用监听器吗?
目前显示的代码中有两个问题:
,
<f:ajax listener="{reservationHandler.autocompleteCustomerDetails}" />
这不是一个有效的EL表达式。EL表达式的形式是#{}
,而不是{}
。相应修复:
<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails}" />
,
public void autocompleteCustomerDetails() {
这不是<f:ajax listener>
方法表达式的有效默认签名。标签文档清楚地告诉我们:
签名必须匹配
public void processAjaxBehavior(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException
。
你忘记了参数。相应地添加它。对于未检查的异常,throws
声明不是强制性的,所以我们可以省略它。
public void autocompleteCustomerDetails(AjaxBehaviorEvent event) {
或者,如果您真的打算去掉参数,那么您应该在EL方法表达式中放入圆括号:
<f:ajax listener="#{reservationHandler.autocompleteCustomerDetails()}" />
试试这个:
<f:ajax listener="{reservationHandler.autocompleteCustomerDetails()}"
render="customer_grid" />
或将方法更改为:getAutoCompleteCustomerDetails
只是为了测试…
无论如何,你不允许使用任何jsf的组件库?像初级面孔?它以一种简单的方式完成了工作……
无论如何,对于素面,我将这样做:
<p:ajax event="blur" listener="#{prospectoRadarController.atualizarRadar(data)}" update=":mainForm:painelRadar" />
另一种猜测是,将execute="@this"添加到ajax标志中…
对不起,这些都是胡乱猜测,但我真的想帮忙。请反馈!