>假设我有一个要验证的用户名,在这种情况下,当验证失败时,我需要以红色显示用户名输出文本和用户名输入文本字段以及错误消息。
我试图将所有这些绑定到一个面板组中,以便如果验证失败,所有字段都应该受到影响。但是简单地放置面板组是行不通的。
我的后备 Bean 验证器
public void emailValidate(FacesContext context,
UIComponent componentToValidate,
Object value)
throws ValidatorException {
String email = value.toString();
if (!Validator.isEmailAddress(email))
{
FacesMessage message =
new FacesMessage(FacesMessage.SEVERITY_ERROR,"Email","Please enter valid email address");
throw new ValidatorException(message);
}
}
我的 JSF
<h:panelGroup>
<h:outputText value="Email"/>
<h:message for="emailInput/>
<h:inputText id="emailInput" value="#{mybean.email}" validator="#{mybean.emailValidate}"/>
</h:panelGroup>
通过binding
属性将输入组件绑定到视图。它将在 EL 中作为UIInput
组件引用提供,以便您可以在styleClass
属性中使用UIInput#isValid()
。
<h:outputLabel for="emailInput" value="Email"
styleClass="#{emailInput.valid ? '' : 'error'}" />
<h:inputText id="emailInput" binding="#{emailInput}" ...
styleClass="#{emailInput.valid ? '' : 'error'}" />
(请注意,我将您的标签固定为真正的标签;另请注意,您根本不需要按照 cubbuk 的答案创建一些 bean 属性)
是的,这可能会在视图中生成相当多的非 DRY 样板代码。您可以使用相位侦听器或系统事件侦听器将其抽象出来。您还可以使用OmniFaces <o:highlight>
组件,该组件可以透明地完成所有工作。另请参阅现场演示。
您需要一个字段来表示后备 Bean 中的验证失败。根据该验证字段的条件,您可以更改 uiComponents 的 css,如下所示。
public void emailValidate(FacesContext context,
UIComponent componentToValidate,
Object value)
throws ValidatorException
{
String email = value.toString();
if (!Validator.isEmailAddress(email))
{
FacesMessage message =
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email", "Please enter valid email address");
validationFailed = true;
throw new ValidatorException(message);
}
}
public Boolean getValidationFailed()
{
return validationFailed;
}
<style>
.errorClass
{
background-color: red;
}
</style>
<h:panelGroup>
<h:outputText value="Email" styleClass="#{ozetPageBean.validationFailed ? 'errorClass' : ''}"/>
<h:message for="emailInput"/>
<h:inputText id="emailInput"
value="#{ozetPageBean.email}"
validator="#{ozetPageBean.emailValidate}"
styleClass="#{ozetPageBean.validationFailed ? 'errorClass' : ''}"/>
</h:panelGroup>