我想使用一些Java bean方法在我的一些输入组件中执行验证,例如<h:inputText>
。我应该使用<f:validator>
或<f:validateBean>
吗?我在哪里可以阅读更多相关信息?
答案 0 :(得分:16)
您只需要实现Validator
界面。
@FacesValidator("myValidator")
public class MyValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
}
}
@FacesValidator
会将其注册到带有验证程序标识myValidator
的JSF,以便您可以在任何validator
/ <h:inputXxx>
组件的<h:selectXxx>
属性中引用它如下:
<h:inputText id="foo" value="#{bean.foo}" validator="myValidator" />
<h:message for="foo" />
您也可以使用<f:validator>
,如果您打算在同一个组件上附加多个验证器,这将是唯一的方法:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator validatorId="myValidator" />
</h:inputText>
<h:message for="foo" />
每当验证器抛出ValidatorException
时,其消息将显示在与输入字段关联的<h:message>
中。
您可以使用<f:validator binding>
在EL范围内的某处引用具体的验证器实例,而这可以很容易地作为lambda提供:
<h:inputText id="foo" value="#{bean.foo}">
<f:validator binding="#{bean.validator}" />
</h:inputText>
<h:message for="foo" />
public Validator getValidator() {
return (context, component, value) -> {
// ...
if (valueIsInvalid) {
throw new ValidatorException(new FacesMessage("Value is invalid!"));
}
};
}
为了更进一步,您可以使用JSR303 bean验证。这将根据注释验证字段。由于这将是一个完整的故事,这里只是一些入门链接:
<f:validateBean>
仅在您打算禁用 JSR303 bean验证时才有用。然后,您将输入组件(甚至整个表单)放在<f:validateBean disabled="true">
。