SpringMVC--01(SpringMVC的数据校验)

1.SpringMVC进行简单的数据校验

  1.导包,版本一定要这样写

 
    
    
      org.hibernate
      hibernate-validator
      5.1.0.Final
    
    
    
      javax.validation
      validation-api
      1.1.0.Final
    

2.配置包扫描


    
        
    

    
    

3.添加实体类:

package com.wx.domain;

import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

public class UserInfo {
    /**
     * Min:设置最小值
     * Max:设置最大值
     * Message:打印信息
     */
    //指定年龄在18-120之间
    @Min(value = 18,message = "年龄不能小于18岁")
    @Max(value = 120,message = "年龄不能大于100岁")
    private Integer age;

    /**
     * 三种验证方式
     * @NotEmpty  用于集合
     * @NotNull   用于基本类型
     * @NotBlank  用于引用类型
     * @Size    设置大小
     */
    //非空验证
    @NotEmpty(message = "用户名不能为空")
    @Size(max = 20,min = 6,message = "用户名不能大于20个字符或小于6个字符")
    private String name;

    /**
     * @Pattern  rehexp匹配正则
     */
    @NotEmpty(message = "邮箱不能为空")
    @Pattern(regexp = "^\\w+@\\w+/.\\w+$",message = "邮箱格式错误")
    private String email;

    @Pattern(regexp = "^1[35789]\\d{9}$",message = "手机号格式错误")
    private String phone;

    public String getPhone() {
        return phone;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

 4.我们的处理器类中进行相应的判断处理

 

package com.wx.controller;

import com.wx.domain.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.jws.WebParam;
import javax.validation.Valid;

/**
 * 完成SpringMVC的数据校验
 * 1.导包
 * 2.配置包扫描
 * 3.xml配置
 * 4.添加实体类
 * 5.测试
 */
@Controller
public class ValidDataController {

    @RequestMapping("/validdata")
    public String validdata(@Valid UserInfo userInfo, BindingResult br, Model mv) {
        int errorCount = br.getErrorCount();
        if (errorCount > 0) {
            //证明至少有一个参数错误
            //获取信息
            FieldError name = br.getFieldError("name");
            FieldError age = br.getFieldError("age");
            FieldError phone = br.getFieldError("phone");
            FieldError email = br.getFieldError("email");

            //获取错误信息
            if (name != null) {
                String namemsg = name.getDefaultMessage();
                //把错误信息返回到页面
                mv.addAttribute("namemsg", namemsg);
            }
            if (age != null) {
                String agemsg = age.getDefaultMessage();
                mv.addAttribute("agemsg", agemsg);
            }
            if (phone != null) {
                String phonemsg = phone.getDefaultMessage();
                mv.addAttribute("phonemsg", phonemsg);
            }
            if (email != null) {
                String emailmsg = email.getDefaultMessage();
                mv.addAttribute("emailmsg", emailmsg);
            }
        }
        return "validdata";
    }
}

 5.测试:

 

SpringMVC--01(SpringMVC的数据校验)_第1张图片

2.分组校验

如果同一个类,在不同的使用场景下有不同的校验规则,那么可以使用分组校验。未成年人是不能喝酒的,而在其他场景下我们不做特殊的限制,这个需求如何体现同一个实体,不同的校验规则呢?

为年龄指定一个分组,有这个分组的请求才对年龄校验

SpringMVC--01(SpringMVC的数据校验)_第2张图片

指定分组请求重新写一个方法:

SpringMVC--01(SpringMVC的数据校验)_第3张图片

测试:

SpringMVC--01(SpringMVC的数据校验)_第4张图片

SpringMVC--01(SpringMVC的数据校验)_第5张图片

可以发先其他的验证没了,该分组下只验证这个年龄了。

3.自定义校验

自定义校验注解:

package com.wx.annotation;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 *
 */
@Documented
@Target({ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = IsMobileValidator.class)
public @interface CannotHaveBlank {
    //是否必须
    boolean required() default false;

    String message() default "字符串不能含空格";

    //分组
    Class[] groups() default {};

    //负载
    Class[] payload() default {};


}

自定义校验类:

package com.wx.annotation;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;

/***
 * 真正的验证类
 */
public class IsMobileValidator implements ConstraintValidator {

    @Override
    public void initialize(CannotHaveBlank cannotHaveBlank) {

    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        //null时不进行校验
        if (s != null && s.contains(" ")) {
            //获取默认提示信息
            String defaultConstraintMessageTemplate = constraintValidatorContext.getDefaultConstraintMessageTemplate();
            System.out.println("default message :" + defaultConstraintMessageTemplate);
            //禁用默认提示信息
            //constraintValidatorContext.disableDefaultConstraintViolation();
            //设置提示语
            //constraintValidatorContext.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation();
            return false;
        }
        return true;
    }
}

使用:

SpringMVC--01(SpringMVC的数据校验)_第6张图片

SpringMVC--01(SpringMVC的数据校验)_第7张图片

测试:

SpringMVC--01(SpringMVC的数据校验)_第8张图片

SpringMVC--01(SpringMVC的数据校验)_第9张图片

 

 

 

你可能感兴趣的:(SpringMVC)