-
SpringMVC——Map的數(shù)據(jù)綁定
案例:同樣需要一個(gè)類(lèi)UserMapForm,聲明一個(gè)私有的Map<String,User> users,并提供set/get方法和toString方法,Controller中,如下圖二。
參數(shù)的傳遞方式:查看全部 -
SpringMVC——Set的數(shù)據(jù)綁定
案例:Set應(yīng)用場(chǎng)景,抽象一個(gè)Student對(duì)象,有一個(gè)name屬性和一個(gè)Email屬性,提交信息時(shí)候,需要把學(xué)生1和學(xué)生2的name和Email同時(shí)綁定到后臺(tái),Set和List還是有一些區(qū)別的,它需要先初始化Set(也就是Set集合的長(zhǎng)度要大于0,這里在提供集合的類(lèi)里對(duì)Set初始化,添加若干元素),而List是不需要的,而且Set數(shù)據(jù)綁定在實(shí)際應(yīng)用中,經(jīng)常用作對(duì)象的重復(fù)判斷,或者排除重復(fù),例如:Student對(duì)象有一個(gè)name和Email,如果name和Email都相等時(shí),那么這個(gè)對(duì)象是重復(fù)的,會(huì)重寫(xiě)hashcode方法和equals方法,然后在里面寫(xiě)重復(fù)判斷的邏輯,SpringMVC對(duì)于Set集合的綁定,如果學(xué)生1和學(xué)生2傳來(lái)的name和Email是一樣的就會(huì)綁定到一個(gè)對(duì)象上。
訪(fǎng)問(wèn)地址:
SpringMVC對(duì)Set類(lèi)型數(shù)據(jù)綁定支持不夠好
如果實(shí)體類(lèi)Student重寫(xiě)了equals和hashcode方法,那么再次綁定就會(huì)綁定一個(gè)對(duì)象,也就是集合中只有一個(gè)對(duì)象,如圖一,當(dāng)我我們?cè)趗rl中通過(guò)http://localhost:8080/setParam?set[0].name=Tom&set[1].name=Tom傳參數(shù)時(shí),會(huì)報(bào)錯(cuò),對(duì)于集合綁定優(yōu)先使用List進(jìn)行綁定。
查看全部 -
本章主要介紹List、Set、Map結(jié)構(gòu)的數(shù)據(jù)綁定以及坑
知識(shí)點(diǎn)1:List的數(shù)據(jù)綁定
案例:后臺(tái)抽象一個(gè)Student對(duì)象,有一個(gè)name屬性和一個(gè)Email屬性,提交信息時(shí)候,需要把學(xué)生1和學(xué)生2的name和Email同時(shí)綁定到后臺(tái),List就應(yīng)用到這種場(chǎng)景,SpringMVC對(duì)于集合綁定,需要專(zhuān)門(mén)創(chuàng)建一個(gè)類(lèi)提供一個(gè)集合,并且集合的泛型為User,如圖二,也就是Controller的方法里使用提供集合的類(lèi)作為參數(shù),如圖3,這里訪(fǎng)問(wèn)的是下一級(jí),也就是使用提供集合類(lèi)的屬性u(píng)sers傳入?yún)?shù),list.do?users[0].name=Tom&users[1].name=Lucy,如果url中下標(biāo)直接寫(xiě)20,則這個(gè)數(shù)組的長(zhǎng)度為21,也就是數(shù)組中有很多空對(duì)象,請(qǐng)求的索引一定是連續(xù)的,否則浪費(fèi)內(nèi)存資源,如最后一張圖。
查看全部 -
SpringMVC綁定數(shù)據(jù)——同屬性的多對(duì)象(兩個(gè)類(lèi)具有相同的屬性)
@InitBinder注解:訪(fǎng)問(wèn)Controller時(shí),執(zhí)行相應(yīng)方法前,會(huì)首先執(zhí)行該注解下的方法進(jìn)行一個(gè)初始化,然后再執(zhí)行相應(yīng)的方法。
案例:User類(lèi)和Admin類(lèi)具有相同的屬性name和age,如果直接在請(qǐng)求中傳入name=?&age=?,那么User類(lèi)和Admin類(lèi)的屬性都會(huì)被賦值為相同的值,如果想?yún)^(qū)分并賦值,如下圖。
查看全部 -
本章主要介紹簡(jiǎn)單對(duì)象、復(fù)雜對(duì)象的數(shù)據(jù)綁定以及常遇到的問(wèn)題
SpringMVC數(shù)據(jù)綁定——簡(jiǎn)單對(duì)象、多層級(jí)對(duì)象、同屬性對(duì)象。
簡(jiǎn)單對(duì)象:首先需要?jiǎng)?chuàng)建一個(gè)對(duì)象類(lèi),然后在Controller的方法里引用該對(duì)象。
多層級(jí)對(duì)象:方法參數(shù)里的對(duì)象里面有一個(gè)依賴(lài)其它類(lèi)的屬性
查看全部 -
包裝類(lèi)和數(shù)組的處理
SpringMVC綁定數(shù)據(jù)——包裝類(lèi):可以不傳key,可以不給方法參數(shù)傳值,但是如果使用@RequestParam修飾了就必須給數(shù)據(jù)傳值。
SpringMVC綁定數(shù)據(jù)——數(shù)組
查看全部 -
SpringMVC數(shù)據(jù)綁定——基本類(lèi)型處理
@ResponseBody:方法的返回值,會(huì)放到Response的body的數(shù)據(jù)區(qū)里。
@RequestParam:有三個(gè)屬性value、required、defaultValue,value是給傳入的參數(shù)起別名,required是必須要傳入的參數(shù),默認(rèn)為true,defaultValue代表如果不傳會(huì)賦予默認(rèn)值。
查看全部 -
SpringMVC數(shù)據(jù)綁定——基本類(lèi)型、包裝類(lèi)型、數(shù)組類(lèi)型綁定
例如:age屬性可以使用int和Integer進(jìn)行修飾。
【a】使用基本類(lèi)型int修飾age屬性:key是必須傳的(并且必須傳入value),并且age的value范圍和類(lèi)型必須是int類(lèi)型范圍,如果傳入的參數(shù)是字符串則會(huì)報(bào)400錯(cuò)誤異常,如果沒(méi)有傳age,則會(huì)報(bào)500錯(cuò)誤。
【b】使用包裝類(lèi)型Integer修飾age屬性:可以不用傳入key,Integer類(lèi)型的age可以為null,所以開(kāi)發(fā)過(guò)程中對(duì)于可能為空的數(shù)據(jù)設(shè)置為包裝類(lèi)型,當(dāng)然也需要@RequestParam注解對(duì)其進(jìn)行配置。
使用數(shù)組進(jìn)行數(shù)據(jù)綁定:一次可以傳多個(gè),可以是基本類(lèi)型、包裝類(lèi)型、String的對(duì)象類(lèi)型。
查看全部 -
Intellij IDEA簡(jiǎn)介以及創(chuàng)建SpirngMVC項(xiàng)目
eclipse————intellij idea
workspace ? ? ? ? ? ? ? ? project
?project ? ? ? ? ? ? ? ? ? ? ?module
查看全部 -
SpringMVC數(shù)據(jù)綁定課程概述
【一】數(shù)據(jù)綁定概念:簡(jiǎn)單綁定是將一個(gè)用戶(hù)界面元素(控件)的屬性綁定到一個(gè)類(lèi)型(對(duì)象)實(shí)例上的某個(gè)屬性的方法。
【二】IDE——intellij idea簡(jiǎn)介以及intellij idea創(chuàng)建springMVC項(xiàng)目。
【三】基本類(lèi)型、包裝類(lèi)型(例如:年齡是使用int還是Integer)、數(shù)組類(lèi)型的數(shù)據(jù)綁定。
【四】簡(jiǎn)單對(duì)象、多層級(jí)對(duì)象、同屬性多對(duì)象的數(shù)據(jù)綁定。
【五】List、Set、Map數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)綁定。
【六】Json和Xml數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)綁定(Json和Xml的數(shù)據(jù)傳輸在實(shí)際應(yīng)用經(jīng)常使用,因?yàn)槟承?duì)象數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜)。
【七】PropertyEditor、Formatter、Converter,創(chuàng)建局部類(lèi)型轉(zhuǎn)換器和全局類(lèi)型轉(zhuǎn)換器。
【八】RESTful擴(kuò)展及應(yīng)用場(chǎng)景
【九】課程總結(jié)(總結(jié)重點(diǎn)知識(shí)點(diǎn)和碰到的問(wèn)題以及避免的問(wèn)題)
查看全部 -
自定義一個(gè)converter
/** ?*??A?converter?converts?a?source?object?of?type?{@code?String}?to?a?target?of?type?{@code?Date}. ?*/ public?class?MyConverter?implements?Converter<String,Date>{ ????@Override ????public?Date?convert(String?s)?{ ????????try?{ ????????????return?DateUtil.S_DAY_DATEFORMAT.parse(s); ????????}?catch?(ParseException?e)?{ ????????????e.printStackTrace(); ????????} ????????return?null; ????} }
配置自定義converter
@Configuration public?class?WebMvcConfig?extends?WebMvcConfigurerAdapter?{ //????@Bean //????public?Formatter<Date>?myDateFormatter(){ //????????return?new?MyDateFormatter(); //????} // //????@Override //????public?void?addFormatters(FormatterRegistry?registry)?{ //????????registry.addFormatter(myDateFormatter()); //????????super.addFormatters(registry); //????} ????@Bean ????public?Converter?myConverter(){ ????????return?new?MyConverter(); ????} }
使用
/** ?*date:2018-05-24 ?*?@param?date ?*/ @PostMapping("date") public?void?dateType(Date?date){ ????System.out.println(date); }
查看全部 -
定義一個(gè)日期格式化工具類(lèi)
public?class?DateUtil?{ ????public?static?SimpleDateFormat?S_STANDARD_DATEFORMAT?=?new?SimpleDateFormat("yyyy-MM-dd?HH:mm:ss"); ????public?static?SimpleDateFormat?S_DAY_DATEFORMAT?=?new?SimpleDateFormat("yyyy-MM-dd");
自定義Formatter
public?class?MyDateFormatter?implements?Formatter<Date>{ ????@Override ????public?Date?parse(String?text,?Locale?locale)?throws?ParseException?{ ????????return?DateUtil.S_DAY_DATEFORMAT.parse(text); ????} ????@Override ????public?String?print(Date?object,?Locale?locale)?{ ????????return?DateUtil.S_DAY_DATEFORMAT.format(object); ????} }
注冊(cè)自定義的formatter
@Configuration public?class?WebMvcConfig?extends?WebMvcConfigurerAdapter?{ ????@Bean ????public?Formatter<Date>?myDateFormatter(){ ????????return?new?MyDateFormatter(); ????} ????@Override ????public?void?addFormatters(FormatterRegistry?registry)?{ ????????registry.addFormatter(myDateFormatter()); ????????super.addFormatters(registry); ????} }
測(cè)試使用
????/** ?????*date:2018-05-24 ?????*?@param?date ?????*/ ????@PostMapping("date") ????public?void?dateType(Date?date){ ????????System.out.println(date); ????} ????/** ?????*date2:2018-05-24 ?????*?@param?date2 ?????*/ ????@PostMapping("date2") ????public?void?dateType2(Date?date2){ ????????System.out.println(date2); ????} //????/** //?????*?InitBinder注解的value為指定requestParam的name //?????*?此注解的作用范圍在自身所在controller內(nèi) //?????*?@param?binder //?????*/ //????@InitBinder({"date"}) //????public?void?initDate(WebDataBinder?binder){ //????????//指定處理類(lèi)型,自定義數(shù)據(jù)處理器,處理器允許requestParam值為空 //????????binder.registerCustomEditor(Date.class,new?CustomDateEditor(DateUtil.S_DAY_DATEFORMAT,true)); //????}
查看全部 -
/** ?*date:2018-05-24 ?*?@param?date ?*/ @PostMapping("date") public?void?dateType(Date?date){ ????System.out.println(date); } /** ?*date:2018-05-24 ?*?@param?date2 ?*/ @PostMapping("date2") public?void?dateType2(@RequestParam("date")?Date?date2){ ????System.out.println(date2); } /** ?*?InitBinder注解的value為指定requestParam的name ?*?此注解的作用范圍在自身所在controller內(nèi) ?*?@param?binder ?*/ @InitBinder({"date"}) public?void?initDate(WebDataBinder?binder){ ????//指定處理類(lèi)型,自定義日期數(shù)據(jù)處理器,處理器允許requestParam值為空 ????binder.registerCustomEditor(Date.class,new?CustomDateEditor(new?SimpleDateFormat("yyyy-MM-dd"),true)); }
查看全部 -
老師的方式,請(qǐng)求參數(shù)為item[n]:name=xx&item[m]:name=xxx,也可以傳遞json字符串
一、封裝list的類(lèi)
import?lombok.Data; import?java.util.List; @Data public?class?FromAdminList?{ ????List<Admin>?admins; }
二、使用封裝了list的類(lèi)接受
/** ?* ?[ ?{ ?"username":?"John", ?"password":?"Doe", ?"age":"11" ?}, ?{ ?"username":?"Anna", ?"password":?"Smith", ?"age":"11" ?}, ?{ ?"username":?"Peter", ?"password":?"Jones", ?"age":"11" ?} ?] ?*?@param?admins ?*/ @PostMapping("admins") public?void?listTypeObj(FromAdminList?admins){ ????System.out.println(admins); }
另一種方式,使用@RequestBody,請(qǐng)求參數(shù)為json字符串格式,前提是有json的轉(zhuǎn)換器
一、向list類(lèi)型參數(shù)加上注解@RequestBody
/** ?[ ?{ ?"username":?"John", ?"password":?"Doe", ?"age":"11" ?}, ?{ ?"username":?"Anna", ?"password":?"Smith", ?"age":"11" ?}, ?{ ?"username":?"Peter", ?"password":?"Jones", ?"age":"11" ?} ?] ?*?@param?admins ?*/ @PostMapping("adminlist") public?void?listTypeObj(@RequestBody?List<Admin>?admins){ ????System.out.println(admins); }
對(duì)于基本類(lèi)型,string都有效
/** ?* ?[ ?"adb", ?"xixi", ?"多久啊送到家" ?] ?*?@param?info ?*/ @PostMapping("strs") public?void?listTypeStr(@RequestBody?List<String>?info){ ????System.out.println(info); } /** ?[ ?1, ?2, ?3 ?] ?*?@param?info ?*/ @PostMapping("Ints") public?void?listTypeBase(@RequestBody?List<Integer>?info){ }
查看全部 -
包裝類(lèi)可以為空
查看全部
舉報(bào)