首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

通用验证系统(3)使用界面更新

通用验证系统(3)使用界面更新

4.2. 应用编程接口如图《 Commons-validator 的 API 》所示,commons-validator                的类明显的分成三种,第一种为代表验证规则文件中各个元素的类,本文称元素类,第二种是程序准备验证资料和验证的类,本文称 fa?ade                类,第三种是实现了通用功能的类,本文称工具类。元素类代表了验证规则文件中的各个元素,对于编程者来说主要作用是用他们来得到消息文本;fa?ade                类用来使 Commons-validator 验证系统融入到应用系统中;而工具类有助于编程者写实现各种 validatorAction                的类。具体的使用参见下面的代码样例。
4.3. 代码样例虽然 common-validation 是为 web 应用写的验证体系,它同时也能用在 java                应用程序中,为了把注意力放在验证系统的介绍上,下面的验证样例使用 java 应用程序来表演。
4.3.1. 定义验证规则验证规则是一个 xml 文件,定义了需要验证的表单,及其表单的各个字段以及字段的验证要求,另外 validator                元素是用来完成各个字段的验证要求的。本例定义了一个输入表单 nameForm 及其两个字段,两个字段都必须提供,而且 age                字段还必须是整数;还定义了两个验证动作 int 和 required,分别满足整数要求和必须提供的要求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<form-validation>
    <global>      
        <validator name="int"
            classname="org.i505.validator.MyTypeValidator"
            method="validateInt"   
            methodParams="java.lang.Object,org.apache.commons.validator.Field"
            msg="errors.int"/>   
        <validator name="required"      
            classname="org.i505.validator.MyValidator"
            method="validateRequired"         
            methodParams="java.lang.Object,org.apache.commons.validator.Field"
            msg="errors.required"/>
    </global>
<formset>
<form name="nameForm">
    <field property="username"  depends="required">   
        <arg0 key="nameForm.username.displayname"/>   
    </field>   
    <field  property="age" depends="required,int">      
        <arg0 key="nameForm.age.displayname"/>      
    </field>  
</form>
</formset>  
</form-validation>




4.3.2. 编写消息资源文件
commons-validator 的消息资源包括两大部份,第一部分是包括了参数占位符的 validatoraction                对象的消息,第二部分是各个输入表单输入数据的显示信息,用作验证失败时的信息显示。本例中值包括了一个输入表单的显示信息:
1
2
3
4
5
6
# validatoraction 对象的消息
errors.required= 必须提供 {0} 字段!
errors.int= {0} 字段必须是整数!
# nameForm 输入表单的各个输入数据的显示信息
nameForm.username.displayname= 姓名
nameForm.age.displayname= 年龄




4.3.3. 编写 validatorAction
我们从验证定义规则文件中可以看出 validator 元素定义的 int 和 required validatorAction 分别使用了                org.i505.validator.MyTypeValidator 和 org.i505.validator.MyValidator                两个类,这个元素还定义了它们使用的验证方法 validateInt 和 validateRequired                以及方法的参数类型列表。下面是这两个类的代码:
1
2
3
4
5
6
7
8
9
10
11
package org.i505.validator;import
org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericTypeValidator;
import org.apache.commons.validator.ValidatorUtil;
public class MyTypeValidator {
    public static Integer validateInt(Object bean, Field field) {   
        String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
        Integer x= GenericTypeValidator.formatInt(value);   
        return x;   
    }
}




1
2
3
4
5
6
7
8
9
10
package org.i505.validator;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorUtil;  
public class MyValidator {            
    public static boolean validateRequired(Object bean, Field field) {  
        String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
        return !GenericValidator.isBlankOrNull(value);  
    }
}




4.3.4. 编写 javabean
commons-validator 是一个针对 web 应用的输入验证体系,验证规则中的 form 定义是针对 html form 表单的,但是                common-validator 在内部验证时需要 javabean。这个 javabean 的各个属性就代表了 html form                表单的输入控制。所以针对前面的验证规则,我们实现的 javabean 需要定义两个属性:age 和 username,代码如下 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ValidateBean extends Object {
    String username;String age;  
    public void setUsername (String username) {
        this. username = username;   
    }   
    public String getUsername () {
        return this.username;  
    }   
    public void setAge (String age) {
        this.age = age;
    }
    public String getAge () {  
        return this.age;  
    }
    public String toString() {
        return "{ username =" + this.username + ", age=" + this.age + "}";   
    }
}




注意,这个验证 BEAN 的 age 属性的类型是字符串型的,因为它只是代表了 html form                表单的输入控制的值,原始的用户输入数据基本上都可以用 String 来表示,如果我们申明 age 属性的类型时整数型,则我们在 html form                表单的值到 BEAN 的 age 属性就经过了一次类型转换,这个早于我们的整型验证,所以可能有产生类型转换错误的危险。
4.3.5. 编写验证主程序
编写验证主程序主要有下面五步:
  • 创建和处理 ValidatorResources 对象,这要借助于 ValidatorResourcesInitializer                    类利用验证规则定义文件初始化这个对象。
  • 创建要验证的 bean 对象
  • 用验证规则定义文件中定义的某个 form 创建 validator 对象,并且告诉这个对象要验证的 bean 对象。
  • 运行 validator 对象的 validate() 方法实际验证 bean 对象
  • 打印验证结果
下面是依据上面所述步骤编写的实例代码,代码中进行了三次验证,第一次是验证两个属性都是空的 bean 对象,第二次是 age 属性不合法的 bean                对象,第三次是两个属性都合法的 bean 对象:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) throws IOException, ValidatorException {   
    InputStream in = null;  
    try {        
        ValidatorResources resources = new ValidatorResources();      
        in = ValidateExample.class.getResourceAsStream("myvalidator-example.xml");
        ValidatorResourcesInitializer.initialize(resources, in);      
        ValidateBean bean = new ValidateBean();           
        Validator validator = new Validator(resources, "nameForm");   
        validator.addResource(Validator.BEAN_KEY, bean);      
        ValidatorResults results = null;         
        results = validator.validate();      
        printResults(bean, results, resources);   
        bean.setUsername("龚永生");           
        bean.setAge("很年轻");         
        results = validator.validate();  
        printResults(bean, results, resources);   
        bean.setAge("28");   
        results = validator.validate();   
        printResults(bean, results, resources);   
    }
    finally {     
        if (in != null) {
            in.close();     
        }
    }
}






返回列表