原来一直在struts中使用commons-validator,一个很容易扩展的验证框架,今天单独拿出来玩玩,以便以后用到公司自己的web框架中。
注意版本,例子用的都是1.2的版本,与以前的版本存在差别。
服务器端的的校验,先用一个例子来看看,然后回头来总结,将按下面的顺序来做。
1. 编写一个JavaBean
2. 编写校验器
3. 编写校验规则配置文件
4. 编写主程序
一般也就是这么几步了,开始干!
1. 编写一个的JavaBean只有一个属性email
Package com.wide.test; public class ValueBean { private String email;
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; } } |
2. 编写email的校验规则,常用的校验规则commons-validator中已经提供了,例如email的校验,整数,日期等等,这些方法都是以静态方法的形式定义在GenericValidator类里面。这里我们直接调用GenericValidator的email校验方法。校验器的编写很简单,校验方法都是静态方法。
Package com.wide.test; public class EmailValidator{ public static boolean validateEmail(Object bean, Field field) { return GenericValidator.isEmail(ValidatorUtils.getValueAsString(bean, field.getProperty())); } } |
3. 编写校验规则(email-rules.xml)
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.2.0 //EN" "http://jakarta.apache.org/commons/dtds/validator_1_2_0.dtd">
<form-validation> <global> <validator name="emailValidator" classname="com.wide.test.EmailValidator" method="validateEmail" methodParams="java.lang.Object,org.apache.commons.validator.Field" msg=""/> </global> <formset> <form name="valueBean"> <field property="email" depends="emailValidator"/> </form> </formset> </form-validation> |
4. 编写测试文件
//创建ValidatorResources实例,这里取得验证规则信息。可以同时加载多个规则文件。 ValidatorResources resources = new ValidatorResources( EmailValidatorTest.class.getResourceAsStream("email-rules.xml"));
//创建要校验的bean ValueBean bean = new ValueBean(); bean.setEmail("hhh@163.com");
//创建校验器 Validator validator = new Validator(resources,"valueBean");
//设定要校验的bean validator.setParameter(Validator.BEAN_PARAM,bean);
//校验 ValidatorResults results = validator.validate();
//解释校验结果,取得对email属性校验的结果 ValidatorResult result = results.getValidatorResult("email");
//一个属性可以使用多种校验属性,需要知道某个校验器校验的结果可以通过下面的方法,它将返回boolean值 System.out.println(result.getResult("emailValidator")); |
以上就完成了对一个email的校验,看起来很麻烦,但是校验器是可以复用的,写好了之后可以很方便组装。如果要组合多种验证规则,加入在校验email是否合法之前要保证email不空,那么只需要将<field property="email" depends="emailValidator"/>改为:
<field property="email" depends="required,emailValidator"/>
需要注意的是,这种情况下如果前一个校验未通过,那么后面的校验不会进行,因此
System.out.println(result.getResult("emailValidator"));打不出true或false出来而是null。要知道一个属性使用了几个校验器,可以用下面的方式来遍历:
ValidatorResult result = results.getValidatorResult("email"); List depends = result.getField().getDependencyList(); Iterator iter = depends.iterator(); while(iter.hasNext()){ String validatorName = (String) iter.next(); System.out.println(validatorName + "==>" + result.getResult(validatorName)); } |
先在如果给email的值设置为:abc@gmail.com,那么这个验证是通过的。打印出来的结果如下:
required==>null
emailValidator==>true
那么置为空呢?结果如下:
required==>false
emailValidator==>null
如果把emai设置为非法的email呢,例如:abcsafdf,结果如下:
required==>null
emailValidator==>false
为什么我要测试这几种情况呢?我们需要知道如何判断校验成功,以及如果校验失败了会是哪个校验失败。总结如下:
1) validator框架会按照配置的校验顺序来校验
2) 如果某一步的校验失败了,validator会把失败的这一步记下来,后面的校验不会进行,前面的校验状态也不会保留。
3) 如果某一步校验通过了,那么这一步的前面校验的状态都不会保留
按上面的规则,我们知道,只有result.isValid(lastValidator)==true才是通过,即最后一个校验器得到的结果为true才是校验通过;定位到校验失败的方法:不能使用isValid方法了,因为所有的都返回false,可以用result.getResult来检查,如果得到的结果非空就是这一步校验失败了。