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.

种类修饰类型作用
@NotEmptyString, collection, mapnull || 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的运行类型是BeanPropertyBindingResultBeanPropertyBindingResult实现了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的意思。

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

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

相关文章

OpenCV 滑动条调整图像对比度和亮度

一、知识点 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、创建一个滑动条并将其附在指定窗口上。 (2)、参数说明: trackbarname: 创建的…

ReadWriteLock(读写锁)和 StampedLock

1. ReadWriteLock&#xff08;读写锁&#xff09;&#xff1a;实现高性能缓存 总结&#xff1a; 要点 内容 适用场景 读多写少、高并发读取场景&#xff08;如缓存&#xff09; 锁类型 ReadWriteLock接口&#xff0c;ReentrantReadWriteLock实现 读锁 vs 写锁 多线程可…

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…

vue3 el-button 自定义本地图标

设置不生效的原因可能有&#xff1a;1.style标签里没加scoped <style scoped></style>2.本地图片路径指向错误3.自定义图片长宽没设置4.deep深度选择器使用错误&#xff0c;vue3用:deep() <el-tooltip content"重新匹配" placement"top"&g…

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…

6.8 note

paxos算法_初步感知 Paxos算法保证一致性主要通过以下几个关键步骤和机制&#xff1a; 准备阶段 - 提议者向所有接受者发送准备请求&#xff0c;请求中包含一个唯一的编号。 - 接受者收到请求后&#xff0c;会检查编号&#xff0c;如果编号比它之前见过的都大&#xff0c;就会承…

c++ openssl 使用 DES(数据加密标准)进行加密和解密的基本操作

使用 DES&#xff08;数据加密标准&#xff09;进行加密和解密的基本操作&#xff0c;重点展示了 ECB 和 CBC 模式&#xff0c;并且通过篡改密文的方式来进行攻击。下面是对每个部分的详细解析。 1. 结构体 Slip struct Slip {char from[16] { 0 }; // 交易的发起者&#x…

OpenWrt:使用ALSA实现边录边播

ALSA是Linux系统中的高级音频架构&#xff08;Advanced Linux Sound Architecture&#xff09;。目前已经成为了linux的主流音频体系结构&#xff0c;想了解更多的关于ALSA的知识&#xff0c;详见&#xff1a;http://www.alsa-project.org 在内核设备驱动层&#xff0c;ALSA提供…

【.net core】天地图坐标转换为高德地图坐标(WGS84 坐标转 GCJ02 坐标)

类文件 public static class WGS84ToGCJ02Helper {// 定义一些常量private const double PI 3.14159265358979324;private const double A 6378245.0;private const double EE 0.00669342162296594323;// 判断坐标是否在中国范围内&#xff08;不在国内则不进行转换&#x…

Matlab自学笔记五十七:符号运算、可变精度运算、双精度浮点型运算,三种运算精度的概念、比较、选择和应用

1.可变精度算术的概念 默认的&#xff0c;Matlab双精度浮点数使用16位数字精度&#xff0c;而符号数学工具箱的vpa函数&#xff0c;提供了无限大的可变精度&#xff0c;它默认使用32位数字精度&#xff0c;32位指的是有效数字的位数&#xff1b; 2.具体用法 程序示例&#x…

由汇编代码确定switch语句

int switch2(int x) {int result0;switch(x){/* switch语句主体缺失 */}return result; }在编译函数时&#xff0c;GCC为程序的初始部分以及跳转表生成了如下汇编代码。 1 MOVL 8(%ebp), %eax ;x位于相对于寄存器%ebp偏移量为8的地方。 2 ADDL $2, %eax …

java 使用HanLP 入门教程

1. 安装 HanLP Maven 依赖 <dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version> <!-- 最新版本请查看官网 --> </dependency>注意&#xff1a;portable 版本…

vm虚拟机添加虚拟机无反应,获取所有权

问题描述 虚拟机忘记关机&#xff0c;就把电脑关了&#xff0c;早上打开用不了了&#xff0c;重新添加&#xff0c;也没反应&#xff0c;获取所有权后就没了 问题解决 将虚拟机文件目录下的.lck文件夹&#xff0c;删除&#xff0c;或者改个名&#xff0c;我是改为了.backup方…

为何选择Spring框架学习设计模式与编码技巧?

&#x1f4cc; 结论先行 推荐项目&#xff1a;Spring Framework 推荐理由&#xff1a;设计模式覆盖全面 编码技巧教科书级实现 Java 生态基石地位 &#x1f3c6; 三维度对比分析 维度SpringMyBatisXXL-JOB设计模式⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐代码抽象⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐生态价…

MySQL 索引:聚集索引与二级索引

在数据库性能优化的征途中&#xff0c;索引无疑扮演着至关重要的角色。正确理解和使用索引&#xff0c;能够显著提升查询效率&#xff0c;为应用带来丝滑般的操作体验。今天&#xff0c;我们将深入 MySQL 的心脏&#xff0c;重点探讨 InnoDB 存储引擎中两种核心的索引类型&…

【Elasticsearch】映射:详解 _source store 字段

映射&#xff1a;详解 _source & store 字段 1._source 字段1.1 特点1.2 示例 2.store 字段2.1 特点2.2 示例 3.两者对比3.1 使用建议3.2 实际应用示例 1._source 字段 _source 是 Elasticsearch 中一个特殊的元字段&#xff0c;它存储了文档在索引时的原始 JSON 内容。 …

新建网站部署流程

1. 新建 Node 服务&#xff0c;指定端口并代理前端静态资源 操作步骤&#xff1a; 初始化 Node 项目mkdir my-website && cd my-website npm init -y npm install express创建 app.js&#xff08;示例代码&#xff09;const express require(express); const app e…

时序数据库IoTDB结合SeaTunnel实现高效数据同步

益、基本概念介绍 1.1 Apache IoTDB Apache IoTDB是一款专为工业物联网设计的时序数据库管理系统&#xff0c;集数据收集、存储、管理与分析于一体&#xff0c;满足海量数据存储、高速读取及复杂数据分析需求。其架构包括时序文件&#xff08;TsFile&#xff09;、数据库引擎…

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…

RFID推动新能源汽车零部件生产系统管理应用案例

RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域&#xff0c;电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式&#xff0c;存在单点位单独头溯源、网关布线…