前面我们举的例子,用户需要输入用户名和密码提交验证。那么你输入的密码如果有长度限制,或者只能输入数字的话,
你可能会在用户验证之前进行检查,这样做也可以。
但是我个人的理解,唤起应用程序和执行验证相比,更靠后,程序效率会变低。而且程序的层次不清楚,验证和逻辑混合,不易维护。
所以我们可以自定义验证器来解决。
自定义验证器要实现javax.faces.validator.Validator的validate()方法
验证出错时ValidatorException,接受参数FacesMessage,可以在前台用标签<h:messages>显示。
我们先写个验证器:
package
test;
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);
}
}
}
新建一个jsp文件,其实和上面例子用的jsp差不多,只是加入了密码验证。
<%@taglib
uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib
uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page
contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>JSF 自定义验证器</title>
</head>
<body>
<f:view>
<h:form>
<h3>请输入您的名称</h3>
<h:message for="dateField"
style="color:red" /><p>
<h:outputText value="#{user.errMessage}"
style="color:red"/><p>
<!-- 姓名 -->
名称:<h:inputText value="#{user.name}" />
<p>密码:<h:inputSecret id="dateField" value="#{user.password}">
<f:validator
validatorId="test.Password"/>
</h:inputSecret><p>
<p><h:commandButton value="送出"
action="#{user.verify}" />
</h:form>
</f:view>
</body>
</html>
上面红色部分就是加入的密码验证器,按照jsf的生命周期,它是在唤起应用程序之前执行的。
faces-config.xmle中配置验证器
<!-- 验证器 -->
<validator>
<validator-id>test.Password</validator-id>
<validator-class>test.PasswordValidator</validator-class>
</validator>
Tomcat启动后,http://localhost:8080/jsfTest/pages/jsfMyValidator.faces
就可以运行了。当密码输入小于6或者有字母的时候,就会出错。
具体程序参看示例程序。