如何创建自定义验证器?
下面是一个email验证器的示例:
EmailValidator.java:
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 EmailValidator implements Validator {
private String errorMessage = null;
public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }
public void validate(FacesContext context, UIComponent component, Object value) {
if (null == value) {
return;
}
String email = (String) value;
if (-1 == email.indexOf('@', 1) || -1 == email.indexOf('.')) {
if (errorMessage != null) {
throw new ValidatorException(new FacesMessage(Tags.eval(errorMessage)));
} else {
// use default validator message
throw new ValidatorException(null);
}
}
}
}
|
Tags.java:
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.ValueChangeEvent;
import javax.faces.webapp.ConverterTag;
import javax.faces.webapp.UIComponentTag;
public class Tags {
// Converter Tags and Validator Tags helper methods
public static String eval(String expression) {
if (expression != null && UIComponentTag.isValueReference(expression)) {
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ValueBinding vb = app.createValueBinding(expression);
return "" + vb.getValue(context);
} else {
return expression;
}
}
} |
EmailValidatorTag.java:
import javax.faces.component.UIComponent;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorTag;
import javax.servlet.jsp.JspException;
public class EmailValidatorTag extends ValidatorTag {
private String errorMessage = null;
public EmailValidatorTag() {
setValidatorId("Email");
}
public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }
public Validator createValidator() throws JspException {
EmailValidator validator = (EmailValidator) super.createValidator();
validator.setErrorMessage(errorMessage);
return validator;
}
public void release() {
errorMessage = null;
}
} |
faces-config.xml:
<validator>
<validator-id>Email</validator-id>
<validator-class>EmailValidator</validator-class>
</validator>
mytags.tld:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.2</jspversion>
<shortname>mytags</shortname>
<uri>mytags</uri>
<tag>
<name>validateEmail</name>
<tagclass>EmailValidatorTag</tagclass>
<attribute>
<name>errorMessage</name>
<description>message if a validation error occurs</description>
</attribute>
</tag>
</taglib>
mypage.jsp:
<h:inputText id="email" required="true">
<mytags:validateEmail errorMessage="#{bean.message}"/>
</h:inputText>
Credit: Loom, JavaServer Faces Developer's Forum