springMVC实验(五)——数据校验

【知识要点】

  1. 数据校验的概念
    在软件开发过程中,数据校验是非常重要的环节,用于确保数据的有效性和完整性 。数据校验分为客户端验证和服务端验证,客户端验证是确保人机交互过程中用户操作表单过程中的误操作,由JavaScript代码完成,验证不通过时,通过提示信息反馈给操作用户;服务端验证是对前端请求携带的参数进行验证,确保参数的有效性,由Java提供的JSR-303验证机制完成,如果验证不通过,HTTP 报400错误,要求开发人员对编写的请求代码进行修改。
  2. JSR-303 简介
    JSR-303是JavaEE6中的一项子规范,用于服务端数据验证,通过注解的方式对Java Bean的属性值进行校验,不但确保数据在语义上是正确的,而且使的验证逻辑从业务代码中脱离出来。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回 。Spring并没有实现该规范,而是通过Hibernate Validator对完成验证。
  3. 常用验证规则
    验证规则包括空检查、布尔检查、长度检查、数字检查、日期验证等,这些验证规则通过标注在bean属性上的各种注解符完成,常用验证注解符如下表所示。
  4. 分组校验
    在实际开发中根据新增或修改进行不同的验证,如:添加用户信息时,id是由后端生成的,不需要校验id是否为空,修改用户信息时需要校验id是否为空。此时可以使用分组验证,在需要校验时校验,不需要时不校验。分组校验由定义验证组,在定义验证规则时标注验证组,在触发验证规则时,标注使用的验证组三步。
  5. 嵌套验证
    定义学生实体类,并在该实体类上使用注解符进行有效性验证,该实体类包括班级的属性,班级也是一个实体类,也是使用注解符进行有效性验证。当验证学生对象时,同时也验证班级对象的验证,称为嵌套验证。
  6. 验证功能开启
    在控制器方法参数前添加@Validated或@Valid注解来开启效验功能。其中@Valid注解是jdk给提供的,@Validated是Spring对@Valid的二次封装,提供了分组验证功能。二者区别是@Valid可以标注在属性上,可以实现嵌套功能,而@Validated不能标注属性上,没有嵌套校验功能。@Validated有分组校验功能,@Valid则没有。

【实验目的】

掌握控制器入参的有效性验证

【实验内容】

  1. 数据验证环境的搭建
  2. 简单参数的有效性
  3. 对象类型参数验证
  4. 分组验证

【实验步骤】

1. 搭建实验环境

1). 使用maven创建springmvc的web项目springmvc-demo5

2). 对参数进行有效性验证,需要在项目中添加hibernate.validator依赖包,其maven坐标如下:

xml 复制代码
<dependency>  
    <groupId>org.hibernate.validator</groupId>  
    <artifactId>hibernate-validator</artifactId>  
    <version>6.0.7.Final</version>  
</dependency>  

3)在spring配置文件中配置如下所示

xml 复制代码
    <mvc:annotation-driven validator="validator"></mvc:annotation-driven>
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
    </bean>

2. 单个参数校验

1) JSR-303面向参数是Bean进行的校验,并不提供对单个参数的验证,单个参数验证需要使用@Validated + MethodValidationPostProcessor 拦截器。

2)编写测试代码

java 复制代码
@Controller  
@RequestMapping("valid")  
@Validated // 开启校验(在类上面不能用@Valid,否则下面的校验注解无效)  
public class ValidController {  
    /** 
     * 验证单个参数 
     * 将@Validated加在方法参数里面,普通参数校验将无效(不会做校验) 
     * @param password 
     */  
    @RequestMapping(value = "/validator1")  
    public void validator1(@Valid @NotBlank String password, HttpServletResponse response) throws IOException {  
        System.out.println(password);  
        response.setContentType("application/json;charset=utf-8");  
        response.getWriter().write("密码为:"+password);  
    }  
}

2. 对象类型的参数验证

1) 定义实体对象,添加验证注解符,代码如下:

java 复制代码
public class ValidatorUserVO {  
    @NotBlank  
    private String userName;  
  
    @NotNull  
    @Min(message = "年龄不能小于{value}岁",value = 10)  
    @Max(message = "年龄不能大于{value}岁",value = 50)  
    private Integer age;  
  
   //省略getter、setter和toString方法  
} 

2)开启数据验证,在实体对象前加注解符@Validated,开启对实体上的注解进行验证,代码如下

java 复制代码
@RequestMapping(value = "/validator2")  
public void validator2(@Validated ValidatorUserVO vo,HttpServletResponse response) throws IOException {  
    System.out.println(vo.toString());  
    response.setContentType("application/json;charset=utf-8");  
    response.getWriter().write("对象值为:"+vo.toString());  
}  

3 分组验证

1)定义分组,将每个分组定义为一个接口,以下定义了两个分组,代码如下:

java 复制代码
public interface GroupOne {  
}  
  
public interface GroupTwo {  
}  

2)定义实体类,添加分组校验注解,代码如下:

java 复制代码
public class GroupOneValidator {  
    @NotBlank(groups = {GroupOne.class})  
    private String userName;  
  
    @NotNull(groups = {GroupTwo.class})  
    private Integer age;  
  
   //省略getter和setter、toString方法  
} 

3)开启验证,编写控制器代码,在验证参数前@Validated注解符中使用分组GroupOne.class进行验证,代码如下:

java 复制代码
@RequestMapping(value = "/validator3")  
public void validator3(@Validated(GroupOne.class) GroupOneValidator vo,HttpServletResponse response) throws IOException {  
    System.out.println(vo.toString());  
    response.setContentType("application/json;charset=utf-8");  
    response.getWriter().write("对象值为:"+vo.toString());  
} 
相关推荐
苹果醋328 分钟前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
Hello.Reader1 小时前
深入解析 Apache APISIX
java·apache
菠萝蚊鸭1 小时前
Dhatim FastExcel 读写 Excel 文件
java·excel·fastexcel
旭东怪1 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
007php0071 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
∝请叫*我简单先生1 小时前
java如何使用poi-tl在word模板里渲染多张图片
java·后端·poi-tl
ssr——ssss2 小时前
SSM-期末项目 - 基于SSM的宠物信息管理系统
java·ssm
一棵星2 小时前
Java模拟Mqtt客户端连接Mqtt Broker
java·开发语言
鲤籽鲲2 小时前
C# Random 随机数 全面解析
android·java·c#
荆州克莱2 小时前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术