springmvc实现数据类型转换
最近在敲一个ssm项目的过程中遇到了数据类型转换的问题,只是记得好像可以在springmvc中来实现,但具体咋实现记不清了,正好借此重新回顾一下。
spring中实现类型转换模块的代码在org.springframework.core.convert这个包中
使用ConversionService进行类型转换
**.core.convert.ConversionService是实现spring类型转换的核心接口,该接口定义了中有4个方法。
1.boolean canConvert(Class<?> sourceType, Class<?> targetType);判断是都可以将一个java类转换成另一个类。
2.boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType);将需要转换的类以成员变量的方式出现,TypeDescriptor描述了需要转换类的信息,还描述了类的上下文信息(我也没看懂是个啥意思)
3. T convert(Object source, Class targetType);将源类型对象转换成目标类型对象
4.Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType);
可以利用org.springframework.context.support.ConversionServiceFactoryBean在spring上下文中定义一个ConversionService,spring会自动识别上下文中的ConversionService,并在SpringMVC处理Bean的属性配置或者方法的入参时,进行数据转换。下面举个例子,将前台传来的时间的字符串数据转换成Date数据。
前台页面:
结果页面:
关键部分的代码在springmvc的配置文件中:
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.springmvc.*"></context:component-scan>
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置视图扫描器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.springmvc.convert.ConvertTest" p:dataPattern="yyyy-MM-dd"></bean>
</list>
</property>
</bean>
在该配置文件中,mvc:annotation-driven/标签可简化SpringMVC的相关配置,自动注册处理器适配器和处理器映射器的两个Bean。而当这个标签没有显示定义时,会默认注册一个ConversionService,满足大部分类型转换的需求。而现在需要的是注册一个自定义的转换类,所以要显示定义一个ConversionService来覆盖默认的实现类。
自定义了一个转换类:
public class ConvertTest implements Converter<String, Date> {
private String dataPattern;//日期的模板类型 如:yyyy-MM-dd
public void setDataPattern(String dataPattern) {
this.dataPattern = dataPattern;
}
@Override
public Date convert(String date) {
// TODO Auto-generated method stub
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(this.dataPattern);
return dateFormat.parse(date);
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}
使用@InitBinder注解进行类型转换
除了使用ConversionService进行类型转换,还可以使用SpringMVC的注解@InitBinder和Spring自带的WebDataBinder来实现这一类型转换。
使用该方法是要在Controller类中添加initBinder()方法并加上@InitBinder的注解。
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
@RequestMapping(value="/submit2",method = RequestMethod.POST)
public String submit2(User user,Model model) {
System.out.println(user.getName());
System.out.println(user.getbirthday());
model.addAttribute("user", user);
return "result";
}
@InitBinder表示的方法的参数为WebDataBinder,是DataBinder的子类。
DataBinder是数据绑定的核心部件,可以用来进行数据类型转换,格式化以及数据校验。
最后结果如下: