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坐标如下:

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

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

    <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)编写测试代码

@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) 定义实体对象,添加验证注解符,代码如下:

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,开启对实体上的注解进行验证,代码如下

@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)定义分组,将每个分组定义为一个接口,以下定义了两个分组,代码如下:

public interface GroupOne {  
}  public interface GroupTwo {  
}  

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

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

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

@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());  
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优化用户直播体验:第三方美颜SDK的前沿技术

当下&#xff0c;用户对于直播体验的要求日益提高&#xff0c;其中之一的重要方面就是实时美颜效果。第三方美颜SDK为直播平台和应用提供了强大的美颜功能&#xff0c;极大地改善了用户的直播观感。 一、背景与发展 过去&#xff0c;直播中的美颜往往依赖于主播或用户自行调整…

【深度学习】深度学习框架的环境配置

目录 1. 配置cuda环境 1.1. 安装cuda和cudnn 1.1.1. 显卡驱动配置 1.1.2. 下载安装cuda 1.1.3. 下载cudnn&#xff0c;将解压后文件复制到cuda目录下 1.2. 验证是否安装成功 2. 配置conda环境 2.1. 安装anaconda 2.2. conda换源 2.3. 创建conda环境 2.4. pip换源 3…

常见的环境变量用于设置系统的路径查找

常见的环境变量用于设置系统的路径查找 echo $PATH 常见的环境变量用于设置系统的路径查找 在 Linux 中&#xff0c;有一些常见的环境变量用于设置系统的路径查找。以下是一些常见的环境变量和它们的作用&#xff1a; $PATH&#xff1a; 用于设置可执行文件的查找路径。 expo…

【EI征稿中#先投稿,先送审#】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)

第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 第二届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2023&…

深度学习火车票识别系统 计算机竞赛

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

【算法系列篇】递归、搜索与回溯(一)

文章目录 什么是递归、搜索与回溯算法1. 汉诺塔1.1 题目要求1.2 做题思路1.3 代码实现 2. 合并两个有序链表2.1 题目要求2.2 做题思路2.3 代码实现 3. 反转链表3.2 题目要求3.2 做题思路3.3 代码实现 什么是递归、搜索与回溯算法 递归算法是一种通过重复将问题分解为同类的子问…

【一天一坑系列】Mysql中INSERT IGNORE INTO插入时去重无效,插入了重复数据

1、问题描述 今天刚好有一个需求&#xff0c;需要插入数据时去重。所以第一下就想到了insert ignore into方法&#xff0c;但是使用过程中&#xff0c;发现虽然设置了唯一键&#xff0c;但插入时还是出现了重复插入的情况。 具体信息如下&#xff0c;表的约束设置如下&…

从Excel中找sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

win11安装(未完待续)

学习补丁 test.bat 运行后需要重启 slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX slmgr /skms kms.03k.org slmgr /ato 文件扩展名 主题 性能设置 开始按钮靠左 任务栏对齐方式-靠左 必备软件 f.lux redshift 360管家 驱动精灵 edge c*lash&#xff08;v2*ray不支持w…

显示屏 LM3033(ST7920主控)

简介 这是常用的单色液晶 LCD 显示屏。 型号为 LM3033DFW&#xff08;深圳拓普微&#xff09;5V 单电源供电&#xff08;3.3V不可以&#xff0c;对比度会降低到看不清&#xff09;支持并口&#xff08;8080时序&#xff09;和串行通讯&#xff08;SPI&#xff09;带字库 框图…

git stash 对当前分支修改的内容进行暂存

我们在开发的时候往往会遇到这种情况, 在一个分支开发,写了不少内容,但是突然来了一个紧急的需求需要切换分支,去做这个需求,但是当前的分支又因为没有开发完成,不想形成一条无效的commit记录,这时我们就到暂存上场了 git stash 暂存 // 切分支之前 对当前分支修改的内容进行暂…

制作一个RISC-V的操作系统五-RISC-V汇编语言编程二

文章目录 RISC-V汇编指令操作对象RISC-V汇编指令编码格式小端序的概念RISC-V汇编指令分类RISC-V汇编伪指令 RISC-V汇编指令操作对象 RV32I&#xff1a;RISC-V32位机器整数指令集 指令集分非特权指令集和特权指令集 XLEN&#xff1a;变量代表当前机器的字长&#xff08;32位 64…

ModbusRTU\TCP消息帧解析(C#实现报文发送与解析)

目录 知识点常用链接一、Modbus1.ModbusRTU消息帧解析2.主站poll、从站slave通讯仿真-modbusRTU1.功能码01读线圈状态2.功能码03读保持寄存器报文解析&#xff08;寄存器存整型&#xff09;报文解析&#xff08;寄存器存float&#xff09; 3.C#模拟主站Poll&#xff08;ModbusR…

Go 语言中的反射机制

欢迎大家到我的博客浏览&#xff0c;更好的阅读体验请点击 反射 | YinKais Blog 反射在大多数的应用和服务中并不常见&#xff0c;但是很多框架都依赖 Go 语言的反射机制简化代码。<!--more-->因为 Go 语言的语法元素很少、设计简单&#xff0c;所以它没有特别强的表达能…

Mysql的所有数据类型和它们的区别

一、数值类型 1. 普通整数数值类型 以下数据类型只能用以保存整数 整数数值类型类型存储大小&#xff08;字节&#xff09;有符号的取值范围&#xff08;允许存在负数&#xff09;无符号的取值范围TINYINT1-128 ~ 1270 ~ 255SMALLINT2- 327678 ~ 327670 ~ 65535MEDIUMINT3- 8…

华清远见嵌入式学习——C++——作业6

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Animal { public:virtual void perform() 0;};class Lion:public Animal { private:string foods;string feature; public:Lion(){}Lion(string foods,string feature):foods(foo…

【Spring Boot】如何在IntelliJ IDEA中由同一份spring boot源码运行多个不同端口的实例

我们需要使用一个服务有多个实例的测试场景&#xff0c;那么我们就需要在IntelliJ IDEA中通过不同的端口运行不同的实例&#xff0c;并且运行时的源代码是一样的&#xff0c;那么我们可以在IntelliJ IDEA这样操作&#xff0c;接下来以UserApplication服务为例&#xff1a; 复制…

使用Java API操作HDFS

文章目录 一、了解HDFS Java API&#xff08;一&#xff09;HDFS Java API概述1、配置&#xff08;Configuration&#xff09;2、文件系统&#xff08;FileSystem&#xff09;3、路径&#xff08;Path&#xff09;4、输入输出流&#xff08;FSDataInputStream 和 FSDataOutputS…

codeforces 题目 Powers Of Two

目录 题目&#xff1a; 题目描述&#xff1a; 思路&#xff1a; AC代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 给你两个整数 n 和 k 问是否能找到 k 个2的幂&#xff0c;使其总和为 n 若能&#xff0c;则输出这 k 个 2的幂&#xff1b;若不能&#xff0c;…

预览控制;预见控制;预测控制;预观控制(preview control)

预演控制&#xff08;preview control&#xff09;作为一种新兴的控制方法&#xff0c;首次在轮式车辆中被提出。 参考文献&#xff1a; https://www.sciencedirect.com/science/article/pii/S0016003219300390https://www.sciencedirect.com/science/article/pii/S0016003219…