JSF提供自定义验证器的功能,使开发更加灵活,而且验证器组件还可以重用。 的功能,使开发更加灵活,而且验证器组件还可以重用。
一般有两种方式定义验证器:
1. 实现javax.faces.validator.Validator接口的validate方法,如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage 对象,这个对象接受三个参数,分别表示讯息的严重程度(INFO、 WARN、ERROR、FATAL)、讯息概述与详细信息内容,这些信息将可以使用<h:messages>或<h: message>标签显示在页面上。
以下是一个例子:
public void validate(FacesContext ctx,UIComponent component,Object object) throws ValidatorException{
String password = (String) object;
if(!password.matches(".+[0-9]+")){
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,"密码必须是字符和数字组合","密码必须是字符和数字组合");
throw new ValidatorException(message);
}
}
然后在faces-config.xml文件声明这个验证器:
<validator>
<validator-id>validateUserpassword</validator-id>
<validator-class>validator.ValidateUserpassword</validator-class>
</validator>
JSF页面:
<h:inputSecret id="addUserpassword"
value="#{addUserForm.userpassword}"
required="true">
<f:validator validatorId="validateUserpassword"/>
</h:inputSecret>
<a4j:outputPanel ajaxRendered="true">
<h:message style="color:red;" for="addUserpassword"/>
</a4j:outputPanel>
要注意validateID值要对应。
2. 在backingbean里面实现自定义验证。
Backingbean:
public void validate() throws ValidatorException{
if(!userpassword.matches(".+[0-9]+")){
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,"密码必须是字符和数字组合","密码必须是字符和数字组合");
throw new ValidatorException(message);
}
}
JSF页面:
<h:inputSecret id="addUserpassword"
value="#{addUserForm.userpassword}"
required="true"
validator="#{addUserForm.validate}"/>
<a4j:outputPanel ajaxRendered="true">
<h:message style="color:red;" for="addUserpassword"/>
</a4j:outputPanel>
这种方法比较方便,不用在faces-config里面声明配置validator,但是不易重用。