springmvc 配置 中conversionService可以配置类型转换,springmvc 参数绑定 中各种绑定方式和注解就是使用的这些转换器

一、先看下spring提供的内建类型转换器

  • 第一组:标量转换器
1:StringToBooleanConverter :String----->Boolean
如:true:true/on/yes/1; false:false/off/no/0
 
2:ObjectToStringConverter :Object----->String ,调用toString方法转换
 
3:StringToNumberConverterFactory :String----->Number(如Integer、Long等)
 
4:NumberToNumberConverterFactory :Number子类型(Integer、Long、Double等)<——> Number子类型(Integer、Long、Double等)
 
5:StringToCharacterConverter :String----->java.lang.Character,取字符串第一个字符
 
6:NumberToCharacterConverter :Number子类型(Integer、Long、Double等)——> java.lang.Character
 
7:CharacterToNumberFactory :java.lang.Character ——>Number子类型(Integer、Long、Double等)
 
8:StringToEnumConverterFactory :String----->enum类型,通过Enum.valueOf将字符串转换为需要的enum类型
 
9:EnumToStringConverter :enum类型----->String,返回enum对象的name()值
 
10:StringToLocaleConverter :String----->java.util.Local
 
11:PropertiesToStringConverter :java.util.Properties----->String,默认通过ISO-8859-1解码
 
12:StringToPropertiesConverter :String----->java.util.Properties,默认使用ISO-8859-1编码
  • 第二组:集合、数组相关转换器
1:ArrayToCollectionConverter :任意S数组---->任意T集合(List、Set)
 
2:CollectionToArrayConverter :任意T集合(List、Set)---->任意S数组
 
3:ArrayToArrayConverter :任意S数组<---->任意T数组
 
4:CollectionToCollectionConverter :任意T集合(List、Set)<---->任意T集合(List、Set),即集合之间的类型转换
 
5:MapToMapConverter :Map<---->Map之间的转换
 
6:ArrayToStringConverter :任意S数组---->String类型
 
7:StringToArrayConverter :String--->数组,默认“,”分割,且去除字符串的两边空格
 
8:ArrayToObjectConverter :任意S数组---->任意Object的转换,(如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换)
 
9:ObjectToArrayConverter :Object----->单元素数组
 
10:CollectionToStringConverter :任意T集合(List、Set)---->String类型
 
11:StringToCollectionConverter :String----->集合(List、Set),默认通过“,”分割,且去除字符串的两边空格(trim)
 
12:CollectionToObjectConverter :任意T集合---->任意Object的转换,(如果目标类型和源类型兼容,直接返回源对象;否则返回S数组的第一个元素并进行类型转换)
 
13:ObjectToCollectionConverter :Object----->单元素集合
  • 第三组:默认转换器,以上转换器不能转换时调用
1:ObjectToObjectConverter :Object(S)----->Object(T),首先尝试valueOf进行转换、没有则尝试new 构造器(S)
 
2:IdToEntityConverter :Id(S)----->Entity(T),查找并调用public static T find[EntityName](S)获取目标对象,EntityName是T类型的简单类型
 
3:FallbackObjectToStringConverter :Object----->String,ConversionService作为恢复使用,即其他转换器不能转换时调用(执行对象的toString()方法)
 
这些转换器在<mvc:annotation-driven />时就自动注册了,所以不需关心
二、自定义转换器
  • 在Controller范围,使用@InitBinder来注册customer propertyEditor
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, false));
}

注册"yyyy-MM-dd"日期格式的转换器

  • 实现WebBindingInitializer 接口来实现全局注册
public class CustomerBinding implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(
dateFormat, false)); }
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer">
<bean class="springtry.web.util.MyWebBindingInitializer" />
</property>
</bean>
  • 使用conversion-service来注册自定义的converter,同样是全局范围
