考虑到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自己更新(可见).
有没有人有想法,为什么没有听到听众?
到目前为止,代码中存在两个问题:
第一,
<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的情况.
归档时间: |
|
查看次数: |
3597 次 |
最近记录: |