springmvc基础知识(16):JSR303数据校验

  JSR 303 是Java为Bean数据合法性校验提供的标准框架,其已经包含在JavaEE 6.0中;JSR 303 通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。 
  JSR 303 支持的校验注解如下:

注解 功能说明
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null
@AssertTrue 被注释的元素必须为true
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字,其值必须大于或等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于或等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于或等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于或等于指定的最大值
@Size(max, min) 被注释的元素的大小必须在指定的范围内
@Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式

  Hibernate Validator 是 JSR 303 的一个参考实现,除支持所有标准的校验注解外,还支持一下扩展注解:

注解 功能说明
@Email 被注释的元素必须是电子邮箱地址
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串必须非空
@Range 被注释的元素必须在合适的范围内

SpringMVC中应用JSR 303

        

 1.基本概念

  ① 关于所需要的jar包 
  Spring4.0拥有独立的数据校验框架,同时支持 JSR 303 标准的校验框架;但其本身并没有提供 JSR 303 的实现,故必须将 JSR 303 的实现者的jar包放到类路径下

  ② 关于LocalValidatorFactoryBean工厂类 
  该工厂类既实现了Spring的Validator接口,也实现了 JSR 303 的Validator接口;故需要在 Spring 容器中定义LocalValidatorFactoryBean,即可将其注入到需要数据校验的Bean中。

  ③ 关于@Valid注解 
  <mvc:annotation-driven/>会默认装配LocalValidatorFactoryBean,通过在处理方法的入参上标注@Valid注解即可让SpringMVC在进行数据绑定时,同时调用校验框架完成数据校验工作。

  ④ 关于校验结果 
  前一个表单/命令对象的校验结果保存到随后处理方法的入参中,该入参必须是BindingResult或Errors类型;且需注意,需校验的Bean对象和其绑定结果对象或错误对象是成对出现的,其之间不允许声明其他的入参。

 2.具体实现

  第一步:添加Hibernate Validator验证框架所依赖的jar包,具体如下图所示: 

    

                maven项目添加下面依赖:

                <dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.1.3.Final</version>
		</dependency>

  第二步:在SpringMVC配置文件中添加mvc:annotation-driven标签; 
  第三步:在需要校验的JavaBean属性上添加相应的校验注解,以User为例:

public class User {

    @NotEmpty(message="用户名不能为空")  
    private String userName;

    @Past
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birth;
    ...
}

           使用注解的message属性可以设置当发生错误时返回的信息


        第四步:在处理器目标方法的Bean类型的入参前添加@Valid注解,并添加保存校验结果的对象:

    @RequestMapping("/validate")
    public String validate(@Valid User user,BindingResult result){
        //发生错误
        if(result.getErrorCount() > 0){
            System.out.println("出错了,请注意!");
            //循环打印所有的错误信息
            for(FieldError error:result.getFieldErrors()){
                //打印错误,error.getDefaultMessage()可以获取上面message配置的错误信息
                System.out.println(error.getField()+":"+error.getDefaultMessage());
            }
            //指定校验错误时所转向的定制页面
            return "error";
        }
        return "success";
    }

校验错误消息的显示

  SpringMVC还会将所有校验结果保存到隐含模型中,该模型中的所有数据最终将通过HttpServletRequest的属性列表暴露给JSP视图对象,故在JSP页面上可以获取错误信息。

<form:form action="${pageContext.request.contextPath }/validate" method="post">

    <!-- 显示所有错误消息 -->
    <form:errors path="*"></form:errors><br><br>

    Name:<form:input path="name"/>
    <!-- 在指点字段后显示当前字段的错误消息 -->
    <form:errors path="name"></form:errors>
    <br><br>

    Email:<form:input path="email"/>
    <form:errors path="email"></form:errors>
    <br><br>

    Birthday:<form:input path="birth"/>
    <form:errors path="birth"></form:errors>
    <br><br>

    <input type="submit" name="submit">

</form:form>

猜你喜欢

转载自blog.csdn.net/abc997995674/article/details/80437479