上一个博客中索道数据绑定,但是要在Spring正确绑定数据需要用到转换器(Converter)和格式化(Formatter)。
Converter是通用原件,可以在应用程序的任意层中使用。
Formatter是专门为Web层设计的。
Converter
Converter可以将一种类型转换成另一种类型的对象。为了创建Converter,必须实现org.springframework.core.converter.Converter接口的一个java类。
public interface Converter<S,T>
s表示源类型,T表示目标类型。
一下代码是可以把String转换成LocalDate数据类型的程序。
public class StringToLocalDateConverter implements Converter<String, LocalDate> { private String datePattern; public StringToLocalDateConverter(String datePattern) { this.datePattern = datePattern; } @Override public LocalDate convert(String s) { try{ return LocalDate.parse(s, DateTimeFormatter.ofPattern(datePattern)); }catch(DateTimeParseException e) { throw new IllegalArgumentException("invalid date format. please user this pattern\"" + datePattern + "\""); } } }
为了使用Spring MVC应用程序中定制的Converter,需要在Spring MVC配置文件中编写名为conversionService的bean。bean的类名必须为org.springframework.context.support.ConversionServiceFactoryBean。这个bean必须包含一个converters属性,它将列出要在应用程序中使用的所有定制Converter。之后要给annotation-driven元素的conversion-service属性赋值bean名称。
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="converter.StringToLocalDateConverter"> <constructor-arg type="java.lang.String" value="MM-dd-yyyy"/> </bean> </list> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"/>
Formatter
Formatter也是将一种类型转换成另一种类型。但是Formatter的源类型必须是String,而Converter则适用于任意的源类型。Formatter更适合Web层,Converter可以在任意层使用。为了转换Spring MVC应用程序表单中的用户输入,始终应该选择Formatter,而不是Converter。
使用FormatterRegistrar注册Formatter
public class MyFormatterRegistrar implements FormatterRegistrar { private String datePattern; public MyFormatterRegistrar(String datePattern){ this.datePattern = datePattern; } @Override public void registerFormatters(FormatterRegistry registry){ registry.addFormatter(new LocalDateFormatter(datePattern)); } }
有了Registrar,就不需要在Spring MVC配置文件中注册任何Formatter了,只在Spring配置文件中注册Registrar就可以了
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="conversionService" class="org.springframework.format.support.FormattinConversinoServiceFactoryBean"> <property name="formatterRegistrars"> <list> <bean class="formatter.MyFormatterRegistrar"> <constructor-arg type="java.lang.String" value="MM-dd-yyyy"/> </bean> </list> </property> </bean>
选择Converter,还是Formatter
Converter是一般工具,可以将一种类型转换成另一种类型。
Formatter只能将String转换成另一种java类型。
所以在Web层上Formatter更合适。