最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring MVC中基于自定義Editor的表單數(shù)據(jù)處理技巧分享

 更新時間:2013年12月04日 10:23:25   作者:  
Spring MVC中基于自定義Editor的表單數(shù)據(jù)處理技巧。需要的朋友可以過來參考下,希望對大家有所幫助

面向?qū)ο蟮木幊谭绞綐O大地方便了程序員在管理數(shù)據(jù)上所花費的精力。在基于Spring MVC的Web開發(fā)過程當(dāng)中,可以通過對象映射的方式來管理表單提交上來的數(shù)據(jù),而不用去一個一個地從request中提取出來。另外,這一功能還支持基本數(shù)據(jù)類型的映射。例如in、long、float等等。這樣我們就能從傳統(tǒng)單一的String類型中解脫出來。然而,應(yīng)用是靈活的。我們對數(shù)據(jù)的需求是千變?nèi)f化的。有些時候我們需要對表單的數(shù)據(jù)進行兼容處理。

例如日期格式的兼容:

中國的日期標(biāo)注習(xí)慣采用yyyy-MM-dd格式,歐美習(xí)慣采用MM/dd/yyyy。雖然兩種格式都是日期的標(biāo)注方法,但是往往我們要想達到兼容的目的必須做繁瑣的轉(zhuǎn)換。

例如價格的兼容:

價格無非就是一串?dāng)?shù)字,我們經(jīng)常用的就是0.00這種表達形式,而對于金額較大的價格我們還習(xí)慣采用0,000.00這樣帶有逗號分隔的價格表述形式。

其實Spring MVC中已經(jīng)考慮到了這個問題,在Controller中可以在初始化綁定的時候注冊一個編輯器。當(dāng)表單提交過來的數(shù)據(jù)映射到某一特定類型(甚至是特定參數(shù))時可以按照自定義的方法進行轉(zhuǎn)換。(除二進制方式傳輸過來的數(shù)據(jù)以外,通常我們認(rèn)為所有傳過來的參數(shù)不論是什么內(nèi)容,一律認(rèn)為是字符串)

下面我虛構(gòu)了一個需求:

我有一個表單,里面需要填寫用戶名、生日和積分。這分別代表了String類型、Date類型和Long類型。下面是表單內(nèi)容:

復(fù)制代碼 代碼如下:

<form action="getObj.do" method="post">
 <table>
  <tr>
   <td>用戶名:</td>
   <td><input type="text" name="userName" value="Name Test" /></td>
   <td>*普通字符串</td>
  </tr>
  <tr>
   <td>生日:</td>
   <td><input type="text" name="birthday" value="2013-3-7" /></td>
   <td>*支持格式: yyyy-MM-dd 或 MM/dd/yyyy</td>
  </tr>
  <tr>
   <td>積分:</td>
   <td><input type="text" name="score" value="1,000" /></td>
   <td>*支持純數(shù)字或帶逗號分隔的數(shù)字</td>
  </tr>
  <tr>
   <td colspan="3"><input type="submit" value="提交" /></td>
  </tr>
 </table>
</form>

這里根據(jù)表單,我們映射了如下的一個表單對象,這里對象的屬性名稱要和上面表單的字段name一致:
復(fù)制代碼 代碼如下:

package blog.csdn.net.chaijunkun.formObjs;

import java.util.Date;

public class UserInfo {

 private String userName;

 private Date birthday;

 private Long score;

 //getters and setters...

}


那么我們想接收這樣一個表單數(shù)據(jù),可以寫一個對表單處理的方法:
復(fù)制代碼 代碼如下:

package blog.csdn.net.chaijunkun.controller;

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";
 }

}


如果僅僅是這么寫,當(dāng)然還不能做到多格式兼容。我們需要寫一個針對日期和Long型的格式兼容編輯器。編輯器需要至少繼承自類:java.beans.PropertyEditorSupport。當(dāng)然,也可以繼承Spring內(nèi)置的一些編輯器,例如:org.springframework.beans.propertyeditors.CustomNumberEditor,這個是專門用來處理數(shù)字轉(zhuǎn)換的。無論是繼承哪一個,方法都是一樣的:

第一步:重寫公有的void setAsText(String text)方法;

第二步:將轉(zhuǎn)換好的數(shù)據(jù)調(diào)用setValue(Object obj)進行寫入。

下面我們先實現(xiàn)一個日期兼容的編輯器:

復(fù)制代碼 代碼如下:

package blog.csdn.net.chaijunkun.editors;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyDateEditor extends PropertyEditorSupport {

 @Override
 /**
  * text是表單傳入的數(shù)據(jù)內(nèi)容
  */
 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;
   }
  }
  //這一步將轉(zhuǎn)換好的數(shù)據(jù)寫入到對象映射的屬性中
  setValue(value);
 }

}


然后我們再來寫一個針對Long型的編輯器,可以支持帶逗號分隔和不帶逗號分隔的數(shù)值表達形式:
復(fù)制代碼 代碼如下:

package blog.csdn.net.chaijunkun.editors;

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{
    //按照標(biāo)準(zhǔn)的數(shù)字格式嘗試轉(zhuǎn)換
    value= Long.parseLong(text);
   }catch(NumberFormatException e){
    //嘗試去除逗號 然后再轉(zhuǎn)換
    text= text.replace(",", "");
    value= Long.parseLong(text);
   }
   //轉(zhuǎn)好之后將值返給被映射的屬性
   setValue(value);   
  }
 }

}


