我有一个带有dataTable的表单,其中包含各种具有链接和outputTexts的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只将整数添加到字段中。表格如下。
<form>
<h:dataTable var="item" value="#{listItems.model}" id="adminlistItems">
//other columns having commandLinks and outputTexts
<h:column>
<f:facet name="header" >
<h:outputText value="Quantity"/>
</f:facet>
<f:ajax listener="#{listItems.AddQuantityAction}">
<div style="padding:5px;float:left">
<h:inputText label="changeQuantity" id="addquantity" value="#{item.additionalQuantity}" maxlength="4" size="3">
<f:validator validatorId="integerValidator"/>
</h:inputText>
<h:outputText value=" "/>
<h:commandButton value="AddQuantity" />
<h:message for="addquantity"/>
</div>
</f:ajax>
</h:column>
</h:dataTable>
</h:form>
bean的代码是:
@ViewScoped
@ManagedBean
public class ListItems implements Serializable {
//...
public String AddQuantityAction(){
//...
boolean result = //some action
FacesContext context=FacesContext.getCurrentInstance();
UIComponent component=UIComponent.getCurrentComponent(context);
String clientID=component.getClientId(context);
if (result) {
FacesMessage message = new FacesMessage("Quantity added successfully");
FacesContext.getCurrentInstance().addMessage(clientID, message);
} else {
FacesMessage message = new FacesMessage("Quantity not added.Processing error");
FacesContext.getCurrentInstance().addMessage(clientID, message);
}
return "adminListItems";
}
}
自定义验证程序抛出未显示的验证程序异常。并且监听器还具有也不显示的消息的代码。我已经阅读了几个类似的问题,这听起来也是一个常见的问题。但即使我遗漏了一些明显的东西,我仍然需要第三只眼睛来看看我不知道的东西。
答案 0 :(得分:1)
execute
的{{1}}和render
默认为<f:ajax>
。因此,只处理和刷新当前活动的组件。按下按钮时,这不会发送输入值,也不会刷新消息组件。
相应修复:
@this
顺便问一下,为什么不使用内置<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
...
<h:message id="addquantity_message" for="addquantity"/>
...
</f:ajax>
转换器而不是验证器呢?
javax.faces.Integer
此外,ajax侦听器方法的返回值应为<h:inputText ... converter="javax.faces.Integer">
。它完全被忽略了。此外,方法名称应以小写字母开头。另请参阅Java naming conventions。
更新,在验证方面效果不佳。监听器被调用2次,因为基本上发送了2个ajax请求,一个用于输入,一个用于命令。我建议将监听器方法移到void
。
<h:commandButton action>
您只能将获取的客户端ID修改为输入ID,而不是按钮ID。