Springmvc PropertyEditor實現綁定時的類型轉換

     其實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


會顯示如圖所示的效果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章