数据校验是 Web 应用必须处理的内容,Spring MVC 提供了两种方法来对用户的输入数据进行校验,一种是 Spring 自带的 Validation 校验框架,另一种是利用 JRS-303 验证框架进行验证。

接下用我们使用SpringMVC来完成数据校验:

1、新建动态页面:Deposit.jsp

spring validate 时间验证 spring 数据校验_spring


页面展示:

spring validate 时间验证 spring 数据校验_数据类型_02


2、创建javaBean:DepositBean,并添加注解:

SpringMVC是基于正则表达式验证,通过添加注解来规定规则(正则表达式只针对于字符串)

public class Deposit {
    /**
     * @NotEmpty:不为空
     * regexp:正则表达式判定规则
     * message:错误提示信息
     * @DateTimeFormat:日期格式
     */
    @NotEmpty(message="账号不能为空")
    private String account;

    @Pattern(regexp="\\w{4,25}",message="用户名为4到25个字母、数字或下划线")
    private String name;

    @Pattern(regexp="\\S{6,25}",message="密码为6到25个非空白字符")
    private String password;

    @Pattern(regexp="\\d{18}",message="身份证为18位数字")
    private String id;

    @NotEmpty(message="金额不能为空白")
    private String amount;

    @Pattern(regexp="1|2|3|4|5",message="存款年限为1-5年")
    private String duration;

    @DateTimeFormat(pattern="yyyy-mm-dd")
    private Date date;

    @PhoneNo
    private String phone;

    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getAmount() {
        return amount;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
    public String getDuration() {
        return duration;
    }
    public void setDuration(String duration) {
        this.duration = duration;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    }

3、创建页面控制器类:DepositController.java

@Controller //指明页面控制器
public class DepositController {
    /**
     * 初步校验
     */
@RequestMapping("deposit")                  //BindingResult bindingResult  用户获取校验结果
public String saveMoney( @Valid Deposit deposit,BindingResult bindingResult) {  //@Valid 用于校验绑定数据,放置数据前面

        //判读数据校验结果
        if(bindingResult.hasErrors()) {
            //获取校验信息
            List<FieldError> fieldErrors=bindingResult.getFieldErrors();
            System.out.println("校验错误数量:"+bindingResult.getFieldErrorCount());
            System.out.println("校验错误信息:");
            for(FieldError error:fieldErrors) {
                System.out.println("校验错误属性名:"+error.getField());
                System.out.println("校验错误提示信息:"+error.getDefaultMessage());
            }

            return "Deposit";
        }
        return "DepositSuccess";
    }

运行服务器,点击存款,控制台显示:

spring validate 时间验证 spring 数据校验_数据校验_03

由于我们现在没有输如数据,所以控制台显示的全是错误信息,接下来我们就要把错误信息返回给页面,但是,如果验证成功,我们就在输入框保存输入的值,页面不显示错误信息。

思路:现在我们已经获取到错误属性名和提示信息,通过模型数据把信息传给页面,页面通过EL表达式取出值放在正确的位置即可!

4、二级校验,contronller修改

spring validate 时间验证 spring 数据校验_数据类型_04


页面修改:

spring validate 时间验证 spring 数据校验_mvc_05


解释:value={###} 用于提交验证输入的值

${###}用于显示提示信息


刷新页面显示提示信息

spring validate 时间验证 spring 数据校验_spring_06

输入数据并点击存款按钮

spring validate 时间验证 spring 数据校验_数据类型_07

如果有数据,并书写正确,提示信息消失!
简单验证完成!

最后,再加一些注解说明
@AssertFalse
验证的数据类型 :Boolean,boolean
说明 :验证注解的元素值是false
@AssertTrue
验证的数据类型 :Boolean,boolean
说明 :验证注解的元素值是true
@NotNull
验证的数据类型 :任意类型
说明 :验证注解的元素值不是null
@Null
验证的数据类型 :任意类型
说明 :验证注解的元素值是null
@Min(value=值)
验证的数据类型 :BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存储的是数字)子类型
说明 :验证注解的元素值大于等于@Min指定的value值

@Max(value=值)
验证的数据类型 :和@Min要求一样
说明 :验证注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值)
验证的数据类型 :和@Min要求一样
说明 :验证注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值)
验证的数据类型 :和@Min要求一样
说明 :验证注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整数位数, fraction=小数位数)
验证的数据类型 :和@Min要求一样
说明 :验证注解的元素值的整数位数和小数位数上限
@Size(min=下限, max=上限)
验证的数据类型 :字符串、Collection、Map、数组等
说明 :验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小
@Past
验证的数据类型 :java.util.Date,java.util.Calendar,Joda Time类库的日期类型
说明 :验证注解的元素值(日期类型)比当前时间早

@Future
验证的数据类型 :与@Past要求一样
说明 :验证注解的元素值(日期类型)比当前时间晚
@NotBlank
验证的数据类型 :CharSequence子类型
说明 :验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的首位空格
@Length(min=下限, max=上限)
验证的数据类型 : CharSequence子类型
说明 :验证注解的元素值长度在min和max区间内
@NotEmpty
验证的数据类型 :CharSequence子类型、Collection、Map、数组
说明 :验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@Range(min=最小值, max=最大值)
验证的数据类型 :BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子类型和包装类型
说明 :验证注解的元素值在最小值和最大值之间

@Email(regexp=正则表达式,flag=标志的模式)
验证的数据类型 :CharSequence子类型(如String)
说明 :验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
@Pattern(regexp=正则表达式,flag=标志的模式)
验证的数据类型 :String,任何CharSequence的子类型
说明 :验证注解的元素值与指定的正则表达式匹配
@Valid
验证的数据类型 :任何非原子类型
说明 :指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证

注意:此处只列出Hibernate Validator提供的大部分验证约束注解,请参考hibernate validator官方文档了解其他验证约束注解和进行自定义的验证约束注解定义