Struts2框架之数据验证

数据验证分为客户端验证和服务器端验证, Struts2框架的验证属于服务器端的验证

①编程式验证

在动作类中重写validate():

package com.rl.action;

import org.apache.struts2.interceptor.validation.SkipValidation;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.rl.model.Person;

/**
 * ModelDriven的泛型就是需要接收的对象的类
 * @author Administrator
 *
 */
public class PersonAction1 extends ActionSupport implements ModelDriven<Person>{
    
    /**
     * 必须手动new一个对象
     */
    private Person person = new Person();
    
    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

    public String save(){
        System.out.println(person);
        return SUCCESS;
    }
    
    public String delete(){
        System.out.println(person);
        return SUCCESS;
    }

    /**
     * 返回person对象即可
     */
    @Override
    public Person getModel() {
        return person;
    }
    
    /**
     * validate方法在封装参数之前做数据验证
     * 如果验证不通过就跳转到表单页面
     */
    public void validate() {
        if(person.getId() == null || !(person.getId()+"").matches("\\d{1,5}")){
            this.addFieldError("id", "id必须是1到5位的数字");
        }
        if(!person.getName().matches("[a-zA-Z]{3,8}")){
            //添加提示信息, 参数①表单中文本域的name的值 参数②是提示信息
            this.addFieldError("name", "姓名只能是3-8位大小写字母");
        }
    }
}

访问(什么都不填写的情况下):

结果:

注意: 此种方法默认是对该动作类中的所有方法都做校验的, 要想取消对某个/某些方法的校验有两种方法:

1 使用"@SkipValidation"注解:

@SkipValidation
    public String delete(){
        System.out.println(person);
        return SUCCESS;
    }

2 修改校验的方法名, 方法命名规则: validate+"要验证的方法名"(驼峰模式):

/**
     * validate方法在封装参数之前做数据验证
     * 如果验证不通过就跳转到表单页面
     */
    public void validateSave() {
        if(person.getId() == null || !(person.getId()+"").matches("\\d{1,5}")){
            this.addFieldError("id", "id必须是1到5位的数字");
        }
        if(!person.getName().matches("[a-zA-Z]{3,8}")){
            //添加提示信息, 参数①表单中文本域的name的值 参数②是提示信息
            this.addFieldError("name", "姓名只能是3-8位大小写字母");
        }
    }

②声明式验证

将验证信息配置在xml文件中, 做到跟动作类分离, 以便后续可以修改, 该配置文件的命名规范: 动作类的名称+validation.xml

1 新建一个xml文件, 该配置文件必须建立在动作类的同级包下, 配置头信息:

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

"PersonAction1-validation.xml"配置文件:

<?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">
<validators>
<!-- 
    field: 表单中要提交的文本域
    name: 文本域中的name
 -->
    <field name="name">
    
    <!-- 文本域的验证器
        requiredstring: 系统提供的校验器(此含义为必填)
     -->
        <field-validator type="requiredstring">
        
        <!-- 错误信息
         -->
            <message>姓名不能为空</message>
        </field-validator>
    </field>
</validators>

动作类中去掉验证方法, 交给配置文件

访问结果:

系统提供的校验器有如下这些:

regex: 正则表达式校验器, 检查被校验的属性值是否匹配一个正则表达式

expression: OGNL表达式校验器, 他是一个非字段校验器, expression参数指定OGNL表达式, 该逻辑表达式基于valueStack(值栈)进行求值, 返回true时校验通过, 该校验器不可用在字段校验器风格配置中

int: 整数校验器, 要求filed的整数值必须在指定范围内, min指定最小值, max指定最大值

requiredstring: 必填字符串验证器, 要求属性值不能为空, 而且默认情况下会对左右两边去掉空字符串

required: 必填校验器, 要求属性值不能为空

stringlength: 字符串长度校验器, 要求被校验的属性值必须在指定的范围内, 否则校验失败, minLength参数指定最小长度, maxLength参数指定最大长度, trim参数指定校验field之前是否去除前后空字符串

double: 双精度浮点数校验器, 要求field的双精度浮点数必须在指定的范围内, min指定最小值, max指定最大值

