当前位置: 首页 > news >正文

SpringMVC 学习(十一)之数据校验

目录

1 数据校验介绍

2 普通校验

3 分组校验

4 参考文档


1 数据校验介绍

在实际的项目中,一般会有两种校验数据的方式:客户端校验和服务端校验

  • 客户端校验:这种校验一般是在前端页面使用 JS 代码进行校验,主要是验证输入数据的合法性,不合法的数据则没有必要再发送至服务端了。前端校验可以有效的提高用户体验,但是无法确保数据完整性,因为前端用户可以方便的拿到请求地址,然后直接发送请求,传递非法参数
  • 服务端校验:可以有效的保证数据安全与完整性,但是用户体验要差一点,所以客户端校验和服务端校验通常两者结合使用

        SpringMVC 提供了两种方法来对用户的输入数据进行校验:一种是 SpringMVC 自带的 Validation 校验框架,它提供了简洁的注解和验证规则,易于使用,并且与 SpringMVC 框架集成良好;另一种是利用 JRS-303 验证框架进行验证,JRS-303 验证框架的优势在于它的灵活性和可扩展性,可以与其他框架或技术进行集成。

注解作用
@Null标注的属性必须为null
@NotNull标注的属性必须不为null
@AssertTrue标注的属性必须为true
@AssertFalse标注的属性必须为false
@Min(value)标注的属性必须是一个数字,并且其值必须大于或等于value
@Max(value)标注的属性必须是一个数字,并且其值必须小于或等于value
@DecimalMin(value)必须大于或等于value
@DecimalMax(value)必须小于或等于value
@Size(max,min)大小必须在max和min限定的范围内
@Digits(integer,fratction)值必须是一个数字,且必须在可接受的范围内
@Past只能用于日期型,且必须是过去的日期
@Future只能用于日期型,且必须是将来的日期
@Pattern(value)必须符合指定的正则表达式
@Email必须是格式正确的Email地址
@Length被注释的字符串大小必须在指定的范围内
@NotEmpty被注释的字符串不能是空字符串
@Range被注释的元素必须在指定的范围内

@NotEmpty、@NotNull 和 @NotBlank 三种的区别:

  • @NotNull:一般用在基本数据类型上(包括包装类),对象不能为 null,但可以为 empty,即为空集(size = 0)。
  • @NotEmpty:可以作用在 String、List、Map 和 Array 等,对象不能为 null,而且长度必须大于0 (size > 0)
  • @NotBlank:只能作用在 String 上,不能为 null,而且调用 trim() 后,长度必须大于 0 ,即必须有实际字符

2 普通校验

导入依赖

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

在 SpringMVC 配置文件中配置校验器并注入到处理器适配器中

<!-- 配置MVC注解驱动,配置注入校验器 -->
<mvc:annotation-driven validator="validator"/><!-- 配置校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"><!-- 校验器--><property name="providerClass" value="org.hibernate.validator.HibernateValidator"/><!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties --><property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><!-- 资源文件名--><property name="basenames"><list><value>classpath:CustomValidationMessages</value></list></property><!-- 资源文件编码格式 --><property name="defaultEncoding" value="utf-8"/><!-- 对资源文件内容缓存时间,单位秒 --><property name="cacheSeconds" value="120"/>
</bean>

创建 CustomValidationMessages.properties 配置文件,和上述代码中的校验错误信息配置文件名对应也可以将错误提示信息放在一个类中

#添加校验错误提示信息
user.id.isEmpty="用户的ID不能为空!"
user.userName.isEmpty="用户名不能为空!"
user.userName.length="用户名为1~6个字符!"
user.userPwd.isEmpty="密码不能为空!"
user.userPwd.length="密码的长度为5~15个字符!"
user.userEmail.isEmpty="邮箱不能为空!"
user.userEmail.format="输入的邮箱格式不正确!"

需要校验的类 User

public class User {@NotNull(message = "{user.id.isEmpty}")private Integer id;@NotEmpty(message = "{user.userName.isEmpty}")@Length(min = 1, max = 6, message = "{user.userName.length}")private String userName;@NotEmpty(message = "{user.userPwd.isEmpty}")@Length(min = 5, max = 15, message = "{user.userPwd.length}")private String userPwd;@NotEmpty(message = "{user.userEmail.isEmpty}")@Email(message = "{user.userEmail.format}")private String userEmail;// 省略了 Getter、Setter 方法

校验控制器

@Validated 注解和 BindingResult 是成对出现的,中间不能穿插其它的形参,否则会报 400错误,其他形参只能加在它们后面

@Controller
public class ValidateController {@ResponseBody@RequestMapping("/validate")// 形参前面加上 @Validated 注解表示这个实体类需要进行数据校验// BindingResult 封装数据绑定的校验结果public void validate(@Validated User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {//校验未通过,获取所有的异常信息并展示出来List<ObjectError> allErrors = bindingResult.getAllErrors();for (ObjectError allError : allErrors) {System.out.println(allError.getObjectName() + ":" + allError.getDefaultMessage());}}}
}

index.jsp

<input name="userName"/> 与 private String userName; 对应

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>添加用户</title></head><body><form action="${pageContext.request.contextPath}/validate" method="post">ID号:<input type="text" name="id" placeholder="请输入ID号"/> <br>姓名:<input type="text" name="userName" placeholder="请输入姓名"/> <br>密码:<input type="password" name="userPwd" placeholder="请输入密码"/> <br>邮箱:<input type="text" name="userEmail" placeholder="请输入邮箱"/> <br><input type="submit" value="提交" /></form></body>
</html>

执行结果

 

3 分组校验

