springMVC-10验证及国际化
验证
概述
● 概述
1. 对输入的数据(比如表单数据),进行必要的验证,并给出相应的提示信息。
2. 对于验证表单数据,springMVC提供了很多实用的注解, 这些注解由JSR303 验证框架提供.
●JSR 303 验证框架
1. JSR 303 的含义
JSR(Java Specification Request)是 Java 社区提案的缩写,由 Java Community Process(JCP)管理。每个 JSR 对应一项 Java 技术规范,例如 JSR 303 即第 303 号提案
2. JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE 中
3. JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解指定校验规则, 并通过标准的验证接口对 Bean 进行验证
4. JSR 303 提供的基本验证注解有:
●HibernateValidator扩展注解
1.HibernateValidator和Hibernate没有关系,只是JSR303实现的一个扩展.
2.HibernateValidator是JSR303的一个参考实现,除支持所有标准的校验注解外,它还支 持以下的扩展注解:
3.扩展注解有如下
应用实例
1. 引入验证和国际化相关的jar包
2. 修改Monster.java
@NotEmpty//表示该字段不能为null,或者String不为"",或者集合、映射的size != 0,这样的情况。//Asserts that the annotated string, collection, map or array is not null or empty.private String name;@Range(min = 1, max = 200)//表示取值范围在1-200之间private Integer age;
3.修改MonsterHandler.java
/*** 编写方法,处理添加妖怪* 1.springmvc可以将提交的数据,按照参数名和对象的属性名匹鹿配* 2.直接封装到对象中->前面讲解模型数据时,讲过* String =>Integer* 3.@Valid Monster monster:表示对monster接收的数据进行校验* 4.Errors errors表示如果校验出现错误,将校验的错误信息保存errors* 5.Map<String,Object>map表示如果校验出现错误,将校验的错误信息保存至map;同时保存monster对象(与errors的区别)* 6.校验发生的时机: 在springmvc底层,反射调用目标方法时,会接收到http请求的数据,然后根据注解来进行验证,* 在验证过程中,如果出现了错误,就把错误信息填充errors 和 map*/@RequestMapping("/save")//这儿的monster,springMVC会进行自动装配public String addMonster(@Valid Monster monster, Errors errors ,Map<String, Object> map) {System.out.println(monster);System.out.println("=========errors===========");List<ObjectError> allErrors = errors.getAllErrors();for(ObjectError error : allErrors) {System.out.println("error=" + error);}System.out.println("==========map============");for (Map.Entry<String,Object> entry : map.entrySet()) {System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());}return "success";}
4.测试
和预期一样,姓名空报错,年龄超出范围。
验证信息回显至页面
1.修改monster_addUI.jsp,添加errors标签
妖怪姓名:<s:input path="name" /><s:errors path="name"/><br><br>妖怪年龄:<s:input path="age" /><s:errors path="age"/><br><br>电子邮件:<s:input path="email"/><s:errors path="email"/><br><br>妖怪生日:<s:input path="birthday"/><s:errors path="birthday"/> 要求以"9999-11-11"的形式<br><br>妖怪薪水:<s:input path="salary"/>><s:errors path="salary"/> 要求以"123,890.12"的形式<br><br>
2.修改MonsterHandler
发现报错,便阻止进入到下一个页面,返回当前输入页面。
System.out.println("==========map============");for (Map.Entry<String,Object> entry : map.entrySet()) {System.out.println("key=" + entry.getKey() + " value=" + entry.getValue());}//交换了map和errors的代码顺序,是因为map有monster,通常不会为nullSystem.out.println("=========errors===========");if(errors.hasErrors()){List<ObjectError> allErrors = errors.getAllErrors();for(ObjectError error : allErrors) {System.out.println("error=" + error);}return "datavalid/monster_addUI";}return "success";
3.测试
可以看到返回的错误信息了。
国际化/自定义验证信息
概念
国际化(简称 i18n,因“internationalization”一词首尾字母间有18个字符)是指设计和开发软件、产品或服务时,使其能够适应不同语言、地区和文化需求的技术与流程。核心目标是无需重构代码或设计,即可快速适配多语言和多区域市场。
应用实例
原始的生日和薪水报错是用英文显示的:
1.配置国际化文件,springMVC-servlet.xml中添加bean
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"><!--属性作用: 配置国际化文件名字--><!--如果你这样配的话,表示messageSource会到src/i18nXXX.properties去读取错误信息--><property name="basename" value="i18n"/></bean>
2.创建src/i18n.properties
这儿的文件名,和上面的配置文件一致
等号=前面的key,来自于报错代码的第一个字段,比如:
[NotEmpty.monster.name, ...],[Range.monster.age, ...]
等号=后面的value值,是unicode编码,可以在相应的工具网站“unicode编码转换工具”中查询
NotEmpty.monster.name=\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a
Range.monster.age=\u5e74\u9f84\u9700\u8981\u5728\u0031\u81f3\u0032\u0030\u0030\u5c81\u4e4b\u95f4
typeMismatch.monster.birthday=\u751f\u65e5\u683c\u5f0f\u4e0d\u6b63\u786e
typeMismatch.monster.salary=\u85aa\u6c34\u5fc5\u987b\u5168\u90e8\u662f\u6570\u5b57
3.测试
可以看到报错回显的内容,全部按照自己定义的内容进行显示了。
细节说明和注意事项
1. 在需要验证的 Javabean/POJO的字段上加上相应的验证注解.
2. 目标方法上,在 JavaBean/POJO 类型的参数前, 添加 @Valid 注解. 告知 SpringMVC 该 bean 是需要验证的
3. 在 @Valid 注解之后, 添加一个 Errors 或 BindingResult 类型的参数, 可以获取到验证 的错误信息
4. 需要使用 标签来显示错误消息, 这个标签, 需要写在 springMVC的标签<s:form>内生效.
5. 错误消息的国际化文件i18n.properties, 中文需要是Unicode编码,使用工具转码.
√ 格式: 验证规则:表单modelAttribute值.属性名 = 消息信息
√ NotEmpty.monster.name=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
√ typeMismatch.monster.age=\u7C7B\u578B\u4E0D\u5339\u914D
6. 注解@NotNull 和 @NotEmpty 的区别说明
1) 查看源码可以知道 :
@NotEmptyAsserts that the annotated string, collection, map or array is not {@code null} or empty.
2) 查看源码可以知道 :
@NotNull*Theannotated element must not be {@code null}.* Accepts any type.
种类 | 修饰类型 | 作用 |
---|---|---|
@NotEmpty | String, collection, map | null || size=0 |
@NotNull | 任意类型 | null |
3) 解读:如果是字符串验证空, 建议使用 @NotEmpty
7. SpingMVC 验证时,会根据不同的验证错误, 返回对应的信息
注解的组合使用
1.注解可以组合使用比如
@Range+@NotNull
2.返回的错误信息,除了通过国际化进行配置外,还可以通过注解的属性来修改
@NotNull(message="不能为空")
3.测试发现,同时配置了message和国际化的情况下,会优先显示国际化配置的信息。
DataBinder工作机制-了解
图例Spring MVC通过反射机制对目标方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是DataBinder,运行机制如下
1.Tomcat封装请求到ServletRequest
2.处理方法入参对象
3.进行数据类型转换/格式化。ConversionService转换服务,如果转换出现错误,就会封装到最后的5BindingResult中
4.进行数据校验,出错也会封装到5BindResult中
5.返回数据转换和数据校验的结果
error的运行类型是BeanPropertyBindingResult
, BeanPropertyBindingResult
实现了BindingResult
接口
取消属性绑定
说明
在默认情况下,表单提交的数据都会和pojo类型的javabean属性绑定,如果程序员在开发中,希望取消某个属性的绑定,也就是说,不希望接收到某个表单对应的属性的值,则可以通过
@InitBinder注解取消绑定
POJO(Plain Old Java Object - 简单的 Java 对象): 一个普通的、不依赖特定框架的 Java 类。表单绑定的目标对象首先是一个 POJO。
JavaBean: 一种遵循特定严格约定(无参构造、私有属性、公共标准 Getter/Setter)的 POJO。正是这些约定使得 Web 框架能够自动将表单提交的数据绑定到对象的属性上。
上面粗体子含义: 在 Spring MVC 等框架中,如果你创建一个符合 JavaBean 规范的类(比如
User
),并将其作为控制器方法的参数(如public String submitForm(User user)
),那么框架在默认情况下,就能自动将 HTTP 请求中提交的表单字段的值,通过调用该User
对象的对应 Setter 方法,填充到它的属性中去。这就是“表单提交的数据都会和 POJO 类型的 JavaBean 属性绑定”的意思。这里的“POJO 类型”强调目标是一个普通 Java 类,“JavaBean” 强调这个类需要遵循 JavaBean 规范以实现自动绑定。Entity: 一种特殊用途的 POJO/JavaBean,用于代表需要持久化到数据库的业务核心对象。它通过注解添加了数据库映射的元数据(映射到哪个表、哪个是主键、字段映射、关系映射等)。强调与数据库的映射关系。
1.编写一个方法,使用@InitBinder标识的该方法,可以对WebDataBinder对象进行初始化。
WebDataBinder是DataBinder的子类,用于完成由表单字段到JavaBean属性的绑定
2.@InitBinder方法不能有返回值,它必须声明为void.
3.@InitBinder方法的参数通常是是WebDataBinder
应用实例
1.给MonsterHandler.java添加方法
@InitBinderpublic void initBinder(WebDataBinder webDataBinder) {/*** 解读* 1.方法上需要标注@InitBinder springmvc底层会初始化WebDataBinder* 2.调用webDataBinder.setDisallowedFields("name")表示取消指定属性的绑定* 即:当表单提交字段为name时,就不在把接收到的name值,填充到model数据monster的name属性* 3.机制:springmvc在底层通过反射调用目标方法时,接收到http请求的参数和值,使用反射+注解* 技术取消对指定属性的填充* 4.setDisallowedFields支特可变参数,可以填写多个字段。比如("name","email")* 5.如果我们取消某个属性绑定,验证就没有意义了,应当把验证的注解去掉,否则容易出错* //@NotEmpty(message="不能为空")* private String name;*/webDataBinder.setDisallowedFields("name");}
2.测试
后台输出:
name='null'
注意这儿的'null'就是null的意思。
相关文章:

