1.为什么使用springmvc的数据转换
首先由于java提供的PropertyEditor的核心功能是将一个字符串转为一个java对象,但是PropertyEditor只能用于字符串到java对象的转换,不适用于任意两个java类型之间的转换。对源对象及目标对象所在的上下文信息不敏感,在类型转换时不能利用这些上下文信息实施高级的转换逻辑。spring不仅对PropertyEditor的缺陷都支持外,还提供了Bean配置、以及通过springmvc处理方法入参绑定使用它们。
2.springmvc类型转换的接口ConversionService
ConversionService是spring类型转换中的核心接口。
接口方法:
说明:判断是否可以将一个java类转换为另一个java类。不关注类型对象的上下文信息,只简单地完成两个类型对象的转换。
说明:通过TypeDescriptor描述需转换类的信息,还描述宿主类的上下文信息,而转换的类将以成员变量的方式出现在宿主类中。类型转换逻辑可以利用这些信息做出各种灵活的控制。而该方法的特点就是参考类型对象所在宿主类的上下文信息,并利用这些信息进行类型转换。
说明:将源类型的对象转换为目标类型的对象。不关注类型对象的上下文信息,只简单地完成两个类型对象的转换。
说明:通过使用所在宿主类的上下文信息来将源类型对象转换为目标类型对象。
3.常用的类型转换器接口
①Converter<S,T>
该接口仅包含一个方法convert,作用就是将S类型的对象转换为T类型的对象。
②GenericConverter
该接口会根据原类对象及目标类对象所在宿主类的上下文信息进行类型转换工作。
③ConverterFactory
该接口提供了将相同系列多个"同质"Converter封装在一起的ConverterFactory接口。
4.自定义类型转换
自定义类:
public class StringToUserConverter implements Converter<String, User>{
@Override
public User convert(String source) {
User user =new User();
if(source !=null){
//这个解析格式按照自己传输的过来为基准
String[] items =source.split("-");
user.setUsername(items[0]);
user.setPassword(items[1]);
}
return user;
}
}
spring配置文件:
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="cn.spy.control.StringToUserConverter"></bean>
</list>
</property>
</bean>
对于<mvc:annotation-driven/>标签,默认情况是创建一个DefaultAnnotationHandlerMapping和一个RequestMappingHandlerAdapter实例。如果上下文中存在自定义的对应组件Bean,springmvc会自动使用自定义的Bean对默认的覆盖。
5.使用@InitBinder添加自定义编辑器
自定义编辑器:
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(User.class, new UserEditor());
}
registerCustomEditor方法注册自定义编辑器。
6.使用WebBindingInitializer装配全局范围的编辑器
全局编辑器:
public class MyBindingInitializer implements WebBindingInitializer{
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
// TODO Auto-generated method stub
binder.registerCustomEditor(User.class, new UserEditor());
}
}
spring配置文件:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer">
<beans:bean class="cn.spy.service.MyBindingInitializer"></beans:bean>
</property>
</bean>
注意:
springmvc按照以下顺序优先查找对应类型的编辑器:
①查询通过@InitBinder装配的自定义编辑器
②查询通过ConversionService装配的自定义转换器
③查询通过WebBindingInitializer装配的自定义编辑器。