fieldexpression: 字段OGNL表达式校验器, 要求field满足一个OGNL表达式, expression参数指定OGNL表达式, 该逻辑表达式基于valueStack进行求值, 返回true时校验通过

email: 邮件地址校验器, 要求如果被校验的属性值非空, 则必须是合法的邮件地址

url: 网址校验器, 要求如果被校验的属性值非空, 则必须是合法的url地址

date: 日期校验器, 要求field的日期值必须在指定的范围内, min指定最小值, max指定最大值

conversion: 转换校验器, 指定在类型转换失败时, 提示错误信息

visitor: 用于校验action中复合类型的属性, 它指定一个校验文件用于校验复合类型属性中的属性

regex举例1: 

"PersonAction1-validation.xml"配置文件:

<?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">
<validators>
<!-- 
    field: 表单中要提交的文本域
    name: 文本域中的name
 -->
    <field name="name">
    
    <!-- 文本域的验证器
        requiredstring: 系统提供的校验器(此含义为必填)
     -->
        <field-validator type="requiredstring">
        
        <!-- 错误信息
         -->
            <message>姓名不能为空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="regex">[a-zA-Z]{3,8}</param>
            <message>请输入3-8位的字母</message>
        </field-validator>
    </field>
</validators>

结果:

regex举例2: 

"PersonAction1-validation.xml"配置文件:

<?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">
<validators>
<!-- 
    field: 表单中要提交的文本域
    name: 文本域中的name
 -->
    <field name="name">
    
    <!-- 文本域的验证器
        requiredstring: 系统提供的校验器(此含义为必填)
     -->
        <field-validator type="requiredstring">
        
        <!-- 错误信息
         -->
            <message>姓名不能为空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="regex">[a-zA-Z]{3,8}</param>
            <message>请输入3-8位的字母</message>
        </field-validator>
    </field>
    
    <!-- 第二种验证的配置方式
     -->
     <validator type="regex">
     <!-- 配置验证的字段 -->
        <param name="fieldName">password</param>
        <!-- 配置验证的正则表达式 -->
        <param name="regex">\d{6,8}</param>
        <message>请输入6-8位的数字密码</message>
     </validator>
</validators>

需要在Person类中添加几个字段, 我这边添加了password/rePassword/age三个字段

访问结果:

想要在让提示信息在右边显示, 需要在form表单中添加多一列展示错误信息的列

form1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="${pageContext.request.contextPath }/person/save" method="post">
    <table>
        <tr>
            <td>ID</td>
            <td>
                <input type="text" name="id" >
            </td>
            <td><s:fielderror fieldName="id"></s:fielderror></td>
        </tr>
        <tr>
            <td>名字</td>
            <td>
                <input type="text" name="name">
            </td>
            <td><s:fielderror fieldName="name"></s:fielderror></td>
        </tr>
        <tr>
            <td>性别</td>
            <td>
                <input type="radio" name="gender" value="1">男
                <input type="radio" name="gender" value="2">女
            </td>
            <td><s:fielderror fieldName="gender"></s:fielderror></td>
        </tr>
        <tr>
            <td>地址</td>
            <td>
                <input type="text" name="address">
            </td>
        </tr>
        <tr>
            <td>生日</td>
            <td>
                <input type="text" name="birthday">
            </td>
            <td><s:fielderror fieldName="birthday"></s:fielderror></td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>
                <input type="text" name="age">
            </td>
            <td><s:fielderror fieldName="age"></s:fielderror></td>
        </tr>
        <tr>
            <td>密码</td>
            <td>
                <input type="text" name="password">
            </td>
            <td><s:fielderror fieldName="password"></s:fielderror></td>
        </tr>
        <tr>
            <td>重复密码</td>
            <td>
                <input type="text" name="rePassword">
            </td>
            <td><s:fielderror fieldName="rePassword"></s:fielderror></td>
        </tr>
    </table>
    <input type="submit" value="提交">
</form>
</body>
</html>

expression举例:

<!-- 验证重复密码的正确性
      -->
      <validator type="expression">
        <param name="fieldName">rePassword</param>
        
        <!-- 如果不满足(password != rePassword
                            则抛出错误信息
         -->
        <param name="expression">password == rePassword</param>
        <message>两次密码不一致</message>
      </validator>

访问结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值