PropertyEditor、Formatter、Converter的应用
@ResponseBody @RequestMapping("date.do") public String data(Date date) { return date.toString(); }
访问路径:http://localhost:8080/date.do?date=1996-11-11
一、PropertyEditor的应用
内置的可扩展性;局部使用webdatabinder
实例:
@InitBinder("date") public void initDate(WebDataBinder binder) { String pattern = "yyyy-MM-dd"; binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat(pattern), true)); }
二、Formatter的应用
内置的可扩展性;全局/局部;Source=String
实例一:
编写DateFormatter.java类:
package com.tyk.service.formatter; import org.springframework.format.Formatter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class DateFormatter implements Formatter<Date> { private String pattern; public DateFormatter(String pattern) { this.pattern = pattern; } @Override public Date parse(String text, Locale locale) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.parse(text); } @Override public String print(Date object, Locale locale) { return object.toString(); } }
配置文件spring-*.xml:
<mvc:annotation-driven conversion-service="dateFormatter"/> <bean id="dateFormatter" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatters"> <set> <bean class="com.tyk.service.formatter.DateFormatter"> <constructor-arg value="yyyy-MM-dd" type="java.lang.String"/> </bean> </set> </property> </bean>
实例二:
编写DateRegistrar.java类:
package com.tyk.service.formatter; import org.springframework.format.FormatterRegistrar; import org.springframework.format.FormatterRegistry; public class DateRegistrar implements FormatterRegistrar { private String pattern; public DateRegistrar(String pattern) { this.pattern = pattern; } @Override public void registerFormatters(FormatterRegistry registry) { registry.addFormatter(new DateFormatter(pattern)); } }
配置文件spring-*.xml:
<mvc:annotation-driven conversion-service="dateRegistrar"/> <bean id="dateRegistrar" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="formatterRegistrars"> <set> <bean class="com.tyk.service.formatter.DateRegistrar"> <constructor-arg value="yyyy-MM-dd" type="java.lang.String"/> </bean> </set> </property> </bean>
三、Converter的应用
内置的不可扩展性;全局/局部;Source=自定义
实例:
编写DateConverter.java类
package com.tyk.service.converter; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateConverter implements Converter<String, Date> { private String pattern; public DateConverter(String pattern) { this.pattern = pattern; } @Override public Date convert(String source) { SimpleDateFormat sdf = new SimpleDateFormat(pattern); try { return sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; } }
配置文件spring-*.xml:
<mvc:annotation-driven conversion-service="dateConverter"/> <bean id="dateConverter" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.tyk.service.converter.DateConverter"> <constructor-arg value="yyyy-MM-dd" type="java.lang.String"/> </bean> </list> </property> </bean>
选择:
局部:PropertyEditor
全局: Web层:Formatter
全部层:Converter
比较:
Formatter的源类型必须是String,而Converter适用于任意的源类型
Formatter只能将String转换成另一种Java类型,例如,将Spring转换为Date,但是他不能将Long转换成Date。因此,Formatter适用于Web层。为此,在Spring MVC应用程序中,选择Formatter比选择Converter更合适。