这两者的功能都是为了对我们前台请求数据的转换,使程序能够正常接收
PropertyEditorSupport : Spring 3.0之前使用的架构
Converter:Spring 3.0之后的类型转换系统
两者的区别详细可看这篇文章:http://jinnianshilongnian.iteye.com/blog/1723270
public class DatePropertyEditor extends PropertyEditorSupport { @Override public Object getValue() { return super.getValue(); } @Override public String getAsText() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(getValue()); } @Override public void setAsText(String text) throws IllegalArgumentException { Date date = null; try { //这里的text一定是 2015-9-03 这样类型和下面的格式一样 //这就是为什么spring不提供转换器的原意不知道你是什么格式的调用setAsText对属性值进行转换类型 date = new SimpleDateFormat("yyyy-MM-dd").parse(text); } catch (ParseException e) { e.printStackTrace(); } setValue(date);//类型转换 } }SEXPropertyEditor自定义枚举类型
public class SEXPropertyEditor extends PropertyEditorSupport { @Override public Object getValue() { return super.getValue(); } @Override public String getAsText() { return super.getAsText(); } @Override public void setAsText(String text) throws IllegalArgumentException { if(!StringUtils.isEmpty(text)){ setValue(SEX.get(text)); }else{ setValue(null); } } }SEX枚举类
public enum SEX { Male("1", "男"), Female("-1", "女"), Unknown("0", "保密"); private final String value; private final String description; SEX(String v, String desc) { this.value = v; this.description = desc; } public String getValue() { return value; } public String getDescription() { return description; } public static SEX get(String strValue) { for (SEX e : values()) { if (e.getValue().equals(strValue)) { return e; } } return null; } @Override public String toString() { return this.value; } }
@Controller public class DataController { @RequestMapping("/binder") public void data(Date date,SEX sex/*参数里面也可以放对象*/){ System.out.println(date); System.out.println(sex.getDescription()); System.out.println("======="); } /** * 这个在数据传到控制器方法前会执行,这里对对象属性进行编辑 * 如果没有这步操作,请求将报 400错误 * @param binder */ @InitBinder public void initBinder(ServletRequestDataBinder binder){ binder.registerCustomEditor(Date.class, new DatePropertyEditor()); binder.registerCustomEditor(SEX.class, new SEXPropertyEditor()); } }
/** * Converter<原类型,模板类型> */ public class DateConverter implements Converter<String,Date> { @Override public Date convert(String arg) { Date date = null; try { date = new SimpleDateFormat("yyyy-MM-dd").parse(arg); } catch (ParseException e) { e.printStackTrace(); } return date; } }
public class SexEnumConverter implements Converter<String,SEX> { @Override public SEX convert(String str) { String value = str.trim(); if (value.isEmpty()) { return null; } return SEX.get(str); //这里就是将String类型转换为自定义的枚举 } }
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="com.lwp.converter.DateConverter" /> <bean class="com.lwp.converter.SexEnumConverter" /> </set> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"/>
@Controller public class DataController { @RequestMapping("/binder") public void data(Date date,SEX sex/*参数里面也可以放对象*/){ System.out.println(date); System.out.println(sex.getDescription()); System.out.println("======="); } }