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