我在 inputText 上使用 rich:validator 进行 JSR-303 验证,如下所示:
<h:outputLabel value="#{msgs['label.email']}:"/>
<h:inputText value="#{loginBean.email}" id="email" size="50" validatorMessage="Invalid email address." styleClass="#{component.valid ? '' : 'invalid'}">
<rich:validator />
</h:inputText>
<rich:message for="email" />
当验证失败时, inputText 的类应该更改为invalid
,这会导致组件周围出现红色边框,并且应该使用 rich:message 显示Invalid email address
消息。如果我输入了无效的电子邮件地址并将鼠标光标移到 inputText 之外,则只会Invalid email address
出现该消息;UIInput 不会切换到invalid
类,因此组件周围不会出现红色边框。但是,如果我单击提交按钮并使用无效的电子邮件地址提交表单,则在重新加载页面时 inputText 框的类会发生更改,并且我会同时收到红边组件和错误消息。为什么会这样?JSR-303 不要求客户端验证工作与提交表单一样吗?
编辑:
我在 inputText 中添加了以下内容,这解决了更改 inputText 上的类的问题:
<a4j:ajax event="blur" render="email"/>
然而,这带来了一个新的问题。现在,错误消息不是“粘性的”。换句话说,当输入无效的电子邮件时,inputText 上会出现红色轮廓并出现错误消息,如预期的那样,但如果我随后在另一个组件上输入无效输入并且它的类更改为“无效”并且出现错误消息,“电子邮件”上的错误消息消失。inputText 类更改现在可以正常工作,但消息是不稳定的,如果另一个组件的条目无效,它们就会消失。