JSF2.0,消息不显示在数据表中
我有一个带有dataTable的表单,它有多个具有链接和OutputExt的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只向字段添加整数。表格如下JSF2.0,消息不显示在数据表中,jsf,datatable,message,Jsf,Datatable,Message,我有一个带有dataTable的表单,它有多个具有链接和OutputExt的列。有一个输入字段通过ajax请求进行评估。自定义验证器确保只向字段添加整数。表格如下 <form> <h:dataTable var="item" value="#{listItems.model}" id="adminlistItems"> //other columns having commandLinks and ou
<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>
自定义验证器引发未显示的验证器异常。监听器也有代码用于未显示的消息。我读过几个类似的问题,这听起来也是一个常见的问题。但是,即使我遗漏了一些明显的东西,我也需要第三只眼睛来查看我没有看到的东西。
的执行和渲染默认为@this
。因此,将只处理和刷新当前活动的组件。按下按钮时,不会发送输入值,也不会刷新消息组件
相应地进行修正:
<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
...
<h:message id="addquantity_message" for="addquantity"/>
...
</f:ajax>
此外,ajax侦听器方法的返回值应该是void
。不管怎样,它都被完全忽略了。此外,方法名称应以小写字母开头。另见
更新根据评论,这在验证方面似乎效果不好。侦听器被调用两次,因为实际上发送了两个ajax请求,一个用于输入,一个用于命令。我建议将侦听器方法移动到
...
您将只将获得的客户端ID固定为输入ID,而不是按钮ID。当我添加代码时,消息只会闪烁并熄灭。它不会留在页面中。验证消息现在可以了。它们在将侦听器更改为操作后出现并保留,但是动作方法中myFacesMessage
中的消息仍然没有显示。UIComponent#getCurrentComponent()
将是命令按钮组件,而不是输入组件。我建议创建另一个指向按钮组件ID的
。满脸笑容:)也感谢您的其他输入和建议。我没有使用,因为我不知道如何限制输入负数
<f:ajax execute="addquantity" render="addquantity_message" listener="#{listItems.AddQuantityAction}">
...
<h:message id="addquantity_message" for="addquantity"/>
...
</f:ajax>
<h:inputText ... converter="javax.faces.Integer">
<f:ajax execute="addquantity" render="addquantity_message">
...
<h:commandButton action="#{listItems.AddQuantityAction}" />
<h:message id="addquantity_message" for="addquantity"/>
</f:ajax>