public class MyCustomerConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
try {
return dateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
<mvc:annotation-driven conversion-service="conversionService" />

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="springtry.web.util.MyCustomerConverter" />
</set>
</property>
</bean>

三、着重讲下@RequestBody使用的转换器

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!--json转换器-->
</list>
</property>
</bean>
<bean id="mappingJacksonHttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes"><!--response的Content-Typ-->
<list>
<value>text/html;charset=UTF-8</value><!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>

默认的messageConverters包含了以下几种

  • ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
  • StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;
  • ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
  • FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
  • MappingJackson2HttpMessageConverter:  负责读取和写入json格式的数据;
  • SouceHttpMessageConverter:                   负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
  • Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;
  • AtomFeedHttpMessageConverter:              负责读取和写入Atom格式的数据;
  • RssChannelHttpMessageConverter:           负责读取和写入RSS格式的数据;
 根据Request对象header部分的Content-Type类型,逐一匹配合适的HttpMessageConverter来读取数据
 
 
 
 
 

springmvc(3)--数据类型转换的更多相关文章

  1. Springmvc 进行数据类型转换

    SpringMVC进行一些常用的数据类型转换,这里以Date 数据类型的转换为例. SpringMVC表单中输入日期,一般都是以字符串的形式输入,如何将字符形式的日期转换为Date 类型的呢?这里只需 ...

  2. SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

    在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1. ...

  3. SpringMVC(三)-- 视图和视图解析器、数据格式化标签、数据类型转换、SpringMVC处理JSON数据、文件上传

    1.视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象 对于那些返回 String,View 或 ModeMap 等类型的处理方法,SpringMVC 也会在内部将 ...

  4. 【SpringMVC】SpringMVC系列12之数据类型转换、格式化、校验

      12.数据类型转换.格式化.校验 12.1.数据绑定流程     Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFacto ...

  5. SpringMVC 数据转换 & 数据格式化 & 数据校验

    数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象 ...

  6. SpringMVC——数据转换 & 数据格式化 & 数据校验

    一.数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方 法的入参实例传递给 WebDataBinderFactory 实例,以创 建 DataBinder ...

  7. Spring(六)SpringMVC的数据响应

    SpringMVC的请求和响应 SpringMVC的数据响应 01-SpringMVC的数据响应-数据响应方式(理解) 1)    页面跳转 直接返回字符串 通过ModelAndView对象返回 2) ...

  8. 第24章 Java 数据类型转换

    每日一句 井底点灯深烛伊,共郎长行莫围棋. 每日一句 What we call "failure" is not falling down, but the staying dow ...

  9. springmvc的数据校验

       springmvc的数据校验 在Web应用程序中,为了防止客户端传来的数据引发程序异常,常常需要对数据进行验证,输入验证分为客户端验证与服务器端验证. 客户端验证主要通过javaScript脚本 ...

随机推荐

  1. hdoj 5389 Zero Escape

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 大体题意是:有两个门A和B,还有一群人,每个人都有一个数字, 疯了一样的T..比赛的时候十连T也 ...

  2. Ajax.ActionLink与Ajax.BeginForm使用场所的思考

    Ajax.ActionLink使用在提交参数明确的情况下,如: Ajax.ActionLink("加入购物车", "AddToCart", "Cart ...

  3. d3d导致cairo不正常

    最近要把cairo集成到项目中,却发现cairo不能工作了 折腾了两天才找到了原因:cairo的一个trick导致浮点数计算错误: http://blog.163.com/lvan100@yeah/b ...

  4. 通过ajax获得json数据后格式的转换

    在有些情况下获取到的json数据可能是string类型的,需要把其格式化为json对象才方便解析. a)原生js通过ajax获取到的json 此时返回的数据默认是string型的,所以需要用eval( ...

  5. AP(应付帐管理)

    --更新供应商地点 PROCEDURE update_vendor_site(p_init_msg_list IN VARCHAR2 DEFAULT fnd_api.g_false, x_return ...

  6. android布局太深导致的 java.lang.StackOverflowError

    E/AndroidRuntime( 1900): java.lang.StackOverflowError E/AndroidRuntime( 1900):     at android.graphi ...

  7. Qt中的 Size Hints 和 Size Policies

    sizeHint 这个属性所保存的 QSize 类型的值是一个被推荐给窗口或其它组件(为了方便下面统称为widget)的尺寸,也就是说一个 widget 该有多大,它的一个参考来源就是这个 sizeH ...

  8. c++学习笔记(1)

    流操纵符std::endl输出一个换行符,然后刷新输出缓冲,在一些系统中,输出在机器中缓存,直至积累到“值得”输出到屏幕上为止,而std::endl强制显示所有积存的输出。 c++的一个强大的功能是用 ...

  9. 关于c#中的Timer控件的简单用法

    Timer控件主要会用到2个属性一个是Enabled和IntervalEnabled主要是控制当前Timer控件是否可用timer1.Enabled=false;不可用timer1.Enabled=t ...

  10. Codeforces Gym 100015C City Driving 离线LCA

    City Driving 题目连接: http://codeforces.com/gym/100015/attachments Description You recently started fre ...