日期:2014-05-16  浏览次数:20345 次

JSF入门十二(自定义验证器)

本文参考 http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630

?

您可以自定义自己的验证器,所需要的是实现javax.faces.validator.Validator 接口,例如我们实现一个简单的密码验证器,检查字符长度,以及密码中是否包括字符与数字:

package bruce.zhao;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class PasswordValidator implements Validator {
	public void validate(FacesContext context, UIComponent component, Object obj)
			throws ValidatorException {
		String password = (String) obj;
		if (password.length() < 6) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "字符长度小于6", "字符长度不得小于6");
			throw new ValidatorException(message);
		}
		if (!password.matches(".+[0-9]+")) {
			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, "密码必须包括字符与数字", "密码必须是字符加数字所组成");
			throw new ValidatorException(message);
		}
	}
}

?您要实现javax.faces.validator.Validator 接口中的validate()方法,如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage 对象,这个对象接受三个参数,分别表示信息的严重程度(INFO、 WARN、ERROR、FATAL)、信息概述与详细信息内容,这些信息将可以使用<h:messages>或<h: message>标签显示在页面上。
接下来要在faces-config.xml中注册验证器的标识(Validater ID),要加入以下的内容:

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
....
<validator>
<validator-id>
bruce.zhao.Password
</validator-id>
<validator-class>
bruce.zhao.PasswordValidator
</validator-class>
</validator>
....
</faces-config>

? 要使用自定义的验证器,我们可以使用<f:validator> 标签并设定validatorId属性,例如:

<h:inputSecret value="#{user.password}" required="true">
<f:validator validatorId="bruce.zhao.Password"/>
</h:inputSecret><p>
....

?以上几步就完成了自定义验证器的操作,您也可以让Bean自行负责验证的工作,可以在Bean上提供一个验证方法,这个方法没有传回值,并可以接收FacesContext、UIComponent、Object三个参数,例如:

package bruce.zhao;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
public class UserBean {
....
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
String password = (String) obj;
if(password.length() < 6) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"字符长度小于6",
"字符长度不得小于6");
throw new ValidatorException(message);
}
if(!password.matches(".+[0-9]+")) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"密码必须包括字符与数字",
"密码必须是字符加数字所组成");
throw new ValidatorException(message);
}
}
}

?接着可以在页面下如下使用验证器:

....
<h:inputSecret value="#{user.password}" required="true" validator="#{user.validate}"/>
....