這兩者的功能都是為了對我們前台請求資料的轉換,使程式能夠正常接收
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實作類型轉換
DateConverter日期格式的轉換器
/**
* 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會先使用編輯器的方法,而不會再進入轉換器的操作.兩者不沖突.