        某个属性设置了多种数据校验,可以将这些校验分组,然后 Controller 方法选择校验分组对数据进行校验

首先定义校验组,所谓的校验组,它其实就是空接口:

// 分组校验接口1
public interface ValidationGroup1 {
}// 分组校验接口2
public interface ValidationGroup2 {
}

对校验进行分组

public class User {// groups属性表示校验属于哪个组,可以定义多个@NotNull(message = "{user.id.isEmpty}", groups = {ValidationGroup2.class})private Integer id;@NotEmpty(message = "{user.userName.isEmpty}", groups = {ValidationGroup1.class, ValidationGroup2.class})@Length(min = 1, max = 6, message = "{user.userName.length}", groups = {ValidationGroup1.class, ValidationGroup2.class})private String userName;@NotEmpty(message = "{user.userPwd.isEmpty}", groups = {ValidationGroup1.class})@Length(min = 5, max = 15, message = "{user.userPwd.length}", groups = {ValidationGroup1.class})private String userPwd;@NotEmpty(message = "{user.userEmail.isEmpty}", groups = {ValidationGroup2.class})@Email(message = "{user.userEmail.format}", groups = {ValidationGroup2.class})private String userEmail;// getter setter 构造器 toString 省略...
}

执行结果

4 参考文档

SpringMVC入门学习(十五)----数据校验 - 唐浩荣 - 博客园 (cnblogs.com)

springMVC如何对输入数据校验实现代码_java_脚本之家 (jb51.net)

相关文章:

SpringMVC 学习(十一)之数据校验

目录 1 数据校验介绍 2 普通校验 3 分组校验 4 参考文档 1 数据校验介绍 在实际的项目中&#xff0c;一般会有两种校验数据的方式&#xff1a;客户端校验和服务端校验 客户端校验&#xff1a;这种校验一般是在前端页面使用 JS 代码进行校验&#xff0c;主要是验证输入数据…...

软考55-上午题-【数据库】-数据库设计步骤1

一、数据库设计的步骤 新奥尔良法&#xff0c;四个主要阶段&#xff1a; 1、用户需求分析&#xff1a;手机用户需求&#xff0c;确定系统边界&#xff1b; 2、概念设计&#xff08;概念结构设计&#xff09;&#xff1a;是抽象概念模型&#xff0c;较理想的是采用E-R方法。 …...

速盾:使用cdn后速度慢是怎么回事?

CDN&#xff08;内容分发网络&#xff09;是一种通过将网站的静态内容分布到全球各地的服务器&#xff0c;从而提供更快速度和更好用户体验的技术。然而&#xff0c;有时候用户会遇到使用CDN后速度变慢的问题&#xff0c;下面将探讨几种可能的原因。 服务器选择错误: CDN服务通…...

考研复试类比社团招新,无所谓“公平”,导师选谁都是他的权力

这篇文章是抖音和b站上上传的同名视频的原文稿件&#xff0c;感兴趣的csdn用户可以关注我的抖音和b站账号&#xff08;GeekPower极客力量&#xff09;。同时这篇文章也为视频观众提供方便&#xff0c;可以更加冷静地分析和思考。文章同时在知乎发表。 我考研一战的时候计算机考…...

阿里面试,有点焦虑。。

恭喜发现宝藏&#xff01;搜索公众号【TechGuide】回复公司名&#xff0c;解锁更多新鲜好文和互联网大厂的笔经面经&#xff0c;目前已更新至美团、字节… 作者TechGuide【全网同名】 聊聊春招 春招来了&#xff0c;有些24届校招生可能还在做最后的努力&#xff0c;有些25届的…...

24计算机考研调剂 | 石家庄铁道大学

01石家庄铁道大学 智慧交通研究室招少量调剂学术型硕士&#xff08;数一英一320分以上工科专业&#xff09; 考研调剂招生信息 学校:石家庄铁道大学 专业:工学->计算机科学与技术->计算机应用技术 工学->测绘科学与技术->地图制图学与地理信息工程 工学->交…...

勇敢尝鲜之Springboot3大坑-集成Mybatisplus报错:ddlApplicationRunner

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…...

linux高级编程:线程(二)、进程间的通信方式

线程&#xff1a; 回顾线程&#xff08;一&#xff09;&#xff1a; 1.线程间通信问题 线程间共享同一个资源&#xff08;临界资源&#xff09; 互斥&#xff1a; 排他性访问 linux系统 -- 提供了Posix标准的函数库 -- 互斥量&#xff08;互斥锁&#xff09; 原子操作&#x…...

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中...

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件&#xff0c;以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式&#xff0c;如飞行模式、步行模式、车辆模式等&#xff0c;可以根据不同的需求选择合适的模式。同时&#xff0c;unity导…...

根据建表sql语句生成go的struct代码工具

sql2struct 一个根据"CREATE TABLE"建表语句生成对应的Go语言结构体的工具&#xff0c;暂只支持 MySQL 表。 开发目的 在 github 中找到一些 sql2struct&#xff0c;但要么是 chrome 插件&#xff0c;要么是在线工具&#xff0c;要么是需要连接 MySQL&#xff0c;…...

Qt 自定义长条进度条(类似播放器进度条)

1.运行界面 2.步骤 其实很简单。 2.1绘制底图圆角矩形 2.2绘制播放进度圆角矩形 参考&#xff1a;painter绘图 3.源码 #pragma once#include <QWidget> #include <QLabel> #include <QHBoxLayout> #include <QMouseEvent> #include <QDebug&g…...

休息日的思考与额外题——双指针、原地哈希day28

文章目录 前言一、11. 盛最多水的容器二、41. 缺失的第一个正数三、42. 接雨水总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷题班&#xff0c…...

数据修改

Oracle 目录 数据修改 将员工编号的 7369 的员工工资修改为 810&#xff0c;佣金改为 100 将工资最低的员工工资修改为公司的平均工资 将所有在 1981 年雇佣的员工的雇佣日期修改为今天&#xff0c;工资增长 20% 数据的更新操作 Oracle从入门到总裁:https://blog.csdn.n…...

Android JNI复杂用法,回调,C++中调用Java方法

Android JNI复杂用法&#xff0c;回调&#xff0c;C中调用Java方法 一、前言 Android JNI的 普通用法估计很多人都会&#xff0c;但是C中调用Java方法很多人不熟悉&#xff0c;并且网上很多介绍都是片段的。 虽然C/C调用Java不常用&#xff0c;但是掌握多一点还是有好处的。…...

C++从零开始的打怪升级之路(day41)

这是关于一个普通双非本科大一学生的C的学习记录贴 在此前&#xff0c;我学了一点点C语言还有简单的数据结构&#xff0c;如果有小伙伴想和我一起学习的&#xff0c;可以私信我交流分享学习资料 那么开启正题 今天分享的是关于继承的知识点 1.派生类的默认成员函数 首先我…...

uni-app app实现web-view H5图片长按下载

问题和使用场景描述&#xff1a; uniapp app web-view中图片无法长按保存&#xff0c;IOS下是正常的&#xff0c;但是Android下长按无反应 解决方案&#xff1a; 下载mui.min.js&#xff0c;放到项目中的static下(下载见最上面的压缩包) 在static目录下新建script.js mui.…...

全量知识系统问题及SmartChat给出的答复 之5

Q15. 支持前端&#xff08;知识表征&#xff09;的自然语言能力 需要一个 元语言注释工具 以及两个库&#xff08;叙词库和语料库&#xff09;和主题词表。请 1)设计 两个库和主题词表的结构 &#xff0c;2&#xff09;分别设计它们的接口&#xff0c;3&#xff09;通过调用它们…...

DolphinScheduler——工作流实例的生命周期

目录 一、DolphinScheduler架构原理 1.1 系统架构图 1.2 DolphinScheduler核心概念 1.2 创建工作流 1.2.1 如何触发一个工作流实例 1.2.2 任务调度链路监控 1.2.3 Workflow-DAG解析 DAG解析 Dispatch分发流程 Master和Worker的交互过程 1.3 任务运行状态 该篇文章主…...

阻塞和非阻塞网络io有什么区别,分别有哪些应用场景?

阻塞&#xff08;Blocking&#xff09;和非阻塞&#xff08;Non-blocking&#xff09;网络I/O是两种不同的I/O模型&#xff0c;它们在处理I/O操作时的行为和特点有所不同。 阻塞式网络I/O&#xff08;Blocking I/O&#xff09;&#xff1a; 在阻塞式网络I/O中&#xff0c;当应…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...