序:数据绑定并非没有限制,有案例表明Spring在如何正确绑定数据方面是杂乱无章的。例如,Spring总是试图用默认的语言区域将日期输入绑定到Java.util.Date。如果想让Spring使用不同的时间格式,就需要一个Converter(转换器)和Formatter(格式化)
1.Converter 可以将一种类型转换为另一个种类型的对象,可用于任何层
创建Converter,必须编写一个实现org.springframework.core.convert.converter.Cnoverter接口的Java类,该接口的声明为 public interface Converter<S,T> S表示源类型,T表示目标类型。
Java类的声明应该为 :
public class MyConverter implements Converter<Long , Date>{} 将Long型转换为Date类型
需要编写一个来自Converter接口的convert方法,方法签名为 T convert (S source) ,代码如下:
public class DateConverter implements Converter<String,Date> {
@Override
public Date convert(String source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try{
return sdf.parse(source);
}catch(Exception e) {
throw new IllegalArgumentException("cuol");
}
}
}
为了使用Spring MVC中定制的Converter,需要在SpringMVC配置文件中编写一个 conversionService bean。Bean的类名必须为 org.springframework.context.support.ConversionServiceFactoryBean。这个bean必须包含一个converters属性,它将列出要在应用要在应用程序中使用的所有定制的Converter
如下:
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" >
<list>
<bean class="com.Converter.StringToDateConverter"> //自己书写的java类
<constructor-arg type="java.lang.String" value="MM-dd-yyyy" /> //用构造函数的方式给类内值赋值,如上面的没有构造函数和字符串变量,这个可以不配置
</bean>
</list>
</property>
</bean>
要给annotation-driven元素的conversion-service属性赋bean名称,如下:
<mvc:annotation-driven conversion-service="converterService" />
2. Formatter 格式化 只能将String类型转换为另一种类型,只适用于Web层
1)为了创建Formatter ,要编写一个实现org.springframework.format.Formatter接口的Java类 ,该接口的声明为 public interface Formatter <T> T为目标类型,该接口有parse和print两个方法,所有实现都必须覆盖
T parse(String text, java.util.Locale locale) parse 方法利用指定的Locale将一个String类型解析成目标类型
String print(T object ,java.util.Locale locale) print方法返回目标对象的字符串表示法
为了在Spring中使用Formatter ,需要利用conversionService bean进行注册 ,bean的类名必须为org.springframework.format.support.FormattingConversionService
在SpringMVC中配置
<context:component-scan base-package="包名.子包名">
<mvc:annotation-driven conversion-service ="conversionService" />
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="formatters" >
<set>
<bean class="com.formatter.DateFormatter">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy" />
</bean>
</set>
</property>
</bean>
2)用Registrar注册Formatter
编写一个MyFormatterRegistrar的Java类,继承FormatterRegistrar接口
public class MyFormatterRegistrar implements FormatterRegistrar {
private String datePattern ;
public MyFormatterRegistrar(String datePattern){
this,datePattern = datePattern ;
}
@Override
public void registerFormatters(FormatterRegistry registry){
registry.addFormatter(new DateFormatter(datePattern));
//register more formatters here
}
}
然后有了Registrar 就不需在SpringMVC的配置文件中注册任何Formatter了。只需要注册Registrar ,如下:
<mvc:annotation-driven conversion-service ="conversionService" />
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="formatters" >
<set>
<bean class="com.formatter.MyFormatterRegistrar">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy" />
</bean>
</set>
</property>
</bean>