【SpringMVC】数据转换 & 数据格式化
数据转换 & 数据格式化 & 数据校验
数据转换
数据绑定流程
- Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象
- DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换、数据格式化工作。将 Servlet 中的请求信息填充到入参对象中
- 调用 Validator 组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果 BindingData 对象
- Spring MVC 抽取 BindingResult 中的入参对象和校验错误对象,将它们赋给处理方法的响应入参
Spring MVC 通过反射机制对目标处理方法进行解析,将请求消息绑定到处理方法的入参中。数据绑定的核心部件是 DataBinder,运行机制如下:



数据转换
- Spring MVC 上下文中内建了很多转换器,可完成大多数 Java 类型的转换工作。
- ConversionService converters =
- java.lang.Boolean -> java.lang.String : org.springframework.core.convert.support.ObjectToStringConverter@f874ca
- java.lang.Character -> java.lang.Number : CharacterToNumberFactory@f004c9
- java.lang.Character -> java.lang.String : ObjectToStringConverter@68a961
- java.lang.Enum -> java.lang.String : EnumToStringConverter@12f060a
- java.lang.Number -> java.lang.Character : NumberToCharacterConverter@1482ac5
- java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory@126c6f
- java.lang.Number -> java.lang.String : ObjectToStringConverter@14888e8
- java.lang.String -> java.lang.Boolean : StringToBooleanConverter@1ca6626
- java.lang.String -> java.lang.Character : StringToCharacterConverter@1143800
- java.lang.String -> java.lang.Enum : StringToEnumConverterFactory@1bba86e
- java.lang.String -> java.lang.Number : StringToNumberConverterFactory@18d2c12
- java.lang.String -> java.util.Locale : StringToLocaleConverter@3598e1
- java.lang.String -> java.util.Properties : StringToPropertiesConverter@c90828
- java.lang.String -> java.util.UUID : StringToUUIDConverter@a42f23
- java.util.Locale -> java.lang.String : ObjectToStringConverter@c7e20a
- java.util.Properties -> java.lang.String : PropertiesToStringConverter@367a7f
- java.util.UUID -> java.lang.String : ObjectToStringConverter@112b07f
- ……
自定义类型转换器
- ConversionService 是 Spring 类型转换体系的核心接口。
- 可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及 Spring MVC 处理方法入参绑定等场合使用它进行数据的转换
- 可通过 ConversionServiceFactoryBean 的 converters 属性注册自定义的类型转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.nemo.springmvc.UserConverter"></bean>
</list>
</property>
</bean>
Spring 支持的转换器
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactroyBean 中:
Converter<S,T>:将 S 类型对象转为 T 类型对象ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类 (Integer、Long、Double 等)对象)可使用该转换器工厂类GenericConverter:会根据源类对象及目标类对象所在的宿主类 中的上下文信息进行类型转换
自定义转换器示例
<mvc:annotation-driven conversion-service=“conversionService”/> 会将自定义的 ConversionService 注册到 Spring MVC 的上下文中
<mvc:annotation-driven conversion-ervice="conversionService"></mvc:annotation-driven>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.nemo.springmvc.UserConverter"></bean>
</list>
</property>
</bean>
@RequestMapping("/handle24")
public String handle24(@RequestParam("user") User user) {
System.out.println(user);
return "success";
}
关于 mvc:annotation-driven
<mvc:annotation-driven/>会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver 三个bean。- 还将提供以下支持:
- 支持使用
ConversionService实例对表单参数进行类型转换 - 支持使用
@NumberFormat、@DateTimeFormat注解完成数据类型的格式化 - 支持使用
@Valid注解对 JavaBean 实例进行 JSR 303 验证 - 支持使用
@RequestBody和@ResponseBody注解
- 支持使用
既没有配置 <mvc:default-servlet-handler/> 也没有配置 <mvc:annotation-driven/>

配置了 <mvc:default-servlet-handler/> 但没有配置 <mvc:annotation-driven/>

既配置了 <mvc:default-servlet-handler/> 又配置 <mvc:annotation-driven/>

