Spring?MVC數(shù)據(jù)綁定方式
定義:簡單綁定是將一個(gè)用戶界面元素(控件)的屬性綁定到一個(gè)類型(對象)實(shí)例上的某個(gè)屬性的方法。
基本類型、包裝類型、數(shù)組(以參數(shù)age為例)
一、基本類型
1、key是必須的,即age是必須傳值的
2、只能是int類型,即傳給age的值必須為int類型且范圍也只能是int類型
如果沒有傳age,后臺會報(bào)500錯(cuò)誤,會提示當(dāng)前的age是不可以為空的
如果age傳一個(gè)字符串a(chǎn)bc,Spring MVC會進(jìn)行攔截,報(bào)400參數(shù)錯(cuò)誤異常
@Controller public class TestController{ /* RequestMapping注解 value:RequestMapping的屬性,指定請求的實(shí)際地址 method:RequestMapping的屬性,指定請求的method類型,分為GET、POST、PUT、DELETE等 headers:RequestMapping的屬性 指定request中必須包含指定的header值,才能處理該請求 */ @RequestMapping(value = "baseType.do", method = RequestMethod.GET) @ResponseBody //方法的返回值會放到ResponseBody數(shù)據(jù)區(qū)里 /* RequestParam注解 value:RequestParam的屬性,起別名 required:RequestParam的屬性,是否必傳,默認(rèn)值是true */ public String baseType(@RequestParam(value = "xage") int age){ return "age:" + age; } }
二、包裝類型
1、可以不傳key,即age可以為空
@Controller public class TestController{ ? ? @RequestMapping(value = "baseType.do") ? ? @ResponseBody ? ? public String baseType(Integer age){ ? ? ? ? return "age:" + age; ? ? } }
此時(shí)訪問localhost:8080/baseType.do,前臺顯示age:null
注意:在開發(fā)過程中,對可能為空的數(shù)據(jù),最好將參數(shù)數(shù)據(jù)定義為包裝類型
三、數(shù)組
一次性傳多個(gè)值,例如基本類型、包裝類型、String的對象類型
@Controller public class TestController{ ? ? @RequestMapping(value = "array.do") ? ? @ResponseBody ? ? public String array(String[] age){ ? ? ? ? StringBuilder sdf = new StringBuilder(); ? ? ? ? for(String item : age){ ? ? ? ? ? ? sbf.append(item).append(" "); ? ? ? ? } ? ? ? ? return sbf.toString(); ? ? } }
此時(shí)訪問localhost:8080/array.do?age=17&age=18,前臺顯示17 18
簡單對象、多層級對象、同屬性對象
一、簡單對象(User類:name, age)
@Controller public class TestController{ ? ? @RequestMapping(value = "object.do") ? ? @ResponseBody ? ? public String object(User user){ ? ? ? ? return user.toString(); ? ? } }
此時(shí)訪問localhost:8080/object.do?name=Tom&age=18,前臺顯示User{name='Tom',age=18}
二、多層級對象(User類:name, age, contactInfo、ContactInfo類:phone, adress)
@Controller public class TestController{ ? ? @RequestMapping(value = "object.do") ? ? @ResponseBody ? ? public String object(User user){ ? ? ? ? return user.toString(); ? ? } }
此時(shí)訪問localhost:8080/object.do?name=Tom&age=18&contactInfo.phone=10000
前臺顯示User{name='Tom',age=18,contactInfo={phone='10000',address='null'}}
三、同屬性對象(User類:name, age、Admin類:name, age)
@Controller public class TestController{ ? ? @RequestMapping(value = "object.do") ? ? @ResponseBody ? ? public String object(User user, Admin admin){ ? ? ? ? return user.toString() + " " + admin.toString(); ? ? } }
此時(shí)訪問localhost:8080/object.do?name=Tom&age=18,前臺顯示User{name='Tom',age=18} Admin{name='Tom',age=18}
@Controller public class TestController{ ? ? @RequestMapping(value = "object.do") ? ? @ResponseBody ? ? public String object(User user, Admin admin){ ? ? ? ? return user.toString() + " " + admin.toString(); ? ? } } ? @InitBinder("user") ? ?//綁定前綴 public void initUser(WebDataBinder binder){ ? ? binder.setFieldDefaultPrefix("user."); } ? @InitBinder("admin") ? ?//綁定前綴 public void initUser(WebDataBinder binder){ ? ? binder.setFieldDefaultPrefix("admin."); }
此時(shí)訪問localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=18
前臺顯示User{name='Tom',age=18} Admin{name='Lucy',age=18}
如果沒有@InitBinder注解的輔助方法,這個(gè)方法如果傳遞user.name,admin.name結(jié)果會怎么樣呢?
如果沒有@InitBinder注解的輔助方法,Spring MVC會認(rèn)為是User類和Admin類里面的user字段的name,所以前臺顯示null
List、Set、Map
一、List
@Controller public class TestController{ ? ? @RequestMapping(value = "list.do") ? ? @ResponseBody ? ? public String list(UserList userList){ ? ? ? ? return userList.toString(); ? ? } }
Spring MVC關(guān)于集合綁定需要一個(gè)data收集的對象,單純的綁定是無效的。
建一個(gè)UserList類:
public class UserList{ ? ? private List<User> users; ? ?? ? ? public List<User> getUsers(){ ? ? ? ? return users; ? ? } ? ? ? public void setUsers(List<User> users){ ? ? ? ? this.users = users; ? ? } ? ? ? @Override ? ? public String toString(){ ? ? ? ? return "UserList{" + ? ? ? ? ? ? ? ? "users=" + users + ? ? ? ? ? ? ? ? '}'; ? ? } }
此時(shí)訪問localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy
前臺顯示UserList{users=[User{name='Tom', age=null, contactInfo=null}, User{name='Lucy', age=null, contactInfo=null}]}
注意:如果訪問傳值的時(shí)候,users[0]直接跨到users[10],即訪問
localhost:8080/list.do?users[0].name=Tom&users[10].name=Lucy
則前臺顯示users[1]到users[9]以及users[11]為空對象,所以請求索引的時(shí)候一定要是連續(xù)的,否則會浪費(fèi)資源
二、Set
Set相對List來說有一定的局限性,它需要先初始化Set,而List是不需要的
Set在實(shí)際應(yīng)用場景當(dāng)中,大部分是做對象的重復(fù)判斷或排除重復(fù)
例如一個(gè)Student對象(姓名和Email),如果姓名和Email相同,則認(rèn)為這個(gè)對象是重復(fù)的,此時(shí)需要重寫hashcode方法和equals方法,然后在方法里寫重復(fù)判斷的邏輯(綁定到一個(gè)對象上)
@Controller public class TestController{ ? ? @RequestMapping(value = "set.do") ? ? @ResponseBody ? ? public String set(UserSet userSet){ ? ? ? ? return userSet.toString(); ? ? } }
Set和List一樣,也需要一個(gè)data收集的對象
public class UserSet{ ? ? private Set<User> users; ? ?? ? ? //Set和List有一些區(qū)別,就是對它本身的初始化有一些要求 ? ? private UserSet(){ ? ? ? ? users = new LinkedHashSet<User>(); ? ? ? ? users.add(new User()); ? ? ? ? users.add(new User()); ? ? } ? ? ? public Set<User> getUsers(){ ? ? ? ? return users; ? ? } ? ? ? public void setUsers(Set<User> users){ ? ? ? ? this.users = users; ? ? } ? ? ? @Override ? ? public String toString(){ ? ? ? ? return "UserSet{" + ? ? ? ? ? ? ? ? "users=" + users + ? ? ? ? ? ? ? ? '}'; ? ? } }
此時(shí)訪問localhost:8080/set.do?users[0].name=Tom&users[1].name=Lucy
前臺顯示UserSet{users=[User{name='Tom', age=null, contactInfo=null}, User{name='Lucy', age=null, contactInfo=null}]}
如果跨界訪問,即訪問localhost:8080/set.do?users[0].name=Tom&users[10].name=Lucy
則會報(bào)錯(cuò),因?yàn)橐呀?jīng)定義了Set的size為2
注意:如果沒有重寫hashcode方法和equals方法進(jìn)行排重,則傳兩個(gè)相同對象的時(shí)候前臺還會顯示兩個(gè)對象
可是如果定義了Set的size為2,而又重寫了hashcode方法和equals方法進(jìn)行排重,那么當(dāng)我們傳兩個(gè)相同對象的時(shí)候則會拋異常,因?yàn)槌跏蓟疭et的時(shí)候定義的是兩個(gè)空對象,可是經(jīng)過hashcode方法和equals方法判
斷完之后會認(rèn)為是重復(fù)的對象,所以初始化的Set的size則為1,此時(shí)傳兩個(gè)對象就會報(bào)錯(cuò),所以Spring MVC對Set的支持并不友好
三、Map
@Controller public class TestController{ ? ? @RequestMapping(value = "map.do") ? ? @ResponseBody ? ? public String map(UserMap userMap){ ? ? ? ? return userMap.toString(); ? ? } }
Map和List一樣,也需要一個(gè)data收集的對象
public class UserMap{ ? ? private Map<String,User> users; ? ?? ? ? public Map<User> getUsers(){ ? ? ? ? return users; ? ? } ? ? ? public void setUsers(Map<String,User> users){ ? ? ? ? this.users = users; ? ? } ? ? ? @Override ? ? public String toString(){ ? ? ? ? return "UserMap{" + ? ? ? ? ? ? ? ? "users=" + users + ? ? ? ? ? ? ? ? '}'; ? ? } }
此時(shí)訪問localhost:8080/map.do?users["X"].name=Tom&users["X"].age=10&users["Y"].name=Lucy
前臺顯示UserMap{users={X=User[name='Tom', age=10, contactInfo=null}, Y=User{name='Lucy', age=null, contactInfo=null}}}
JSON、XML
RequestBody注解用于讀取Request請求的Body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對象上;再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到Controller中方法的參數(shù)上。
RequestBody注解常用來處理Content-Type不是默認(rèn)的application/x-www-form-urlcoded編碼的內(nèi)容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。
一、JSON
@Controller public class TestController{ ? ? @RequestMapping(value = "json.do") ? ? @ResponseBody ? ? public String json(@RequestBody User user){ ? ? ? ? return user.toString(); ? ? } }
利用PostMan等工具傳值:
{ ? ? "name":"Jim", ? ? "age":16, ? ? "contactInfo":{ ? ? "address":"beijing", ? ? "phone":"10010" ? ? } }
返回值:
User{name='Jim', age=16, contactInfo=ContactInfo{phone='10010', address='beijing'}}
二、XML
這個(gè)功能需要spring-oxm依賴包提供支持以及在實(shí)體類中添加一些注解
@XmlRootElement(name="admin") public class Admin{ ? ? private String name; ? ?? ? ? private String age; ? ?? ? ? @XmlElement(name="name") ? ? public String getName() { return name; } ? ?? ? ? public void setName(String name) { this.name = name; } ? ? ? @XmlElement(name="age") ? ? public Integer getAge() { return age; } ? ?? ? ? public void setAge(String age) { this.age = age; } ? ? ? @Override ? ? public String toString(){ ? ? ? ? return "Admin{" + ? ? ? ? ? ? ? ? "name='" + name + '\'' + ? ? ? ? ? ? ? ? ", age=" + age + ? ? ? ? ? ? ? ? '}'; ? ? } } @Controller public class TestController{ ? ? @RequestMapping(value = "xml.do") ? ? @ResponseBody ? ? public String xml(@RequestBody User user){ ? ? ? ? return user.toString(); ? ? } }
利用PostMan等工具傳值:
<?xml version="1.0" encoding="UTF-8" ?> <admin> ? ? <name>Jim</name> ? ? <age>16</age> </admin>
返回值:
Admin{name='Jim', age=16}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Mybatis -如何處理clob類型數(shù)據(jù)
這篇文章主要介紹了Mybatis 如何處理clob類型數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條的示例代碼
本文詳細(xì)的介紹了SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05SpringBoot整合Mybatis實(shí)現(xiàn)CRUD
這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)CRUD的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09