现在的位置: 首页 > 综合 > 正文

JSF入门与提高之自订验证器

2013年02月09日 ⁄ 综合 ⁄ 共 3213字 ⁄ 字号 评论关闭
您可以自订自己的验证器,所需要的是实作javax.faces.validator.Validator接口,例如我们实作一个简单的密码验证器,检查字符长度,以及密码中是否包括字符与数字:

PasswordValidator.java

PasswordValidator.java
package onlyfun.caterpillar;

 

 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),要加入以下的内容:

faces-config.xml

faces-config.xml
<?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>
            onlyfun.caterpillar.Password
        </validator-id>
        <validator-class>
            onlyfun.caterpillar.PasswordValidator
        </validator-class>
    </validator>
 ....
 </faces-config>

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

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

  您也可以让Bean自行负责验证的工作,可以在Bean上提供一个验证方法,这个方法没有传回值,并可以接收FacesContext、UIComponent、Object三个参数,例如:

UserBean.java

UserBean.java
package onlyfun.caterpillar;

 

 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}"/>
 ....

 

抱歉!评论已关闭.