深入理解Spring MVC的数据转换

发布时间 - 2026-01-11 03:24:05    点击率:

本文主要给大家介绍了关于Spring MVC数据转换的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

数据绑定

SpringMVC负责将request中的信息以一定的方式转换并绑定到处理方法的参数上。整个过程的处理核心是由DataBinder完成。转换流程如下:

     1.DataBinder从ServletRequest中获取参数信息;

     2.DataBinder获取处理方法的参数;

     3.DataBinder调用ConversionService组件数据类型转换和数据格式化工作,并将转化结果填充到参数对象中;

     4.DataBinder调用Validator组件进行数据的校验工作;

     5.经历以上步骤后,DataBinder将生成BinderResult对象,BinderResult中包含转换后的信息,也包含校验后的错误信息。

数据转换

在java语言中,在java.beans包中提供了一个PropertyEditor接口来进行数据转换,PropertyEditor的核心功能是将一个String转换为一个java对象。Spring从3.0开始添加一个通用的类型转换模块即为org.springframework.convert包中,ConversionService是org.springframework.convert包的核心组件,可以通过使用ConversionServiceFactoryBean在spring的上下文中自定义一个ConversionService,Spring将自动识别这个ConversionService,并在SpringMVC进行参数转换时使用,配置例子如下所示:

<bean id="conversionService"
 class="org.springframework.context.support.ConversionServiceFactoryBean">
 <property name="converters">
  <list>
  <bean class="org.xx..StringToDateConverter" />
  </list>
 </property>
</bean>

SpringMVC在支持新的转换器框架的同时,也支持javabeans的PropertyEditor,可以在控制器中使用@InitBinder添加自定义的编辑器。

举例如下:

@Controller 
public class DataBinderTestController { 
 @RequestMapping(value = "/dataBind") 
 public String test(DataBinderTestModel command) { 
 ......
 } 
 @InitBinder 

 public void iniiBinder(WebDataBinder binder){ 
  
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); 
 format.setLenient(false); 
 binder.registerCustomEditor(Date.class, new CustomDateEditor(format, false)); 
 } 
} 

各种转换器的优先顺序:

      1.查询通过@InitBinder自定义的编辑器;

      2.查询通过ConversionService装配的自定义转换器;

      3.查询通过WebBindingInitializer接口装配的全局自定义编辑器。

Formater

除了org.springframework.core.convert.converter接口中定义的三种类型的转换器接口,SpringMVC在org.springframework.format包中还提供了一些格式化转换接口,format和converter的最大的区别是,converter实现的是object到object的转换,而format实现的是从String到Object的转换,format包中最重要的接口是Formater,Formater的使用示例如下所示:

public class DateFormatter extends Formatter<Date>{
 private String datePattern;
 
 private SimpleDateFormat dateFormat;
 
 public DateFormatter(String datePattern){
 this.datePattern=datePattern;
 this.dateFormat=new SimpleDateFormat(datePattern);
 }
 
 public String pring(Date,Locale locale){
 return dateFormat.format(date);
 }
 
 public Date parse(String source,Locale locale) throws ParseException{
 try{
  return dateFormat.parse(source);
 }catch(Exception e){
  ......
 }
 }
}

最后再将DateFormatter注入到ConversionService中,注入方式和Converter的注入方式一样,也可由此发现,ConversionService是数据转换的核心。

Format的注解

在org.springframework.format.annotation包中定义了两个注解,@DateTimeFormat和@NumberFormat 这两个注解可以用在domain中的属性上,SpringMVC处理方法参数绑定数据、模型数据输出时会自动通过注解应用格式化的功能。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# spring  # mvc  # springmvc类型转换器  # springmvc  # 转换器  # Spring MVC登录注册以及转换json数据  # SpringMVC中Json数据格式转换  # SpringMVC对日期类型的转换示例  # SpringMVC中日期格式的转换  # springMVC4之强大类型转换器实例解析  # springmvc实现自定义类型转换器示例  # SpringMVC实现自定义类型转换器  # 自定义  # 包中  # 绑定  # 编辑器  # 所示  # 的是  # 相关内容  # 说了  # 是由  # 最重要  # 不多  # 并在  # 有一定  # 是从  # 也可  # 这两个  # 可以通过  # 自动识别  # 给大家  # 并将 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: linux写shell需要注意的问题(必看)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  js代码实现下拉菜单【推荐】  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  使用Dockerfile构建java web环境  Laravel怎么实现模型属性的自动加密  ,网页ppt怎么弄成自己的ppt?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  javascript基本数据类型及类型检测常用方法小结  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Bootstrap整体框架之JavaScript插件架构  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Android自定义listview布局实现上拉加载下拉刷新功能  桂林网站制作公司有哪些,桂林马拉松怎么报名?  什么是javascript作用域_全局和局部作用域有什么区别?  nodejs redis 发布订阅机制封装实现方法及实例代码  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  网站优化排名时,需要考虑哪些问题呢?  如何在企业微信快速生成手机电脑官网?  Java类加载基本过程详细介绍  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何安全更换建站之星模板并保留数据?  JavaScript如何实现倒计时_时间函数如何精确控制  Python并发异常传播_错误处理解析【教程】  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Python进程池调度策略_任务分发说明【指导】  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  公司门户网站制作流程,华为官网怎么做?  如何在阿里云服务器自主搭建网站?  Python3.6正式版新特性预览  LinuxCD持续部署教程_自动发布与回滚机制  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何实现javascript表单验证_正则表达式有哪些实用技巧  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  如何快速搭建支持数据库操作的智能建站平台?