• 信步漫谈之Struts2—输入校验(XML方式)


    主要介绍struts2的XML配置方式输入校验,结合实例进行说明。

    代码结构:

    image

    关键代码:

    RegistAction.java
    regist.jsp
    struts.xml

    使用XML方式检验需创建一个XML配置文件,位置在对应的Action同级目录下,命名规则为:Action名-validatioin.xml。

    校验文件可以有两种写法,一种是字段校验,一种是非字段校验。字段校验就是以字段为主,在对应字段配置下添加该字段的校验器,非字段校验就是先定义好校验器,在校验器下添加字段。如下:

    RegistAction-validation.xml
    RegistAction-validation2.xml

    同时字段校验和非字段校验这两种方法也可以混搭使用,即在同一个校验配置文件中配置这两种。

    校验器名词type可选值可以通过查找xwork的jar包下的default.xml,位置在:展开xwork-core-2.3.24.1.jar->com.opensymphony.xwork2.validator.validators.default.xml。

    default.xml

    文件中name就是校验器名称,对应的就是type可选值,class是校验器对应的实现类,校验器配置的param参数就是实现类中的属性。

    image

    以下是实例程序运行结果:

    imageimageimage

    imageimageimage

    imageimageimage

    校验的执行顺序:内置类型转换->XML校验器校验->validateToRegist->validate->toRegist

    校验文件中message的国际化方式:

    在Action同级目录下添加一个ActionName.properties文件,定义key-value,然后,在message标签的key属性中填充key值,例如:

    imageimageimage

    结果如下:

    imageimage

    这时可以给定义多个ActionName.properties文件以适应浏览器使用的不同语言包,例如:ActionName_en_US.properties、ActionName_zh_CN.properties,这样程序就会根据浏览器选择的语言包自适应提示信息,如果找不到对应语言包的properties文件,将使用默认ActionName.properties的配置。

    imageimageimage

    运行结果:

    imageimageimage

    原理解析:

    校验器基类FieldValidatorSupport,是所有校验器的父类,提供了fieldName和type属性。

    FieldValidatorSupport.class

    校验器stringlength,对应com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator,继承自FieldValidatorSupport,提供以下属性可配置:

    private boolean trim = true;
    private int maxLength = -1;
    private int minLength = -1;
    private String maxLengthExpression;
    private String minLengthExpression;
    private String trimExpression;

    public void validate(Object object) throws ValidationException {
        String fieldName = getFieldName();
        String val = (String) getFieldValue(fieldName, object);

        if (val == null || val.length() <= 0) {
            // use a required validator for these
            return;
        }
        if (isTrim()) {
            val = val.trim();
            if (val.length() <= 0) {
                // use a required validator
                return;
            }
        }

        int minLengthToUse = getMinLength();
        int maxLengthToUse = getMaxLength();

        if ((minLengthToUse > -1) && (val.length() < minLengthToUse)) {
            addFieldError(fieldName, object);
        } else if ((maxLengthToUse > -1) && (val.length() > maxLengthToUse)) {
            addFieldError(fieldName, object);
        }
    }

    默认trim为true,即校验字符串类型时默认去除前后空格,maxLength和minLength默认值-1,不判断最大最小长度。

    由此可见,通过继承FieldValidatorSupport类,我们也可以自定义校验器,从而实现更符合我们业务逻辑的校验。

    另外在校验过程中还要注意一些问题:
    多方法Action情况如何使用配置文件进行校验?
    Action可能会有多个方法,例如我们上面的toRegist,如果存在多方法的情况下,需要进行校验的信息肯定是不一样的,一个配置文件肯定解决不了问题,所有在多方法需要校验的情况下,我们需要在Action同级别的目录下,创建命名规则如下的配置文件:ActionName-method-validation.xml 配置文件,比如:RegisterAction中有个toRegist()方法需要校验,可以创建RegisterAction-toRegist-validation.xml 配置文件进行配置,这个文件就会针对toRegist()方法进行校验,但是需要注意的是:在调用toRegist()方法时,使用RegisterAction-toRegist-vaidation.xml文件进行校验后,还会调用RegisterAction-vaidation.xml 文件进行校验(这点和编码方式校验中validate和validateToRegist有些相似),这样的话,肯定会产生干扰,为了解决这样问题,可以在开发过程中,不提供RegisterAction-validtion.xml 这样的文件,对于execute()方法,可以提供一个RegisterAction-execute-validation.xml 文件进行配置校验。

  • 相关阅读:
    LeetCode Lect7 堆及其应用
    Leetcode Lect7 哈希表
    5105 pa3 Distributed File System based on Quorum Protocol
    5105 pa2 Distributed Hash Table based on Chord
    5105 pa1 MapReduce
    分布式系统知识总结
    OS知识点总结
    c++知识点总结3
    c知识点总结2
    c++知识点总结
  • 原文地址:https://www.cnblogs.com/alfredinchange/p/5297300.html
Copyright © 2020-2023  润新知