其實PropertyEditor是JDK裏面的java.beans下面的類,是提供AWT進行渲染用的。Spring通過利用該接口,來實現Bean的屬性轉換器。我們在Spring的xml或者其他途徑配置的bean屬性都是字符串類型的值,但是對應到每個具體的屬性是各種類型的,Spring通過各種PropertyEditor來對各個屬性進行類型轉換,在Spring中的PropertyEditor並不是直接實現PropertyEditor接口,是通過PropertyEditorSupport類屏蔽了一些Spring不需要的方法比如paintValue,從而對它們提供了默認的實現,所以Spring裏面的PropertyEditor都是在PropertyEditorSupport的基礎上實現的。那麼先看看Spring到底提供了哪些PropertyEditor的實現,下面截取了通過IDE工具找到的實現類截圖
如果系統內置的editors 不能滿足你的要求,比如想把 電話(0310-7425019) 自動映射到不同的模型屬性中,就需要自定義 editor 完成數據轉換操作。下面是自定義 editor的實現步驟:
1. 先編寫一個模型類,用於封裝參數信息
package org.demo1.model;
import java.util.Date;
public class DataBinderTestModel {
private String username;
private boolean bool;
private PhoneNumberModel phoneNumber;
private Date date;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public PhoneNumberModel getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(PhoneNumberModel phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "DataBinderTestModel [username=" + username + ", bool=" + bool + ", phoneNumber=" + phoneNumber
+ ", date=" + date + "]";
}
}
package org.demo1.model;
public class PhoneNumberModel {
private String areaCode;
private String phoneNumber;
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "PhoneNumberModel [areaCode=" + areaCode + ", phoneNumber=" + phoneNumber + "]";
}
}
2. 繼承自 PropertyEditorSupport ,編寫一個電話號碼轉換Editor
package org.demo1.model;
import java.beans.PropertyEditorSupport;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.util.StringUtils;
public class PhoneNumberModelEditor extends PropertyEditorSupport {
Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");
@Override
public void setAsText(String text) throws IllegalArgumentException {
//如果沒有填寫,則設置爲NULL
if(StringUtils.isEmpty(text)){
setValue(null);
return;
}
Matcher matcher = pattern.matcher(text);
if(matcher.matches()){
PhoneNumberModel phoneNumber = new PhoneNumberModel();
phoneNumber.setAreaCode(matcher.group(1));
phoneNumber.setPhoneNumber(matcher.group(2));
setValue(phoneNumber);
}else{
throw new IllegalArgumentException(String.format("類型轉換失敗,需要格式[010-12345678],但格式是[%s]", text));
}
}
@Override
public String getAsText() {
PhoneNumberModel model = (PhoneNumberModel)getValue();
return model.getAreaCode() + "-" + model.getPhoneNumber();
}
}
3. 註冊 Editor
有兩種方式可以完成註冊:
1. 在controller中 添加如下代碼
@InitBinder
public void initBinder(WebDataBinder binder) {
System.out.println("enter here");
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
CustomDateEditor dateEditor = new CustomDateEditor(dateFormat, true);
binder.registerCustomEditor(Date.class, dateEditor);
binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberModelEditor());
}
2. 不需要配置,把Editor放到和模型類同一包下,並且名稱規則是 ModelClassName + Editor.java , spring MVC會自動查找
在地址欄輸入如下地址測試:
http://localhost:8088/demo1/test/add?username=lisi&bool=1&phoneNumber=0310-7425019&date=2016-7-1
會顯示如圖所示的效果