javascript
controller接收json数据_SpringMVC实现多种数据类型绑定
點(diǎn)擊上方“放學(xué)等我”,選擇“置頂公眾號(hào)”
精品文章,第一時(shí)間送達(dá)
綁定基本數(shù)據(jù)類型
Java基本數(shù)據(jù)類型int的默認(rèn)值是0,在使用int進(jìn)行url傳遞參數(shù)時(shí),參數(shù)key是必須寫的,其值也只能是int類型的,否則將會(huì)報(bào)錯(cuò)。 比如方法:
@RequestMapping(value = "baseType.do")
@ResponseBody //返回的數(shù)據(jù)放到ResponseBody的數(shù)據(jù)區(qū)中
public String baseType(int age){
return "age:"+age;
}
請(qǐng)求的url地址:http://localhost:8080/baseType.do?age=10,其中參數(shù)age是必傳的,其值只能是int類型的; 如果不傳,將會(huì)報(bào)500錯(cuò)誤。比如:http://localhost:8080/baseType.do 如果傳遞了,但是數(shù)據(jù)類型是其他類型,將會(huì)報(bào)400錯(cuò)誤,比如:http://localhost:8080/baseType.do?age=abc
又比如方法:
@RequestMapping(value="baseType1.do")
@ResponseBody
public String baseType1(@RequestParam(value="xage")int age){
return "age: " + age;
}
我們可以使用@RequestParam注解來為傳入的參數(shù),定義一個(gè)別名參數(shù), @RequestParam(value="",required = true)value參數(shù)別名 required 該參數(shù)是否必傳,默認(rèn)為true; 訪問的url地址如下: http://localhost:8080/baseType1.do?xage=10 同樣xage這個(gè)參數(shù)也是必傳的,其類型為int。
如果是其他基本數(shù)據(jù)類型也是如此,其中 byte,short,int的默認(rèn)值都為0,long的默認(rèn)值為0L,float的默認(rèn)值為0.0f,double的默認(rèn)值為0.0d 在進(jìn)行數(shù)據(jù)綁定時(shí),其參數(shù)值必傳,其值的類型為其對(duì)應(yīng)的基本數(shù)據(jù)類型。
綁定封裝數(shù)據(jù)類型
Java封裝類型Integer的默認(rèn)值為null,在使用Integer進(jìn)行url數(shù)據(jù)傳遞時(shí),參數(shù)key可以不傳,對(duì)應(yīng)參數(shù)的值就會(huì)默認(rèn)為null。 比如方法:
@RequestMapping(value = "baseType2.do")
@ResponseBody
public String baseType2(Integer age){
return "age:"+age;
}
其url地址參數(shù)age可以不傳,也可以傳,對(duì)應(yīng)的url地址如下: http://localhost:8080/baseType2.do?age=10 http://localhost:8080/baseType2.do 但是如果傳遞了age參數(shù),其值為其他數(shù)據(jù)類型,將會(huì)報(bào)400錯(cuò)誤,比如:http://localhost:8080/baseType2.do?age=abc
數(shù)據(jù)綁定的數(shù)值型接受參數(shù)可以是基本類型和包裝類型,但二者有區(qū)別: 1、基本類型不可接受空值,會(huì)報(bào)錯(cuò)。且輸入數(shù)值必須在指定數(shù)據(jù)類型的數(shù)據(jù)范圍內(nèi) 2、包裝類型則可以接受空值,具有優(yōu)勢(shì),推薦使用,比如傳遞的參數(shù)是年齡、身高、長(zhǎng)度、寬度等,具體情況可根據(jù)業(yè)務(wù)需要進(jìn)行變更。
綁定數(shù)組類型
Java數(shù)組:它是一個(gè)具有相同數(shù)據(jù)類型,固定大小的對(duì)象。 綁定數(shù)組類型的方法如下:
@RequestMapping(value = "array.do")
@ResponseBody
public String array(String[] name){
StringBuilder sbf = new StringBuilder();
StringBuffer sb = new StringBuffer();
for(String item : name){
sbf.append(item).append(" ");
}
return sbf.toString();
}
在使用url地址傳遞參數(shù)時(shí),一次可以傳遞多個(gè)參數(shù)值,值與值之間使用&分開,如下: http://localhost:8080/array.do?name=Tom&name=Lucy&name=Jim
綁定對(duì)象類型
這里以綁定User對(duì)象為例,綁定的方法如下:
@RequestMapping(value="/user")
@ResponseBody
public String GetUser(User user){
return user.toString();
}
使用url傳遞參數(shù)的方式如下: http://localhost:8080/user?name=Tom&age=10 其中name、age都是User對(duì)象的屬性。
對(duì)象類型的數(shù)據(jù)綁定,直接請(qǐng)求時(shí)對(duì)應(yīng)其屬性即可,不必添加前綴,如User類的屬性name,則直接在請(qǐng)求中使用name=xxx,而不是使用user.name=xxx的形式。url如下: http://localhost:8080/user?name=Tom&age=10 但如果是想對(duì)對(duì)象中對(duì)象的屬性再賦值的話,則需要使用xxx.xxx的形式,如下的contactInfo.phone表示將User類中的ContactInfo類的phone屬性賦值。 如下: http://localhost:8080/object.do?name=Tom&age=10&contactInfo.phone=10086
兩個(gè)對(duì)象同屬性進(jìn)行數(shù)據(jù)綁定 這里以User對(duì)象和Admin對(duì)象為例,這兩個(gè)對(duì)象具有相同的屬性name,age,這兩個(gè)對(duì)象進(jìn)行數(shù)據(jù)綁定的方法如下:
@RequestMapping(value = "object.do")
@ResponseBody
public String object(User user,Admin admin){
return user.toString()+" "+admin.toString();
}
在這里是有Spring注解@InitBinder來初始化一個(gè)對(duì)象。 對(duì)于兩個(gè)不同的類,遇到同名屬性的情況,SpringMVC會(huì)默認(rèn)針對(duì)所有類的同名屬性賦值,如下面url傳遞的name,age參數(shù)將是兩個(gè)對(duì)象共有的: http://localhost:8080/object.do?name=Tom&age=10
如果想要區(qū)別對(duì)待,直接使用xxx.xxx的形式是不行的,還需要在對(duì)應(yīng)的Controller中定義方法, 以 @InitBinder 注解標(biāo)記屬性名,形參使用 WebDataBinder 來定義請(qǐng)求參數(shù)前綴,若沒加前綴則是共有的。方法定義如下:
@InitBinder("user") //@InitBinder 初始化一個(gè)對(duì)象
public void initUser(WebDataBinder binder){
binder.setFieldDefaultPrefix("user.");
}
@InitBinder("admin")
public void initAdmin(WebDataBinder binder){
binder.setFieldDefaultPrefix("admin.");
}
使用url傳遞參數(shù),如下: http://localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=10 其中age參數(shù)是兩個(gè)對(duì)象共用的。
綁定List對(duì)象
Java中List集合類型:List是一個(gè)有序,可重復(fù)的的線性表。 在綁定List對(duì)象數(shù)據(jù)時(shí),首先要將對(duì)象封裝為L(zhǎng)ist對(duì)象,并設(shè)置它的get/set方法,以User對(duì)象為例,封裝如下: private List users; 然后controller下對(duì)應(yīng)的方法定義如下:
@RequestMapping(value = "list.do")
@ResponseBody
public String list(UserListForm userListForm){
return "listSize:"+userListForm.getUsers().size() + " " + userListForm.toString();
}
其中UserListForm是封裝的List對(duì)象類,使用url傳遞參數(shù)的方式如下: http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy
Controller中List參數(shù)不能直接傳值,需要一個(gè)包裹類,類中有需要傳的List作為屬性和對(duì)應(yīng)的get,set方法。 傳值時(shí)用users[0].name = Tom users[1].name = Luce 一定不要跳躍傳值,如users[0].name = Tom&users[20].name = Lucy 這樣中間的1~19也會(huì)占用資源屬性值為空。 http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy&users[20].name=Jim
綁定Map對(duì)象
Java中Map集合對(duì)象:Map是一個(gè)基于kay-value鍵值對(duì)的集合類型,它是無序的,其中鍵key不可重復(fù),值value可以重復(fù)。 在綁定Map對(duì)象數(shù)據(jù)時(shí),首先要將對(duì)象封裝為Map對(duì)象,并設(shè)置它的get/set方法,以User對(duì)象為例,封裝如下:
private Mapusers;
然后controller下對(duì)應(yīng)的方法定義如下:
java@RequestMapping(value="map.do")
@ResponseBody
publicStringmap(UserMapFormuserMapForm){
returnuserMapForm.toString();
}
其中UserMapForm是封裝的Map對(duì)象,使用url傳遞參數(shù)的方式如下: http://localhost:8080/map.do?users[‘X’].name=Tom&users[‘X’].age=10&users[‘Y’].name=Lucy 其中X,Y是key,類型是String類型。
綁定Set對(duì)象 Java中Set集合對(duì)象:Set集合無序,且不可重復(fù),因?yàn)樗貙懥薶ashCode()方法和equals()方法; Set集合在實(shí)際的應(yīng)用中,常用于對(duì)象的重復(fù)判斷或者排除重復(fù)。 在SpringMVC中綁定Set數(shù)據(jù)類型,接口的參數(shù)形式和綁定list是類似的,都是通過索引。但是不同的在于,Set必須初始化,它必須先包含了初始化對(duì)象,也即是說必須提前手動(dòng)分配好空間,才能進(jìn)行賦值,而使用List則沒有這個(gè)要求。
另外的一個(gè)坑在于,初始化Set時(shí)需要留意對(duì)象的equals方法,假如我們?cè)谔崆胺峙鋬蓚€(gè)對(duì)象空間時(shí),兩個(gè)對(duì)象通過equals方法判斷為相同,則我們期望的Set的size為2,最后實(shí)際因?yàn)槿ブ刈兂闪?,導(dǎo)致在數(shù)據(jù)綁定時(shí)很容易出現(xiàn)數(shù)組越界的異常。
Set集合類型:我們一般用來排重 使用Set的時(shí)候需要先進(jìn)行初始化 要使用Set的排重功能必須在對(duì)象中覆寫hashcode和equals方法。 SpringMVC對(duì)Set支持并不太好,初始化進(jìn)行排重時(shí)會(huì)導(dǎo)致size變小,致使無法接受更多的數(shù)據(jù)而拋出異常,所以我們開發(fā)一般優(yōu)先使用List。
在綁定Set對(duì)象數(shù)據(jù)時(shí),首先要將對(duì)象封裝為Set對(duì)象,并設(shè)置它的get/set方法,并提供構(gòu)造方法,封裝如下:
private Set<User> users;
private UserSetForm(){
users = new LinkedHashSet<User>();
users.add(new User()); //定義兩個(gè)對(duì)象
users.add(new User());
}
其次還要重寫User對(duì)象的hashCode()方法和equals()方法 然后controller下對(duì)應(yīng)的方法定義如下:
@RequestMapping(value = "set.do")
@ResponseBody
public String set(UserSetForm userSetForm){
return userSetForm.toString();
}
其中UserSetForm是封裝的Set對(duì)象,使用url傳遞參數(shù)的方式如下: http://localhost:8080/set.do?users[0].name=Tom&users[1].name=Lucy 且不可跳范圍傳值,如下: http://localhost:8080/set.do?users[0].name=Tom&users[20].name=Lucy 將會(huì)報(bào)錯(cuò)。
綁定XML對(duì)象
Java綁定XML對(duì)象:XML是一種擴(kuò)展標(biāo)記語言,常用來存儲(chǔ)或傳輸數(shù)據(jù)。 對(duì)于xml類型的數(shù)據(jù)綁定,需要在方法形參上增加注解 @RequestBody,并且在Post請(qǐng)求時(shí)請(qǐng)求頭為Content-Type: application/xml。 這樣SpringMVC就會(huì)調(diào)用對(duì)應(yīng)的解析器去解析,所以我們同時(shí)還需要在pom中添加xml解析的相關(guān)依賴 spring-oxm ,如下:
org.springframework
spring-oxm
4.0.0.RELEASE
將xml對(duì)應(yīng)的實(shí)體類進(jìn)行注解標(biāo)注,根節(jié)點(diǎn)放在類名,并使用name屬性設(shè)定對(duì)應(yīng)的xml中的根節(jié)點(diǎn)名稱,其他節(jié)點(diǎn)同理。 對(duì)于Admin對(duì)象的name,age屬性定義為xml,格式如下:
Jim 16 xml 數(shù)據(jù)綁定:必須在實(shí)體類里面加注解@XmlRootElement,在屬性上添加XmlElement。定義如下:
@XmlRootElement(name="admin")
public class Admin {
private String name;
private Integer 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(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Admin{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
ex:@XmlElement(name=“age”):此時(shí)就會(huì)將xml 里面對(duì)應(yīng)的age數(shù)據(jù)添加到實(shí)體類中的age屬性中去。 然后controller下對(duì)應(yīng)的方法定義如下:
@RequestMapping(value = "xml.do")
@ResponseBody
public String xml(@RequestBody Admin admin){
return admin.toString();
}
url請(qǐng)求地址為: http://localhost:8080/xml.do, 請(qǐng)求頭為Content-Type: application/xml.
綁定Json對(duì)象
Java綁定Json對(duì)象:JSON 是輕量級(jí)的文本數(shù)據(jù)交換格式,常用于存儲(chǔ)和交換文本信息。 SpringMVC接受http中body的json格式內(nèi)容為參數(shù),在方法的形參前加上注解 @RequestBody,用以調(diào)用解析器進(jìn)行轉(zhuǎn)換,值得注意的是: 1、在參數(shù)中加注解@RequestBody( @RequestBody User user)。@RequestBody是把傳過來的Json數(shù)據(jù)反序列化綁定到控制器參數(shù)上。 controller中方法定義如下:
@RequestMapping(value = "json.do")
@ResponseBody
public String json(@RequestBody User user){
return user.toString();
}
2、pom.xml文件中引入依賴jar包,如下:
org.codehaus.jackson
jackson-mapper-asl
1.9.9
3、http請(qǐng)求頭:Content-Type: application/json。 url請(qǐng)求地址為: http://localhost:8080/json.do
作者:霜花似雪 鏈接:https://www.imooc.com/article/267808 來源:慕課網(wǎng) 本文原創(chuàng)發(fā)布于慕課網(wǎng) ,轉(zhuǎn)載請(qǐng)注明出處,謝謝合作???end???
本公眾號(hào)免費(fèi)提供csdn下載服務(wù),海量IT學(xué)習(xí)資源,如果你準(zhǔn)備入IT坑,勵(lì)志成為優(yōu)秀的程序猿,那么這些資源很適合你,包括但不限于java、go、python、springcloud、elk、嵌入式 、大數(shù)據(jù)、面試資料、前端 等資源。同時(shí)我們組建了一個(gè)技術(shù)交流群,里面有很多大佬,會(huì)不定時(shí)分享技術(shù)文章,如果你想來一起學(xué)習(xí)提高,可以公眾號(hào)后臺(tái)回復(fù)【2】,免費(fèi)邀請(qǐng)加技術(shù)交流群互相學(xué)習(xí)提高,會(huì)不定期分享編程IT相關(guān)資源。
掃碼關(guān)注,精彩內(nèi)容第一時(shí)間推給你
總結(jié)
以上是生活随笔為你收集整理的controller接收json数据_SpringMVC实现多种数据类型绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为java 优招面试题_2017华为优
- 下一篇: 系统辨识理论及应用_控制理论学习书单推荐