springMVC-10验证及国际化
验证 概述 ● 概述 1. 对输入的数据(比如表单数据),进行必要的验证,并给出相应的提示信息。 2. 对于验证表单数据,springMVC提供了很多实用的注解, 这些注解由JSR303 验证框架提供. ●JSR 303 验证框架 1. JSR 303 的含义 JSR࿰…...
使用Python和TensorFlow实现图像分类
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...

LRU 和 DiskLRU实现相册缓存器
我是写Linux后端的(golang、c、py),后端缓存算法通常是指的是内存里面的lru、或diskqueue,都是独立使用。 很少有用内存lru与disklru结合的场景需求。近段时间研究android开发,里面有一些设计思想值得后端学习。 写这…...

figma MCP + cursor如何将设计稿生成前端页面
一、准备工作 figma MCP需要通过figma key来获取设计稿权限,key的生成步骤如下 1. 打开figma网页版/APP,进入账户设定 2. 点击生成token 3. 填写内容生成token(一定要确认复制了,不然关闭弹窗后就不会显示了) 二、配置MCP 4. 进入到cursor…...

如何理解OSI七层模型和TCP/IP四层模型?HTTP作为如何保存用户状态?多服务器节点下 Session方案怎么做
本篇概览: OSI 七层模型是什么?每一层的作用是什么?TCP/IP四层模型和OSI七层模型的区别是什么? HTTP 本身是无状态协议,HTTP如何保存用户状态? 能不能具体说一下Cookie的工作原理、生命周期、作用域?使用…...
Flask 核心概念速览:路由、请求、响应与蓝图
一、路由参数与请求方法 Flask 路由允许定义多种参数类型,并通过 methods 属性限制请求方法。 1. 路由参数类型: 除了默认的 string,Flask 还支持: int: 匹配整数,自动转换为 Python int 类型。非数字输入会返回 404。 float: 匹配浮点数,自动转换为 Python float 类型…...
Spring Boot消息系统开发指南
消息系统基础概念 消息系统作为分布式架构的核心组件,实现了不同系统模块间的高效通信机制。其应用场景从即时通讯软件延伸至企业级应用集成,形成了现代软件架构中不可或缺的基础设施。 通信模式本质特征 同步通信要求收发双方必须同时在线交互&#…...

