6.2.2 Spring支持的转换器
Spring
在org.springframework.core.convert.converter
包中定义了3种类型的转换器接口
,我们可以实现其中任意一种转换器接口,并将它作为自定义转换器注册到ConversionServiceFactoryBean
当中。这3种类型转换器接口如下所示:
Converter接口
Converter<S,T>
接口是Spring
中最简单的一个转换器接口,该接口中只有一个方法:
1 | 此处有代码后面补上 |
该方法负责将S
类型的对象转换为T
类型的对象。
ConverterFactory接口
如果希望将一种类型的对象转换为另一种类型及其子类对象,比如将String
转换为Number
以及Number
的子类Integer
、Double
等对象,就需要一系列的Converter
,如StringToInteger
、StringToDouble
等。ConverterFactory<S,R>
接口的作用就是将相同系列的多个Converter
封装在一起。该接口中也只有一个方法:
1 | 此处有代码后面补上 |
S
为转换的源类型,R
为目标类型的基类,T
为R
的子类。
GenericConverter
Converter<S,T>
接口只是负责将一个类型对象转换为另一个类型的对象,它并没有考虑类型对象上下文信息,因此并不能完成”复杂”类型的转换工作。GenericConverter
接口会根据源类对象及目标类对象的上下文信息进行类型转换。该接口中定义了两个方法:
1 | 此处有代码后面补上 |
ConvertiblePair
封装了源类型和目标类型,而TypeDescriptor
包含了需要转换的类型对象的上下文信息,因此GenericConverter
接口的convert()
方法可以利用这些上下文信息完成类型转换的工作。
示例 使用ConversionService转换数据
域对象
1 | // 域对象,实现序列化接口 |
User
提供了loginname
和birthday
属性,用于接收JSP
页面传入的数据。注意,birthday
属性的类型是一个java.util.Date
,而JSP
页面传入的控件数据类型都是String
,这里就需要将String
转换成Date
对象。
测试链接
1 | <a href="registerForm">测试registerForm</a> |
请求处理方法
1 | "/registerForm") (value = |
登录表单
1 |
|
表单处理方法
1 | "/register") (value = |
register
方法只是简单地接收请求数据,并将数据转换并设置到User
对象当中,转换工作使用自定义的转换器来完成,转换器的使用方法如下所示:
自定义转换器
这里的转换器通过实现Converter<S,T>
接口的方法实现,Converter<String, Date>
可以将String
类型的数据转换为Date
类型
1 | // 实现Converter<S,T>接口 |
使用自定义转换器
有了自定义转换器,接下来就要使用这个转换器了,在Spring
配置文件中配置转换器的bean
就行了.
在Sping配置文件中创建自定义转换器
1 | <!-- 自定义的类型转换器 --> |
在Spring配置文件中装配自定义转换器
1 | <!-- 装配自定义的类型转换器 --> |
在springmvc-config.xml
配置文件中,使用了mvc:annotation-driven
标签,该标签可以简化Spring MVC
的相关配置,使用mvc:annotation-driven
标签可以自动注册RequestMappingHandlerMapping
与RequestMappingHandlerAdapter
两个Bean
,这是SpringMVC
为@Controllers
注解分发请求所必需的。
除此之外,mvc:annotation-driven
标签还会注册一个默认的ConversionService
(FormattingConversionServiceFactoryBean
),以满足大多数类型转换的需求。现在由于需要注册一个自定义的StringToDateConverter
转换类,因此,需要显式定义一个ConversionService
覆盖mvc:annotation-driven
中的默认实现类,而这一步需要在,mvc:annotation-driven
标签设置converters
属性来完成。
填写表单
输入登录名和生日信息,单击”登录”按钮,转换器会自动将输入的日期字符串转换成Date
类型,并将其设置到User
对象的birthday
属性当中。控制台输出如下所示:
1 | User [loginname=小明, birthday=Thu Sep 06 00:00:00 CST 126] |
可以看到,User
对象的birthday
属性已经获得JSP
页面传入的日期值。
成功页面
1 | 登录名:${requestScope.user.loginname } |