@InitBinder
- 由
@InitBinder标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定 @InitBinder方法不能有返回值,它必须声明为void。@InitBinder方法的参数通常是是 WebDataBinder
/**
* 不自动绑定对象中的 roleSet 属性,另行处理。
*/
@InitBinder
public void intBinder(WebDataBinder dataBinder) {
dataBinder.setDisallowFields("roleSet");
}
数据格式化
- 对属性对象的输入/输出进行格式化,从其本质上讲依然属于 “类型转换” 的范畴。
- Spring 在格式化模块中定义了一个实现 ConversionService 接口的 FormattingConversionService 实现类,该实现类扩展了 GenericConversionService,因此它既具有类型转换的功能,又具有格式化的功能
- FormattingConversionService 拥有一个 FormattingConversionServiceFactroyBean 工厂类,后者用于在 Spring 上下文中构造前者
- FormattingConversionServiceFactroyBean 内部已经注册了:
- NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解
- JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用 @DateTimeFormat 注解
- 装配了 FormattingConversionServiceFactroyBean 后,就可以在 Spring MVC 入参绑定及模型数据输出时使用注解驱动了。
<mvc:annotation-driven/>默认创建的 ConversionService 实例即为 FormattingConversionServiceFactroyBean
日期格式化
@DateTimeFormat 注解可对 java.util.Date、java.util.Calendar、java.long.Long 时间类型进行标注:
pattern属性:类型为字符串。指定解析/格式化字段数据的模式,如:"yyyy-MM-dd hh:mm:ss"iso属性:类型为DateTimeFormat.ISO。指定解析/格式化字段数据的ISO模式,包括四种:ISO.NONE(不使用) -- 默认、ISO.DATE(yyyy-MM-dd)、ISO.TIME(hh:mm:ss.SSSZ)、ISO.DATE_TIME(yyyy-MM-dd hh:mm:ss.SSSZ)style属性:字符串类型。通过样式指定日期时间的格式,由两位字符组成,第一位表示日期的格式,第二位表示时间的格式:S:短日期/时间格式、M:中日期/时间格式、L:长日期/时间格式、F:完整日期/时间格式、-:忽略日期或时间格式
数值格式化
@NumberFormat 可对类似数字类型的属性进行标注,它拥有两个互斥的属性:
style:类型为NumberFormat.Style。用于指定样式类型,包括三种:Style.NUMBER(正常数字类型)、Style.CURRENCY(货币类型)、Style.PERCENT(百分数类型)pattern:类型为String,自定义样式,如patter="#,###";
格式化示例
<mvc:annotation-driven></mvc:annotation-driven>
public class User {
@DateTimeFormat(pattern="yyyy/MM/dd")
private Date birthday;
@NumberFormat(pattern="#,###.###")
private Double wages;
}
@RequestMapping("/handle19")
public String handle19(@ModelAttribute("user") User user) {
user.setId(1000);
System.out.println(user);
return "success";
}
【SpringMVC】数据转换 & 数据格式化的更多相关文章
- SpringMVC 数据转换 & 数据格式化 & 数据校验
数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ...
- SpringMVC——数据转换 & 数据格式化 & 数据校验
一.数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方 法的入参实例传递给 WebDataBinderFactory 实例,以创 建 DataBinder ...
- SpringMVC的数据转换&&数据格式化&&数据校验
1 SpringMVC的数据绑定流程 SpringMVC将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. ...
- SpringMVC听课笔记(九:数据转换 & 数据格式化 & 数据校验)
1.数据绑定流程 --1). Spring MVC主框架将ServletRequest对象及目标方法入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象. - ...
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...
- SpringMVC的数据格式化-注解驱动的属性格式化
一.什么是注解驱动的属性格式化? --在bean的属性中设置,SpringMVC处理 方法参数绑定数据.模型数据输出时自动通过注解应用格式化的功能. 二.注解类型 1.DateTimeFormat @ ...
- SpringMVC的数据转换,格式化和数据校验
在SpringMVC中,根据请求方法签名不同,将请求消息中的消息以一定的方式转换并绑定到请求方法的参数中,在请求信息到达真正调用处理方法的这一段时间内,SpringMVC还会完成很多其他的 ...
- SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息
在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.sprin ...
- 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat
作者:ssslinppp 1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...
- SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显
在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1. ...
随机推荐
- Redis实战-Redisson-分布式锁
1. 简介 随着技术的快速发展,业务系统规模的不断扩大,分布式系统越来越普及.一个应用往往会部署到多台机器上,在一些业务场景中,为了保证数据的一致性,要求在同一时刻,同一任务只在一个节点上运行,保证同 ...
- CDS标准视图:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL
视图名称:功能位置可用标签 I_FUNCNLLOCALTERNATIVELABEL 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Functional Locat ...
- w3cschool-Jenkins中文文档
https://www.w3cschool.cn/jenkins/ Jenkins中文文档 阅读(1173.5k)收藏赞(54)分享 手册简介 Jenkins是一个开源的持续集成的服务器,Jenki ...
- K8S故障处理:临时设置节点为不可调度(cordon与drain区别)
在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护.升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能. 1.K8s节点驱逐 节点驱逐是指将节点上运 ...
- bug的合规描述
bug的合格描述: 发现问题的版本bug的合格描述: 开发人员需要知道出现问题的版本,才能够获取对应版本的代码来重现故障问题出现的环境 环境分为硬件环境和软件环境,详细的环境描述有利于故障的重现( ...
- 基于Hexo实现一个静态的博客网站
原文首发:https://blog.liuzijian.com/post/8iu7g5e3r6y.html 1.初始化Hexo Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目,旨 ...
- ChatGpt怎么玩
注册 梯子 先找好梯子, 归属地最好是米国之类的, 否则提示 OpenAI's services are not available in your country. 注: 最好用固定代理, 如tro ...
- 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用)
四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) @ 目录 四.1 Redis 五大数据类型/结构的详细说明/详细使用(List 列表数据类型详解和使用) ...
- java中线程的创建方式-休眠-生命周期-工作方式
进程 进程的定义:进程是操作系统分配资源的基本单位.每个进程都有自己独立的内存空间和系统资源. 进程的独立性:进程之间是相互独立的,一个进程的崩溃不会影响到其他进程. java中的体现:在Java中, ...
- Luogu P11361 NOIP2024 编辑字符串 题解 [ 黄 ] [ 贪心 ]
编辑字符串:这题能评蓝已经说明了洛谷的唐氏. 结论 找到两个字符串种连续的且可以移动的所有极大子区间,然后线性扫一遍,看这一位所处的子区间中有多少个 \(0\) 和 \(1\),两个都有 \(0\) ...