【Elasticsearch】映射:Nested 类型
映射:Nested 类型 1.为什么需要 Nested 类型2.如何定义 Nested 类型3.相关操作3.1 索引包含 Nested 数据的文档3.2 查询 Nested 数据3.3 聚合 Nested 数据3.4 排序 Nested 数据3.5 更新 Nested 文档中的特定元素 4.Nested 类型的高级操作4.1 内嵌 inner hits4.2 多级…...

Vue3 + UniApp 蓝牙连接与数据发送(稳定版)
本教程适用于使用 uni-app Vue3 (script setup) 开发的跨平台 App(支持微信小程序、H5、Android/iOS 等) 🎯 功能目标 ✅ 获取蓝牙权限✅ 扫描周围蓝牙设备✅ 连接指定蓝牙设备✅ 获取服务和特征值✅ 向设备发送数据包(ArrayBu…...

三种读写传统xls格式文件开源库libxls、xlslib、BasicExcel的比较
最近准备读写传统xls格式文件,而不是较新的xlsx,询问DeepSeek有哪些开源库,他给出了如下的简介和建议,还给出了相应链接,不过有的链接已失效。最后还不忘提醒,现在该用xlsx格式了。 以下是几个可以处理传统…...

Nature子刊同款的宏基因组免疫球蛋白测序怎么做?
免疫球蛋白A(IgA)是人体肠道黏膜分泌的主要抗体,它在塑造肠道微生物群落和维持肠道稳态中起着关键作用,有研究发现缺乏IgA的患者更容易患自身免疫性疾病和感染性疾病。 目前用于研究IgA结合的主要技术是IgA-SEQ,结合了…...

2025年牛客网秋招/社招高质量 Java 面试八股文整理
Java 面试 不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的。关键在于理解企业的需求,明确自己的定位,以及掌握一定的应试技巧。 笔试部分,通常是对基础知识、…...

ADI的BF609双核DSP怎么做开发,我来说一说(五)LAN口测试
作者的话 ADI的双核DSP,第二颗是Blackfin系列的BF609,这颗DSP我用了很久,比较熟悉,且写过一些给新手的教程。 硬件准备 ADSP-BF609-CORE:ADI BF609开发板 产品链接:https://item.taobao.com/item.htm?…...

行业赋能篇-2-能源行业安全运维升级
在能源行业,尤其是风电领域,运维作业往往面临“三高”挑战——高风险环境、高异构数据量)、高合规要求。以海上风电场为例,传统运维依赖卫星电话沟通,数据记录碎片化,故障因信息传递延迟导致损失扩大。如何…...