好了,這兩個編輯器寫好了,如何讓它們發(fā)揮作用呢?這需要在Controller內(nèi)加一個數(shù)據(jù)轉(zhuǎn)換時的綁定方法:
復(fù)制代碼 代碼如下:

@InitBinder
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
 binder.registerCustomEditor(Date.class, new MyDateEditor());
 binder.registerCustomEditor(Long.class, new MyLongEditor());
}

上面的代碼作用就是:當(dāng)接收到表單數(shù)據(jù),Spring發(fā)現(xiàn)參數(shù)名能夠與對象屬性相對應(yīng),而轉(zhuǎn)換的類型恰好也是在上述代碼中注冊過的類似,則會將數(shù)據(jù)內(nèi)容按照指定的編輯器來做轉(zhuǎn)換。

我們來試一下:

如下圖所示:

同樣,數(shù)據(jù)被正確識別了。

通過以上方法,我們成功地兼容了多種數(shù)據(jù)格式。

寫在后面:

其實針對日期格式,我開始的時候想寫成下面代碼那樣來實現(xiàn)兼容:

復(fù)制代碼 代碼如下:

@InitBinder
public void initBinder(HttpServletRequest request, ServletRequestDataBinder binder){
 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"), true));
}

后來我發(fā)現(xiàn),這樣寫之后只支持MM/dd/yyyy格式的日期,提交yyyy-MM-dd格式的日期后會拋出異常。看來,對于同一類型,在一個控制器里只能注冊一個編輯器,而且是最后一個被注冊的才起作用。

另外,在文章剛開始的時候?qū)懙剑粌H可以按類型,甚至是某一類型的某個屬性都可以按照自己的要求定制編輯器,同時不影響其它同類型的屬性。這個很容易,在registerCustomEditor方法中還有一個重載的方法,第二個參數(shù)可以指定具體的屬性名稱。這樣就很容易控制細(xì)粒度了。

相關(guān)文章

  • Java操作透明圖片并保持背景透明的實現(xiàn)

    Java操作透明圖片并保持背景透明的實現(xiàn)

    這篇文章主要介紹了Java操作透明圖片并保持背景透明的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring boot應(yīng)用啟動后首次訪問很慢的解決方案

    Spring boot應(yīng)用啟動后首次訪問很慢的解決方案

    這篇文章主要介紹了Spring boot應(yīng)用啟動后首次訪問很慢的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 使用SpringBoot Actuator監(jiān)控應(yīng)用示例

    使用SpringBoot Actuator監(jiān)控應(yīng)用示例

    Actuator是Spring Boot提供的對應(yīng)用系統(tǒng)的自省和監(jiān)控的集成功能,可以對應(yīng)用系統(tǒng)進行配置查看、相關(guān)功能統(tǒng)計等。這篇文章主要介紹了使用SpringBoot Actuator監(jiān)控應(yīng),有興趣的可以了解一下
    2018-05-05
  • Mybatis-Plus使用saveOrUpdate及問題解決方法

    Mybatis-Plus使用saveOrUpdate及問題解決方法

    本文主要介紹了Mybatis-Plus使用saveOrUpdate及問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SpringBoot3集成SLF4J+logback進行日志記錄的實現(xiàn)

    SpringBoot3集成SLF4J+logback進行日志記錄的實現(xiàn)

    本文主要介紹了SpringBoot3集成SLF4J+logback進行日志記錄的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java排序算法總結(jié)之希爾排序

    Java排序算法總結(jié)之希爾排序

    這篇文章主要介紹了Java排序算法總結(jié)之希爾排序,較為詳細(xì)的分析了希爾排序的原理與java的實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • java操作excel導(dǎo)入導(dǎo)出的3種方式

    java操作excel導(dǎo)入導(dǎo)出的3種方式

    項目需要,要實現(xiàn)一個導(dǎo)入導(dǎo)出excel的功能,于是任務(wù)驅(qū)動著我學(xué)習(xí)到了POI、easypoi和easyexcel這3個java操作Excel的工具,下面這篇文章主要給大家介紹了關(guān)于java操作excel導(dǎo)入導(dǎo)出的3種方式,需要的朋友可以參考下
    2023-05-05
  • maven項目install時忽略執(zhí)行test方法的總結(jié)

    maven項目install時忽略執(zhí)行test方法的總結(jié)

    這篇文章主要介紹了maven項目install時忽略執(zhí)行test方法的總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java日常練習(xí)題,每天進步一點點(13)

    Java日常練習(xí)題,每天進步一點點(13)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07

最新評論

铜山县| 安塞县| 页游| 侯马市| 忻州市| 个旧市| 天全县| 扶余县| 昂仁县| 乌海市| 张家口市| 乌什县| 桂林市| 德惠市| 荆门市| 东丰县| 华安县| 攀枝花市| 弋阳县| 临武县| 江城| 靖宇县| 如东县| 抚远县| 绥化市| 油尖旺区| 东源县| 板桥市| 同心县| 阳泉市| 伊宁市| 迁西县| 彰化县| 桃源县| 苍南县| 灵寿县| 弥渡县| 海兴县| 来凤县| 桓台县| 盐池县|