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

