面向對象的編程方式極大地方便了程序員在管理數據上所花費的精力。在基于Spring MVC的Web開發過程當中,可以通過對象映射的方式來管理表單提交上來的數據,而不用去一個一個地從request中提取出來。另外,這一功能還支持基本數據類型的映射。例如in、long、float等等。這樣我們就能從傳統單一的String類型中解脫出來。然而,應用是靈活的。我們對數據的需求是千變萬化的。有些時候我們需要對表單的數據進行兼容處理。
例如日期格式的兼容:
中國的日期標注習慣采用yyyy-MM-dd格式,歐美習慣采用MM/dd/yyyy。雖然兩種格式都是日期的標注方法,但是往往我們要想達到兼容的目的必須做繁瑣的轉換。
例如價格的兼容:
價格無非就是一串數字,我們經常用的就是0.00這種表達形式,而對于金額較大的價格我們還習慣采用0,000.00這樣帶有逗號分隔的價格表述形式。
其實Spring MVC中已經考慮到了這個問題,在Controller中可以在初始化綁定的時候注冊一個編輯器。當表單提交過來的數據映射到某一特定類型(甚至是特定參數)時可以按照自定義的方法進行轉換。(除二進制方式傳輸過來的數據以外,通常我們認為所有傳過來的參數不論是什么內容,一律認為是字符串)
下面我虛構了一個需求:
我有一個表單,里面需要填寫用戶名、生日和積分。這分別代表了String類型、Date類型和Long類型。下面是表單內容:
import java.util.Date;
public class UserInfo {
private String userName;
private Date birthday;
private Long score;
//getters and setters...
}
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import blog.csdn.net.chaijunkun.formObjs.UserInfo;
@Controller
public class ObjController {
private static Logger logger= Logger.getLogger(ObjController.class);
public ObjController(){
logger.info("對象映射控制器初始化");
}
@RequestMapping(value="/getObj.do")
public String modifyUser(HttpServletRequest request,
HttpServletResponse response,Map<String, Object> model,
UserInfo userInfo){
logger.info("收集對象信息");
model.put("userInfo", userInfo);
return "user";
}
}
第一步:重寫公有的void setAsText(String text)方法;
第二步:將轉換好的數據調用setValue(Object obj)進行寫入。
下面我們先實現一個日期兼容的編輯器:
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDateEditor extends PropertyEditorSupport {
@Override
/**
* text是表單傳入的數據內容
*/
public void setAsText(String text){
Date value= null;
SimpleDateFormat sdf= new SimpleDateFormat();
sdf.applyPattern("yyyy-MM-dd");
try{
value= sdf.parse(text);
}catch(ParseException e1){
sdf.applyPattern("MM/dd/yyyy");
try {
value= sdf.parse(text);
} catch (ParseException e2) {
value= null;
}
}
//這一步將轉換好的數據寫入到對象映射的屬性中
setValue(value);
}
}
import org.springframework.beans.propertyeditors.CustomNumberEditor;
public class MyLongEditor extends CustomNumberEditor {
public MyLongEditor(){
super(Long.class, true);
}
@Override
public void setAsText(String text){
if ((text== null) || text.trim().equals("")){
setValue(null);
}else{
Long value= null;
try{
//按照標準的數字格式嘗試轉換
value= Long.parseLong(text);
}catch(NumberFormatException e){
//嘗試去除逗號 然后再轉換
text= text.replace(",", "");
value= Long.parseLong(text);
}
//轉好之后將值返給被映射的屬性
setValue(value);
}
}
}
我們來試一下:
如下圖所示:
同樣,數據被正確識別了。
通過以上方法,我們成功地兼容了多種數據格式。
寫在后面:
其實針對日期格式,我開始的時候想寫成下面代碼那樣來實現兼容:
另外,在文章剛開始的時候寫到,不僅可以按類型,甚至是某一類型的某個屬性都可以按照自己的要求定制編輯器,同時不影響其它同類型的屬性。這個很容易,在registerCustomEditor方法中還有一個重載的方法,第二個參數可以指定具體的屬性名稱。這樣就很容易控制細粒度了。
新聞熱點
疑難解答