SpringMVC 基于注解使用: 类型转换&数据格式化&数据验证-数据验证

112 阅读2分钟

Java1.6版本提出JSR303规范,JSR303是Java为Bean数据合法性提供的标准。现在已经升级到JSR349以后了(www.jcp.org/en/home/ind…

Spring 不负责实现
Hibernate Validator: 实现了JSR349验证注解规范(实现了验证但是不属于Hibernate)

image.png

不同的验证给JavaBean上加上不同的注解

JSR303规范:

@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null

@AssertTrue 被注释的元素必须为true //#assert 英[əˈsɜːt] 明确肯定的
@AssertFalse 被注释的元素必须为false

@Min(value) 被注释的元素必须是一个数字 其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字 其值必须小于等于指定的最小值

@DecimalMin(value)被注释的元素必须是一个数字 其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字 其值必须小于等于指定的最小值

@Size(max,min) 被注释的元素的大小必须在指定的范围内

@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 fraction 英[ˈfrækʃn] 分数 小数

@Past 被注释的元素必须是过去的一个日期

@Future 被注释的元素必须是将来的一个日期

@Pattern(value) 被注释的元素必须符合指定的正则表达式


Hibernate Validator 扩展注解:

@Email 被注释的元素必须是电子邮箱

@Length 被注释的字符串的大小必须在指定的范围内

@NotEmpty 被注释的字符串的必须非空

@Range 被注释的元素必须在合适的范围内


数据验证的实现

1、pom xml 中加入hibernate-validator依赖。 ## Hibernate Validator Engine

2、将新增的jar包加入到WEB-INF/lib包中。

image.png

3、在需要验证的javaBean中对应属性上的加入验证注解。

public class User {


    @NotNull
    private Integer id;
    private String username;

    //@Future
    @Past
    @DateTimeFormat(pattern = "yyyy=mm=dd")
    private Date birthday;

4、在需要使用的控制器中调用 验证的参数上加上@Valid

BindingResult bindingResult 能够获取到是否有错误信息 ModelMap modelMap 将错误信息交给页面


    public String add(@Valid User user, BindingResult bindingResult, ModelMap modelMap){
//        System.out.println(bindingResult.hasErrors());
//        System.out.println(bindingResult.getAllErrors());
//        System.out.println(bindingResult.getFieldErrors());
        if(bindingResult.hasErrors()){
            //存放错误信息
            Map<String,String> errors = new HashMap<>();

            List<FieldError> fieldErrors = bindingResult.getFieldErrors();
            for(FieldError fieldError:fieldErrors){
                errors.put(fieldError.getField(),fieldError.getDefaultMessage());
            }
            modelMap.addAttribute("errors",errors);
            return "user/add";

        }

        System.out.println(user);

5、 页面调用错误信息

<form action="${pageContext.request.contextPath}/user" method="post">
    <p>
        id: <input type="text" name="id">${errors.id}
    </p>
    <p>
        username: <input type="text" name="username">
    </p>
    <p>
        birthday:<input type="text" name="birthday">${errors.birthday}
        

其他:


    @NotNull
    private Integer id;


    @Length(min = 4,max = 9)
    @Pattern(regexp = "[\u4e00-\u9fa5]+",message = "只能输入中文")
    private String username;

    //@Future
    @Past
    @NotNull
    @DateTimeFormat(pattern = "yyyy=mm=dd")
    private Date birthday;

    @Digits(integer = 2,fraction=2)
    @Max(50)
    @NumberFormat(style = NumberFormat.Style.CURRENCY) //货币
    private Double balance;  //¥5000
    @NumberFormat(style = NumberFormat.Style.NUMBER)
    @Min(1)
    @NotNull
    private Double salary; //工资  10,000.00

@NumberFormat(style = NumberFormat.Style.PERCENT)
@Range(min=0,max = 1)