SpringMVC学习笔记五:使用converter进行参数数据转换
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832898.html
一:SpringMVC数据绑定机制
1:request到达SpringMVC框架时,框架会把request对象以及其映射的处理函数的参数实例,传递给 DataBinder;
2:DataBinder调用ConversionService组件,对request对象传过来的参数进行数据类型转换、数据格式化操作,然后把数据绑定到处理函数的参数实例;
3:然后调用Validator组件对绑定了值的参数对象进行数据校验,并生成数据绑定结果BindingResult。
4:SpringMVC抽取BindingResult中的函数参数对象以及校验结果对象,赋值给请求处理函数的相应参数。
二:数据转换
可以在SpringMVC的配置文件中,通过 org.springframework.context.support.ConversionServiceFactoryBean注册一个conversionService。SpringMVC在request对象中绑定的参数时,就会使用这个conversionService进行数据转换。
ConversionServiceFactoryBean默认内置了许多转换器,可以完成一般的数据类型转换,如:String类型参数转换为各种基本数据类型、包装类、Array、集合类等。
但是,稍微复杂的转换就不行了,比如:日期格式的字符串要求转换为Date类型,以及其他开发者自定义的格式的数据的转换。这个时候,可以自定义数据转换器,并注册到Spring中即可。
三:自定义数据转换器
实现Converter<S,T>接口:把S类型数据转换为T类型。
类中实现接口的唯一方法 convert(S sourse),该方法负责request参数中S类型对象的数据传进来,进行格式判断后,转换为T类型对象并返回。
public class ProcuctConverter implements Converter<String, Product>//把字符串提取,封装成为一个bean对象
{
public Product convert(String source)
{
if(source != null)
{
Product product = new Product();
String[] values = source.split("-");
if(values != null && values.length==4)
{
product.setName(values[0]);
product.setDescription(values[1]);
product.setPrice(Float.parseFloat(values[2]));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
product.setProductionDate(new Date());
System.out.println(source + "--converter"+product);
return product;
}
}
return null;
}
}
四:注册自定义数据转换器
有两种方式:
1:在springMVC配置文件中配置:
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">//注册自定义类型转换器到ConversionServiceFactoryBean的属性中
<property name="converters">
<set>
<bean class="路径.procuctConverter" p:成员变量名="注入变量值"(如果自定义类型转换器有全局变量,则通过配置进行注入值)/>
</set>
</property>
</bean> <mvc:annotation-driven conversion-service="conversionService" />//装配自定义类型转换器
2:如果希望在全局范围内(即:所以controller类都有效)使用自定义转换器,可以实现WebBindingInitializer接口,在实现类中实现initBinder方法把自定义类型转换器注册到全局范围。然后在springMVC配置文件中配置全局自定义转换器即可。
public class MyWebBindingInitializer implements WebBindingInitializer {
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(转换结果类型.class,new 自定义转换器(参数值));
}
}
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="路径.MyWebBindingInitializer"/>//配置自定义的全局转换器
</property>
</bean>
当使用了<mvc:annotation-driven />的时候,它会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean。
这时候第二种方式指定的全局属性编辑器就不会起作用了,解决办法是:手动的添加上面的配置,并把它们加在<mvc:annotation-driven/>的前面。
如果不生效,则将手动注册AnnotationMethodHandlerAdapter改为手动注册RequestMappingHandlerAdapter。
SpringMVC学习笔记五:使用converter进行参数数据转换的更多相关文章
- SpringMVC学习笔记:表单提交 参数的接收
SpringMVC可以接收原生form表单和json格式数据 有一个名为Book的model,其中的属性如下: 字符串类型的name,数字类型的price,数组类型的cover,集合类型的author ...
- SpringMVC学习记录五——功能开发及参数处理
15 包装类型pojo参数绑定 15.1 需求 商品查询controller方法中实现商品查询条件传入. 15.2 实现方法 第一种方法:在形参中 添加HttpServ ...
- SpringMVC 学习笔记(五)
47. 尚硅谷_佟刚_SpringMVC_文件上传.avi 参看博客https://www.cnblogs.com/hanfeihanfei/p/7931758.html相当的经典 我是陌生人关于Sp ...
- springMVC学习笔记(五)
一.使用Ajax调用 1.1 Controller返回的类型为text类型的方式. @RequestMapping("/getPerson") public void getPer ...
- Python学习笔记五,函数及其参数
在Python中如何自定义函数:其格式为 def 函数名(函数参数): 内容
- SpringMVC 学习笔记(五) 基于RESTful的CRUD
1.1. 概述 当提交的表单带有_method字段时,通过HiddenHttpMethodFilter 将 POST 请求转换成 DELETE.PUT请求,加上@PathVariable注解从而实现 ...
- SpringMVC学习笔记五:HandlerExceptionResolver异常处理
继承HandlerExceptionResolver自定义异常处理器 控制器ExceptionController.java package com.orange.controller; import ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
随机推荐
- 如何在SpringMVC中获取request对象
1.注解法 @Autowired private HttpServletRequest request; <listener> <listener-class> org.spr ...
- 丑闻第三季 /全集Scandal迅雷下载
丑闻 第三季 Scandal Season 3 (2013)本季看点:在经典美剧<老友记第一季>中饰演菲比的女星莉莎·库卓,即将加盟描写华府危机公关的ABC剧集<丑闻>(Sca ...
- C/C++ 关于 for循环 的第二个表达式右侧非常量的时候
废话不多说,直接看代码: #include<stdio.h> int main(){ ; ;z<zmax;z++){ printf("i=%d z=%d\n",i ...
- verilog语法实例学习(7)
常用的时序电路介绍 组合电路:这类电路的输出信号值仅却决于输入端信号值. 时序电路:时序电路的输出值不仅取决于当前的输入值,还取决于电路的历史状态,所以时序逻辑电路中包含保存逻辑信号值的存储元件,存储 ...
- 面试题-Redis、MongoDB、Memcached[转]
https://blog.csdn.net/gangsijay888/article/details/81213811 一.缓存 搞懂缓存那些事:https://blog.csdn.net/a7248 ...
- sgd学习率选择问题
关于使用SGD时如何选择初始的学习率(这里SGD是指带动量的SGD,momentum=0.9): 训练一个epoch,把学习率从一个较小的值(10-8)上升到一个较大的值(10),画出学习率(取log ...
- Proguard使用最新,最全教程,亲自试验
最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而且网上资料最多的.由于不是纯JAVA项目 ...
- Java程序员须知的七个日志管理工具
本文由 ImportNew - 赖 信涛 翻译自 takipiblog.欢迎加入翻译小组.转载请见文末要求. Splunk vs. Sumo Logic vs. LogStash vs. GrayLo ...
- C#将数据集DataSet中的数据导出到EXCEL文件的几种方法
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.W ...
- 解决Ubuntu/debian的Apt-get 由于依赖关系安装失败的问题
The following packages have unmet dependencies: libssl-dev: Depends: libssl0.9.8 (= 0.9.8k-7ubuntu8) ...