SpringMVC 數(shù)據(jù)綁定

這是我在 慕課網(wǎng) 觀看 SpringMVC 數(shù)據(jù)綁定入門 所做的學(xué)習(xí)筆記
其中包含對 **List,Set,Map,JSON,XML 的數(shù)據(jù)綁定以及 PropertyEditor辅肾、Formatter教翩、Converter 三種自定義類型轉(zhuǎn)換器 **

  • List 類型綁定

    • 特點(diǎn)

      • List 對象綁定需要建立一個(gè) List 集合包裝類
      public class User {
          private int age;
          private String name;
          // 省略 setter getter
      }
      public class ListUserWrap {
          private List<User> userList;
          // 省略 setter getter
      }
      
      • List 的長度為前臺傳入的 ** 集合最大下標(biāo)加 1**
      @ResponseBody
      @RequestMapping(value = "/list2")
      public String list2(ListUserWrap listUserWrap) {
          return "listUserWrapSize:" + listUserWrap.getUserList().size() + "\tlistUserWrap:" + listUserWrap;
      }
      
    • 測試數(shù)據(jù)

      http://localhost/list2?userList[0].name=a&userList[1].name=b
      listUserWrapSize:2 listUserWrap:ListUserWrap(userList=[User(age=0, name=a), User(age=0, name=b)])
      http://localhost/list2?userList[0].name=a&userList[1].name=b&userList[3].name=c
      listUserWrapSize:4 listUserWrap:ListUserWrap(userList=[User(age=0, name=a), User(age=0, name=b), User(age=0, name=null), User(age=0, name=c)])

  • Set 類型綁定

    • 特點(diǎn)

      • Set 對象綁定需要建立一個(gè) Set 集合包裝類
      • 需要先定義 Set 集合長度, 并且前臺傳過來的 Set 長度不能越界, 否者報(bào)錯(cuò)
      • ** 設(shè)置 Set 長度時(shí)需要注意重寫對象的 hashCode,equals 方法, 否者后面的會掩蓋前面的 **
      public class SetUserWrap {
          private Set<User> userSet;
          // 省略 setter getter
          public SetUserWrap() {
              userSet = new LinkedHashSet<>();
              userSet.add(new User());
              User user = new User();
              user.setName("b");
              userSet.add(user);
          }
      }
      
    • 測試數(shù)據(jù)

      http://localhost/set?userSet[0].name=a 因?yàn)轭A(yù)先定義的第二個(gè)對象的 name 為 b, 所以此處返回 b
      setUserWrapSize:2 setUserWrap:SetUserWrap(userSet=[User(age=0, name=a), User(age=0, name=b)])
      http://localhost/set?userSet[0].name=a&userSet[1].name=bbb
      setUserWrapSize:2 setUserWrap:SetUserWrap(userSet=[User(age=0, name=a), User(age=0, name=bbb)])

  • Map 類型綁定

    • 特點(diǎn)

      • 建立一個(gè) Map 包裝類
      public class MapUserWrap {
          private Map<String, User> userMap;
          // 省略 setter getter
      }
      @ResponseBody
      @RequestMapping(value = "/map")
      public String map(MapUserWrap mapUserWrap) {
          return "mapUserWrapSize:" + mapUserWrap.getUserMap().size() + "\tmapUserWrap:" + mapUserWrap;
      }
      
    • 測試數(shù)據(jù)

      http://localhost/map?userMap["a"].name=a&userMap["b"].name=b
      mapUserWrapSize:2 mapUserWrap:MapUserWrap(userMap={a=User(age=0, name=a), b=User(age=0, name=b)})
      http://localhost/map?userMap["a"].name=a&userMap["a"].name=b
      mapUserWrapSize:1 mapUserWrap:MapUserWrap(userMap={a=User(age=0, name=a,b)})

  • JSON 類型綁定

    • 前臺在 body 區(qū)域傳入以下類型格式字符串
    {
        "name":"a",
        "age":1
    }
    
    @ResponseBody
    @RequestMapping(value = "/json")
    public String json(@RequestBody User user) {
        return user.toString();
    }
    
  • XML 類型綁定

    • 前臺在 body 區(qū)域傳入以下類型格式字符串
    <xmluser>
        <name>a</name>
        <age>1</age>
    </xmluser>
    
    • 建立一個(gè) XML 包裝類
    @XmlRootElement(name = "xmluser")// 根節(jié)點(diǎn)標(biāo)簽名
    public class XmlUser {
        @XmlElement(name = "name")// 屬性標(biāo)簽名
        private String name;
        @XmlElement(name = "age")// 屬性標(biāo)簽名
        private int age;
    }
    
    @ResponseBody
    @RequestMapping(value = "/xml")
    public String xml(@RequestBody XmlUser xmlUser) {
        return xmlUser.toString();
    }
    
  • 自定義類型轉(zhuǎn)換 - PropertyEditor

    在 Controller 中編寫一個(gè)帶有 InitBinder 注解的方法, 傳入 WebDataBinder 對象, 使用該對象注冊指定類型的轉(zhuǎn)換關(guān)系, 對該方法所在 Controller 中使用該類型的方法參數(shù)有效

    @ResponseBody
    @RequestMapping(value = "/date")
    public String date(Date date) {
        return date.toLocaleString();
    }
    @ResponseBody
    @RequestMapping(value = "/date2")
    public String date2(Date date2) {
        return date2.toLocaleString();
    }
    
    @InitBinder("date")// 指定對變量名為 date 進(jìn)行轉(zhuǎn)換, 不會對 date2 生效
    private void initDate(WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
        //binder.registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor)
        //new CustomDateEditor(DateFormat dateFormat, boolean allowEmpty)
        //allowEmpty 是否允許 Date 對象為空
    }
    
  • 自定義類型轉(zhuǎn)換 - Formatter

    根據(jù) String 類型自定義轉(zhuǎn)換規(guī)則轉(zhuǎn)換成需要的類型, 需要實(shí)現(xiàn) org.springframework.format.Formatter<T> 接口,T 為想要轉(zhuǎn)換的結(jié)果類型

    • 創(chuàng)建自定義 Formatter
    public class DateFormatter implements Formatter<Date> {
        @Override
        public Date parse(String text, Locale locale) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = dateFormat.parse(text);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }
    
        @Override
        public String print(Date object, Locale locale) {
            return null;
        }
    }
    
    • 將自定義的 Formatter 注入到 SpringMVC 默認(rèn)的 FormattingConversionServiceFactoryBean 中, 同時(shí)將默認(rèn)轉(zhuǎn)換規(guī)則服務(wù)類配置為已經(jīng)被注入的 bean 對象
    <mvc:annotation-driven conversion-service="myFormattingConversionService"/>
    <bean id="myFormattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">,<!-- 此處為 formatters-->
            <set>
                <bean class="{包路徑}.DateFormatter"></bean>
            </set>
        </property>
    </bean>
    
  • 自定義類型轉(zhuǎn)換 - Converter

    自己指定數(shù)據(jù)來源類型及轉(zhuǎn)換結(jié)果類型, 相比 Formatter 更為靈活, 需要實(shí)現(xiàn) org.springframework.core.convert.converter.Converter<S, T> 接口,S 為來源類型,T 為結(jié)果類型

    • 創(chuàng)建自定義 Converter
    public class DateConverter implements Converter<String, Date> {
        @Override
        public Date convert(String source) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = dateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }
    }
    
    • 將自定義的 Converter 注入到 SpringMVC 默認(rèn)的 FormattingConversionServiceFactoryBean 中, 同時(shí)將默認(rèn)轉(zhuǎn)換規(guī)則服務(wù)類配置為已經(jīng)被注入的 bean 對象
    <mvc:annotation-driven conversion-service="myFormattingConversionService"/>
    <bean id="myFormattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters"><!-- 此處為 converters-->
            <set>
                <bean class="{包路徑}.DateConverter"></bean>
            </set>
        </property>
    </bean>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市癞尚,隨后出現(xiàn)的幾起案子梨与,更是在濱河造成了極大的恐慌鸣驱,老刑警劉巖吏口,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件统台,死亡現(xiàn)場離奇詭異雕擂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贱勃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門井赌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贵扰,你說我怎么就攤上這事仇穗。” “怎么了戚绕?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵纹坐,是天一觀的道長。 經(jīng)常有香客問我列肢,道長恰画,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任瓷马,我火速辦了婚禮拴还,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欧聘。我一直安慰自己片林,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著费封,像睡著了一般焕妙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弓摘,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天焚鹊,我揣著相機(jī)與錄音,去河邊找鬼韧献。 笑死末患,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锤窑。 我是一名探鬼主播璧针,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼渊啰!你這毒婦竟也來了探橱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤绘证,失蹤者是張志新(化名)和其女友劉穎隧膏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迈窟,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡热芹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年舷暮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轩性,死狀恐怖斤贰,靈堂內(nèi)的尸體忽然破棺而出跳仿,到底是詐尸還是另有隱情嘴高,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布娘摔,位于F島的核電站窄坦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凳寺。R本人自食惡果不足惜鸭津,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肠缨。 院中可真熱鬧逆趋,春花似錦、人聲如沸晒奕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魄眉,卻和暖如春砰盐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背坑律。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工岩梳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脾歇。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓蒋腮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕各。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 基本類型 請求: /baseType?age=2結(jié)果: age:20 數(shù)組 請求: /array?name=tom...
    緩慢移動的蝸牛閱讀 355評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理焦除,服務(wù)發(fā)現(xiàn)激况,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法膘魄,類相關(guān)的語法乌逐,內(nèi)部類的語法,繼承相關(guān)的語法创葡,異常的語法浙踢,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 打破慣性防衛(wèi)-綠燈思維 什么是習(xí)慣性防衛(wèi) 這是一種非常常見的心理學(xué)現(xiàn)象。當(dāng)我們感到自己的觀點(diǎn)灿渴、尊嚴(yán)可能會受到挑...
    金勇Maya閱讀 447評論 0 2
  • 在東方天際泛起魚肚白之前 一片瑰麗的紅霞悄悄地 夾在五六點(diǎn)鐘的晨光縫隙間 短暫洛波、多變、不可描摹
    鵝籠書生_閱讀 227評論 0 0