这两者的功能都是为了对我们前台请求数据的转换,使程序能够正常接收
PropertyEditorSupport : Spring 3.0之前使用的架构
Converter:Spring 3.0之后的类型转换系统
两者的区别详细可看这篇文章:http://jinnianshilongnian.iteye.com/blog/1723270
一:属性编辑PropertyEditorSuppor
首先编写自己的类型
DatePropertyEditor 日期类型
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());
}
}
这个不是全局的,哪个控制器里面需要转换就必须用@InitBinder进行属性编辑
二:转换器Converter
通过implements Converter实现类型转换
/**
* 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;
}
}
SexEnumConverter自定义枚举类型的转换器
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"/>
此时这两个转换器就是全局可以不再使用属性编辑器,控制器中的代码删除InitBinder方法和注解
@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("=======");
}
}
访问http://localhost:8080/sw/binder?date=2013-9-12%2023:2:23&sex=-1后台结果表示转换成功
注: 如果转换器和属性编辑器同时作用上,spring会先使用编辑器的方法,而不会再进入转换器的操作.两者不冲突.