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

news2024/11/25 16:35:18

【知识要点】

  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.coloradmin.cn/o/1288641.html

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

相关文章

Geoserver发布2000坐标系遇到的问题总结

在Geoserver上发布2000坐标系的服务时&#xff0c;要想正常发布服务&#xff0c;不仅仅是要涉及2000坐标系&#xff0c;还需要在发布的时候选择对坐标系。具体问题描述如下&#xff1a; 1.问题描述&#xff1a; 在发布好2000坐标系的服务后&#xff0c;在超图的平台加载服务时&…

联合基于信息论的安全和隐蔽通信的框架

这个标题很帅 abstractintroductionsystem modelPROPOSED JOINT OPTIMIZATION OF ITS AND COVERT TRANSMISSION RATE信息论安全 &#xff08;ITS&#xff09; Joint Information-Theoretic Secrecy and Covert Communication in the Presence of an Untrusted User and Warden …

根文件系统中文字符测试

一. 简介 本文在之前制作的根文件系统可以正常运行的基础上进行的&#xff0c;继上一篇文章地址如下&#xff1a; 根文件系统初步测试-CSDN博客 本文测试根文件系统的是否可以支持中文字符。 二. 根文件系统中文字符测试 1. 创建中文文件 打开 ubuntu虚拟机&#xff0c;进…

uniapp-hubildx配置

1.配置浏览器 &#xff08;1&#xff09;运行》运行到浏览器配置》配置web服务器 &#xff08;2&#xff09;选择浏览器安装路径 &#xff08;3&#xff09;浏览器安装路径&#xff1a; &#xff08;3.1&#xff09; 右键点击图标》属性 &#xff08;3.2&#xff09;选择目标&…

计算机组成原理-数据寻址-(相对寻址 基址寻址 变址寻址 )

文章目录 指令寻址vs数据寻址总览偏移寻址基址寻址基址寻址的作用变址寻址变址寻址的作用基址&变址复合寻址相对寻址相对寻址的作用 总结硬件如何实现数的比较 指令寻址vs数据寻址 总览 偏移寻址 变址寄存器&#xff1a;IX 基址寄存器&#xff1a;BR 基址寻址 没有基址…

EM32DX-C4【C#】站15

1外观&#xff1a; J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI&#xff1a; 公共端是…

HarmonyOS学习--初次下载安装和配置环境

一、Windows下载与安装软件 运行环境要求&#xff1a; 为保证DevEco Studio正常运行&#xff0c;建议电脑配置满足如下要求&#xff1a; 操作系统&#xff1a;Windows10 64位、Windows11 64位内存&#xff1a;8GB及以上硬盘&#xff1a;100GB及以上分辨率&#xff1a;1280*80…

第二证券:服务消费暖意尽显 产业升级促投资稳出口

如果说完结全年增加方针问题不大代表了2023年我国经济的“形”&#xff0c;那么消费、出资、出口这“三驾马车”在驱动增加过程中的结构性亮点则展示了我国经济的“势”。 2023年&#xff0c;服务消费暖意尽显&#xff0c;餐饮、文旅工作展示出的生气勃勃浮光掠影&#xff1b;…

群星璀璨!亚信科技、TM Forum联合举办数字领导力中国峰会,助百行千业打造转型升级双引擎

11月30日&#xff0c;亚信科技携手著名国际组织TM Forum&#xff08;TeleManagement Forum 电信管理论坛&#xff09;联合举办的2023数字领导力中国峰会在京隆重召开&#xff0c;国内外数百位行业领袖、专家学者、企业高管和生态伙伴齐聚一堂。大会由“数字领导力峰会”“IT数字…

为什么C语言用int *a 来声明指针变量,而不是int a声明?

为什么C语言用int *a 来声明指针变量&#xff0c;而不是int &a声明&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c…

第一节:认识微服务

一、微服务技术对比 Dubbo SpringCloudSpringCloudAlibaba注册中心zookeeper、Redis Eureka、ConsulNacos、Eureka服务远程调用Dubbo协议Feign&#xff08;http协议&#xff09;Dubbo、Feign配置中心无SpringCloudGateway、ZuulSpringCloudConfig、Nacos服务网…

React中ref的四种使用方法

个人公众号 公众号文章-React中ref的四种使用方法 个人公众号&#xff0c;求关注公众号~ 求指导&#xff0c;求点赞&#xff0c;求评论。 写在前面的废话 什么时候使用ref的环境就不说了&#xff0c;比如我们要获取一个输入框的value&#xff0c;无法通过state去获取&#x…

固态硬盘速度测试:硬盘实际性能是否符合标准?

在进行固态硬盘速度测试之前我们先来了解一下固态硬盘的读写速度是什么。固态硬盘的读写速度主要分为顺序读写和随机读写&#xff08;4K&#xff09;。 ​顺序读写&#xff1a;指的是硬盘在读写连贯、集中大文件时候的速度。比如在读取、拷贝单个视频文件时&#xff0c;就是硬盘…

Light-Head R-CNN: In Defense of Two-Stage Object Detector(2017.11)

文章目录 Abstract1. Introduction2. Related works3. Our Approach3.1. Light-Head R-CNN3.1.1. R-CNN subnet3.1.2. Thin feature maps for RoI warping 3.2. Light-Head R-CNN for Object Detection Conclusion 原文链接 Abstract 在本文中&#xff0c;我们首先研究了为什么…

如何能够获得想要的科研数据资料呢?

在当今的学术界&#xff0c;科研数据的获取对于研究人员来说至关重要。然而&#xff0c;由于各种原因&#xff0c;如数据难以获取、数据不完整或不准确等&#xff0c;使得许多研究人员面临困难。那么&#xff0c;如何才能够获得的科研数据资料呢&#xff1f; 一、参考文献 根…

实验报告-实验四(时序系统实验)

软件模拟电路图 说明 SW&#xff1a;开关&#xff0c;共六个Q1~Q3&#xff1a;输出Y0~Y3&#xff1a;输出 74LS194 首先&#xff0c;要给S1和S0高电位&#xff0c;将A~D的数据存入寄存器中&#xff08;如果开始没有存入数据&#xff0c;那么就是0000在里面移位&#xff0c;不…

Azure Machine Learning - 在 Azure 门户中创建演示应用

目录 准备环境启动向导配置搜索结果添加自动提示功能添加建议创建、下载和执行清理资源 使用 Azure 门户的“创建演示应用”向导来生成可下载的“localhost”样式的 Web 应用&#xff0c;该应用在浏览器中运行。 根据其配置&#xff0c;生成的应用在首次使用时就能正常运行&…

Spring Cloud Alibaba实践:使用Nacos实现服务注册与发现

什么是Nacos Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如…

初学者如何入门深度学习:以手写数字字符识别为例看AI 的学习路径,一图胜千言!超多高清大图收集整理

文章大纲 深度神经网络机器学习,深度学习,数据发掘之间的关系神经元与激活函数理解深度神经网络最好的可视化工具深度学习基础概念能解决神马种类的问题?卷积池化以手写字符识别为例讲述深度学习的分类问题MNIST 数据集简介初学者入门 :生成式 AI -- generative-ai-for-beg…

GPT-Crawler一键爬虫构建GPTs知识库

GPT-Crawler一键爬虫构建GPTs知识库 写在最前面安装node.js安装GPT-Crawler启动爬虫结合 OpenAI自定义 assistant自定义 GPTs&#xff08;笔者用的这个&#xff09; 总结 写在最前面 GPT-Crawler一键爬虫构建GPTs知识库 能够爬取网站数据&#xff0c;构建GPTs的知识库&#xf…