Struts2(13)之数据校验

Struts2(13)之数据校验

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

概述

Struts2 的数据校验属于服务器端校验,Struts2 支持如下两种校验方式 :

  • 手动校验(代码校验):在服务器端通过编写 Java 代码,完成数据校验。
  • 自动校验(配置校验):XML 配置校验(主流)和 注解配置校验

示例

手动编码方式

例 1:对整个 Action 进行校验

import com.opensymphony.xwork2.ActionSupport;

public class Test1Action extends ActionSupport {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String execute() throws Exception {
        System.out.println(".................");
        return super.execute();
    }

    /**
     * 编写一个类,继承 ActionSupport,重写 validate 方法
     * 每次请求此 Action 都会先执行 validate 方法
     * 如果验证有错误,将错误通过 this.addFieldError 或 this.addActionError 交给 Struts2
     * 然后 Struts2 会返回 input 逻辑视图,手动定义好 input 跳转到的页面
     * 在页面可以通过 <s:actionerror/> <s:fielderror/> 标签获取到错误信息
     */
    @Override
    public void validate() {
        if(name == null || name.trim().length() == 0){
            this.addFieldError("name","用户名不能为空");
        }
    }
}

例 2:对 Action 中指定方法进行校验

import com.opensymphony.xwork2.ActionSupport;

public class Test2Action extends ActionSupport {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String add() {
        System.out.println("from add....");
        return SUCCESS;
    }

    /**
     * 编写一个类,继承 ActionSupport
     * 如果要给指定的方法校验,需要按规则定义一个方法:
     * 校验的方法名要遵循:validate+方法名首字母大写
     * 如下,要给 add 方法校验,定义的方法名就为 validateAdd
     * 然后每次请求这个方法就会限制性校验方法
     * 如果验证有错误,将错误通过 this.addFieldError 或 this.addActionError 交给 Struts2
     * 然后 Struts2 会返回 input 逻辑视图,手动定义好 input 跳转到的页面
     * 在页面可以通过 <s:actionerror/> <s:fielderror/> 标签获取到错误信息
     */
    public void validateAdd() {
        System.out.println("from validateAdd...");
    }
}

配置文件方式

例 1:对整个 Action 进行校验

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!--
1、在 Action 所在包下创建一个 xml 文件,名称为 Action类名-validation.xml
    如 : 此文件是给名为 Test3Action 的 Action 校验,文件名则为 Test3Action-validation.xml
2、引入 DTD 约束,该约束可在 xwork-core-2.3.37.jar!/xwork-validator-1.0.3.dtd 下找到
 -->
<validators>
    <!--
    name : 要校验的字段名
        注意:需要获取到值才能对字段进行校验,所以在 Action 中要给对应字段提供 get 方法。
    -->
    <field name="name">
        <!--
        type : Struts2 已经给我们提供了很多验证器
        在 xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.xml 中可以看到
        -->
        <field-validator type="requiredstring">
            <!--返回的错误信息-->
            <message>用户名不能为空</message>
        </field-validator>
    </field>
</validators>

例 2:对 Action 中指定方法进行校验

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<!--
1、在 Action 所在包下创建一个 xml 文件,名称为 Action类名-方法访问路径-validation.xml
    如 : 此文件只给名为 Test4Action 的 Action 下的 add 方法校验,
        Struts.xml 对应Action 配置为 <action name="*_*" class="com.zze.action.{1}Action" method="{2}">
        文件名则为 Test4Action-Test4_add-validation.xml
2、引入 DTD 约束,该约束可在 xwork-core-2.3.37.jar!/xwork-validator-1.0.3.dtd 下找到
 -->
<validators>
    <!--
    name : 要校验的字段名
        注意:需要获取到值才能对字段进行校验,所以在 Action 中要给对应字段提供 get 方法。
    -->
    <field name="name">
        <!--
        type : Struts2 已经给我们提供了很多验证器
        在 xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.xml 中可以看到
        -->
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">12</param>
            <!--返回的错误信息-->
            <message>用户名必须在6-12位之间</message>
        </field-validator>
    </field>
</validators>

补充

Struts2 内置的校验器

<!-- xwork-core-2.3.37.jar!/com/opensymphony/xwork2/validator/validators/default.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<validators>
    <!--必填校验器,要求被校验的属性值不能为 null-->
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <!--必填字符串校验器,要求被校验的属性值不能为 null,并且长度大于 0 ,默认情况下不会对字符串去前后空格-->
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <!--数值校验器,要求被校验的属性值可转 int ,且可指定范围,min 指定最小值,max 指定最大值-->
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <!--数值校验器,要求被校验的属性值可转 long,且可指定范围,min 指定最小值,max 指定最大值-->
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <!--数值校验器,要求被校验的属性值可转 short,且可指定范围,min 指定最小值,max 指定最大值-->
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <!--数值校验器,要求被校验的属性值可转 double,且可指定范围,min 指定最小值,max 指定最大值-->
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <!--日期校验器,要求被校验的属性值可转 Date,且可指定范围,min 指定最小值,max 指定最大值-->
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <!--OGNL表达式校验器,它是一个非属性校验器,expression 指定 ognl 表达式,该逻辑表达式基于 ValueStack进行求值,返回 true 时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中-->
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <!--字段OGNL表达式校验器,要求被校验的属性值满足一个 OGNL 表达式,expression 参数指定 OGNL 表达式,该逻辑表达式基于 ValueStack进行求值,返回 true 时校验通过,否则不通过-->
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <!--邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址-->
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <!--网址校验器,要求如果被校验的属性值非空,则必须是合法的 url 地址-->
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <!--用于校验 Action 中符合类型的属性,它指定一个校验文件用于校验复合类型属性中的属性-->
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <!--转换校验器,指定在类型转换失败时,提示的错误消息-->
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <!--字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength 指定最小长度,maxLength 指定最大长度,trim 指定交验之前是否去除字符串前后空格-->
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <!--正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression 指定正则表达式,caseSensitive 指定进行正则表达式匹配时,是否区分大小写,默认为 true-->
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

自定义校验器

1、创建一个校验器类。

// com.zze.validator.AgeValidator
package com.zze.validator;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

/**
 * 对指定字段进行过滤
 *
 * 除了继承 FieldValidatorSupport
 * 还可以继承 ValidatorSupport
 */
public class AgeValidator extends FieldValidatorSupport {
    @Override
    public void validate(Object object) throws ValidationException {
        // 获得字段名称
        String fieldName = this.getFieldName();

        Object fieldValue = this.getFieldValue(fieldName, object);

        if(fieldValue instanceof Integer){
            int age = (Integer)fieldValue;
            if(age<0){
                this.addFieldError(fieldName,object);
            }
        }
    }
}

2、注册校验器。

<!-- validators.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">
<!--在 src 下新建 validators.xml -->
<validators>
    <!--注册验证器-->
    <validator name="ageValidator" class="com.zze.validator.AgeValidator"/>
</validators>

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/struts2-13.html

Buy me a cup of coffee ☕.