飞云智能波段主图+多空短线决策副图指标,组合操盘技术图文解说
如上图,组合指标:主图-飞云智能波段,红线上红色K线标记,波段做多.副图指标-多空短线决策,跟踪做短线,红柱做多,绿柱短线卖出或做空。 实战操作中,我们在主图红色线支撑上红色K线出现…...

【51单片机】1. 基础点灯大师
1. 新建一个项目集一些基本操作 打开Keli软件,然后: 【Project】→【new μVision Project】→选择项目保存位置 建议文件名选一些通用的名字,如【Project】 左下角选择【Atmel】的【AT89C52】 弹出的【是否添加启动文件到文件夹下】&…...
RNN和CNN使用场景区别
RNN(循环神经网络)和 CNN(卷积神经网络)是深度学习中两种核心架构,它们的使用场景主要取决于数据结构和任务需求。以下是两者的关键区别及典型应用场景: 核心差异对比 维度RNN(循环神经网络&a…...

PC端直接打印功能(包括两张图片合并功能)
一、 效果图 二、demo代码 <template><div class"box"><divref"printContent"class"print-content"><div class"print-title">打印图片</div><imgclass"preview-image":src"merged…...

Vue前端篇——项目目录结构介绍
📘 前言 在正式开始学习 Vue 3 开发之前,了解并熟悉其项目目录结构是非常关键的第一步。一个清晰、规范的目录结构不仅有助于开发者高效地组织代码,还能显著提升项目的可读性和可维护性。 Vue 3 作为现代前端开发中广泛使用的主流框架之一&…...
基于端到端深度学习模型的语音控制人机交互系统
基于端到端深度学习模型的语音控制人机交互系统 摘要 本文设计并实现了一个基于端到端深度学习模型的人机交互系统,通过语音指令控制其他设备的程序运行,并将程序运行结果通过语音合成方式反馈给用户。系统采用Python语言开发,使用PyTorch框架实现端到端的语音识别(ASR)…...
原生js操作元素类名(classList,classList.add...)
1、classList classList属性是一个只读属性,返回元素的类名,作为一个DOMTokenList集合(用于在元素中添加,移除及切换css类) length:返回类列表中类的数量,该属性是只读的 <style> .lis { width: 200px; …...

抽象工厂模式深度解析:从原理到与应用实战
作者简介 我是摘星,一名全栈开发者,专注 Java后端开发、AI工程化 与 云计算架构 领域,擅长Python技术栈。热衷于探索前沿技术,包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践,乐于分享实战经验与…...

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
江科大学长又发布了第二期的编写技巧! 大家可以看看:https://space.bilibili.com/383400717 最后面给了一个未完成的任务: 这里我已经把这个问题给解决了! 总代码放在资源里面,key.c放在文章最后面!同时感…...

Linux常用命令学习手册
Linux常用命令学习手册https://download.csdn.net/download/2401_87690752/90953550 《Linux常用命令学习手册》提供了一份实用的Linux操作指南,主要收录了系统管理和文件操作等基础命令。内容涵盖了目录切换、文件查看、权限设置等核心功能,适合Linux初…...

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解
在现代 Web 应用中,异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(七):消息框交互功能添加-CSDN博客,深入解析 AI 对话框页面中异步逻辑的…...

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
文章目录 前言:准备工作UE4 vs UE5 性能对比引擎核心技术方案对比UE5 优化总结项目设置可伸缩性组设置VolumetricCloud最后前言: 最近在使用UE5制作VR项目 制作完后发现,我们的场景一直很卡顿,场景优化也做到了极致,但是帧率最高也才30+ 但是我们看到一个竞品,他的帧率竟…...

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
关键词:MATLAB,电学层析成像,人工智能,图像重建,深度学习 一、引言 基于人工智能的电学层析成像系统是一种创新的检测技术,结合了电学层析成像技术与人工智能算法的优势。电学层析成像技术,简…...

配置sudo免密却不生效的问题
如图,我配置了dhcp4这个账号sudo免密,但是执行sudo的时候还是要输密码。 查看dhcp的用户组,是配置了一个wheel组,而wheel组配置的是需要密码。 我们用dhcp4用户执行sudo -l 发下他匹配了两条命令策略,一个是免密一个…...

大模型赋能:金融智能革命中的特征工程新纪元
一、AI进化论:从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面:银行风控模型像老式收音机,需要人工反复调试参数才能捕捉风险信号;而大模型则是智能调音台,能自动“听…...
Significant Location Change
一、Significant Location Change是什么 “Significant Location Change(重大位置变化)” 是苹果 iOS 系统中一项用于在应用未主动运行时,监测设备位置显著变化的功能。它主要通过基站、Wi-Fi 网络等信号来判断设备是否发生了有意义的位置移…...