Struts2校验器

使用Validator配置文件校验数据

我们在提交表单数据时,通常都需要增加数据的校验处理。数据校验分为:客户端校验、服务器端校验。Struts2给我们提供了丰富的支持!
Struts2提供了很多数据校验器,常用的有:

校验器 ——-> 用法
required ——-> 验证被校验表单域是否为null
requiredstring ——-> 验证被校验String是否为null或空字符串,可选参数trim,可在对字符串执行trim操作
stringlength ——-> 检验字符串的长度范围,可选参数trim、mixLength、maxLength
int/double ——-> 检查输入是否为数字,并且可判断数值范围。可选参数:min、max等
date ——->检查date的范围,可选参数:min、max
email ——-> 检查输入的是否符合email格式
url ——-> 检查输入的是否符合url格式
regex ——-> 检查是否能匹配到正则表达式。基本可以符合我们全部的验证要求!!

uservalidaion.jsp文件,设置user.name和定义出错提示

<form action="uservalidation"  method="post">
        姓名:<input type="text" name="user.name">
        <s:fielderror fieldName="user.name"/>
        年龄:<input type="text" name="user.age">
        <s:fielderror fieldName="user.age"/>
        生日:<input type="text" name="user">

在struts.xml文件中配置,validator配置文件设置校验时,默认返回input,如果在这没有定义则会报错

<package name="test" extends="struts_basic">
    <action name="uservalidation" class="com.sxt.action.UserAction2">
    <result name="success">/uservalidation.jsp</result>
    <result name="input">/uservalidation.jsp</result>
    </action>
    </package>

在UserAction2.java文件同级目录添加文件:校验文件:Action类名[-方法名]-validation.xml。
所以在这里名称为:UserAction2-validation.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <!-- 用户名校验 -->
    <field name="user.name">
        <!-- 配置校验器--> 
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用户名不能为空(配置校验器)!</message>
        </field-validator>
    </field>
</validators>

1、Action级别校验命名格式:
ActionClassName-validation.xml

2、Action中某个方法的校验命名格式:
ActionClassName-ActionAliasName-validation.xml

注意:这里的ActionAliasName(action别名)指的是struts.xml中Action name=”XX”的xx的名称,而不是method=”XX”的名称

3、如果以上2个校验文件都存在,那么2个文件都会被执行;如果2个校验文件中的校验属性相同那么将被执行同校验属性中ActionClassName-ActionAliasName-validation.xml中的校验规则。

4、在使用visitor校验器的时候,out必须要配置且out消息必须得写,否则会报空指针错误。

5、visitor校验器配置方法,这里不详细列举。仅说明其用途:如果几个Action同时用到一个模型类,都要验证这个模型类中的某个属性。那么只需要配置这个模型类的验证文件,然后以visitor校验器的方式在Action的验证文件中引用模型类的验证文件名即可。


手动数据校验

我们可以手动进行数据校验,这种方式更加灵活。通过封装后,代码也比较简单。
Struts2提供了一个Validateable接口,这个接口中只存在validate()方法,实现这个接口的类可直接被Struts2调用,ActionSupport类就实现了Vadidateable接口,但他的validate()方法是一个空方法,需要我们来重写。
validate()方法会在execute()方法执行前执行,仅当数据校验正确,才执行execute()方法, 如错误则将错误添加到fieldErrors域中,如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑需要不同的校验规则,这种情况下validate()会对所有处理逻辑使用相同的校验规则,为了实现不同的校验逻辑,需要通过validateX()方法,其中X表示处理逻辑的方法名。
UserAction2.java文件,需要继承ActionSupport方法从而校验

public class UserAction2 extends ActionSupport implements ModelDriven<User>{
    private User user = new User();
    @Override  可以把属性驱动和模型驱动一起写
    public User getModel() {
        return user;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("访问成功!");
        return this.SUCCESS;
    }
    @Override  重写父类的validate方法,在里面进行验证
    public void validate() {
        if("login".equals(cmd)){
            if(user.getName()==null||"".equals(user.getName())){
                this.addFieldError("user.name", "用户名不能为空");
            }
            if(user.getPassword()==null||"".equals(user.getPassword())){
                this.addFieldError("user.password", "密码不能为空");
            }
        }else if("register".equals(cmd)){
            if(user.getName()==null||"".equals(user.getName())){
                this.addFieldError("user.name", "用户名不能为空");
            }
            if(user.getPassword()==null||"".equals(user.getPassword())){
                this.addFieldError("user.password", "密码不能为空");
            }
            if(repassword!=null&&!repassword.equals(user.getPassword())){
                this.addFieldError("user.repassword", "两次密码输入不一样");
            }
            if(user.getPhone()==null||"".equals(user.getPhone())){
                this.addFieldError("user.phone", "电话号码不能为空");
            }
            if(user.getRealname()==null||"".equals(user.getRealname())){
                this.addFieldError("user.realname", "别名不能为空");
            }
        }
        super.validate();
    }
    public void validateLogin(){//在执行login方法之前会执行这个
        System.out.println("validateLogin");
        if(user.getName()==null||"".equals(user.getName())){
            this.addFieldError("user.name", "用户名不能为空212");
        }
        if(user.getPassword()==null||"".equals(user.getPassword())){
            this.addFieldError("user.password", "密码不能为空212");
        }
    }
}

uservalidation.jsp文件

<s:form action="uservalidation"  method="post">
    姓名:<input type="text" name="user.name">这个user.name也可以写name,action文件中有模型驱动,可以将其转换到User对象中去
    <s:fielderror fieldName="user.name"/>  访问后,在此处显示内容,和action中设置的文件名一致
    年龄:<input type="text" name="user.age">
    <s:fielderror fieldName="user.age"/>

校验器短路:

    <field-validator type="fieldexpression" short-circuit="true">

校验器的执行顺序

  1. 所有非字段校验风格的校验器优先于字段校验风格的校验器;
  2. 所有非字段校验风格的校验器中,排在前面的会先执行;
  3. 所有字段校验风格的校验器,排在前面的会先执行;

校验器的短路原则
1. 所有非字段检验器时最优先执行的,如果某个非字段校验器校验失败了,则该字段上的所有字段校验器都不会获得校验机会;
2. 非字段校验校验失败,不会阻止其他非字段校验执行;
3. 如果一个字段校验器校验失败后,则该字段下且排在该校验失败后的检验器之后的其他字段校验器不会获得校验机会;
4. 字段校验器永远不会阻止非字段校验器的执行!

短路校验器
短路校验器:只需在或元素中添加short-circuit=”true”属性。
注:在struts2.1.6版本,已经支持客户端的短路校验。
例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <!-- 用户名校验 -->
    <field name="user.name">
        <!-- 配置校验器--> 
        <field-validator type="requiredstring" short-circuit="true">

            <param name="trim">true</param>
            <message>用户名不能为空!</message>
        </field-validator>
    </field>
</validators>

猜你喜欢

转载自blog.csdn.net/zhangfengbx/article/details/78177596
今日推荐