1. 程式人生 > 其它 >controller接收json資料_SpringMVC實現多種資料型別繫結

controller接收json資料_SpringMVC實現多種資料型別繫結

技術標籤:controller接收json資料springmvc @requestbody使用json 繫結grid

點選上方“放學等我”,選擇“置頂公眾號”

精品文章,第一時間送達

5e235fec99c2ae1d787dabc738b2029e.png

繫結基本資料型別

Java基本資料型別int的預設值是0,在使用int進行url傳遞引數時,引數key是必須寫的,其值也只能是int型別的,否則將會報錯。 比如方法:

@RequestMapping(value = "baseType.do")

@ResponseBody //返回的資料放到ResponseBody的資料區中

public String baseType(int age){

return "age:"+age;

}

請求的url地址:http://localhost:8080/baseType.do?age=10,其中引數age是必傳的,其值只能是int型別的; 如果不傳,將會報500錯誤。比如:http://localhost:8080/baseType.do 如果傳遞了,但是資料型別是其他型別,將會報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註解來為傳入的引數,定義一個別名引數, @RequestParam(value="",required = true)value引數別名 required 該引數是否必傳,預設為true; 訪問的url地址如下: http://localhost:8080/baseType1.do?xage=10 同樣xage這個引數也是必傳的,其型別為int。

如果是其他基本資料型別也是如此,其中 byte,short,int的預設值都為0,long的預設值為0L,float的預設值為0.0f,double的預設值為0.0d 在進行資料繫結時,其引數值必傳,其值的型別為其對應的基本資料型別。

繫結封裝資料型別

Java封裝型別Integer的預設值為null,在使用Integer進行url資料傳遞時,引數key可以不傳,對應引數的值就會預設為null。 比如方法:

@RequestMapping(value = "baseType2.do")

@ResponseBody

public String baseType2(Integer age){

return "age:"+age;

}

其url地址引數age可以不傳,也可以傳,對應的url地址如下: http://localhost:8080/baseType2.do?age=10 http://localhost:8080/baseType2.do 但是如果傳遞了age引數,其值為其他資料型別,將會報400錯誤,比如:http://localhost:8080/baseType2.do?age=abc

資料繫結的數值型接受引數可以是基本型別和包裝型別,但二者有區別: 1、基本型別不可接受空值,會報錯。且輸入數值必須在指定資料型別的資料範圍內 2、包裝型別則可以接受空值,具有優勢,推薦使用,比如傳遞的引數是年齡、身高、長度、寬度等,具體情況可根據業務需要進行變更。

繫結陣列型別

Java陣列:它是一個具有相同資料型別,固定大小的物件。 繫結陣列型別的方法如下:

@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地址傳遞引數時,一次可以傳遞多個引數值,值與值之間使用&分開,如下: 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傳遞引數的方式如下: http://localhost:8080/user?name=Tom&age=10 其中name、age都是User物件的屬性。

物件型別的資料繫結,直接請求時對應其屬性即可,不必新增字首,如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

兩個物件同屬性進行資料繫結 這裡以User物件和Admin物件為例,這兩個物件具有相同的屬性name,age,這兩個物件進行資料繫結的方法如下:

@RequestMapping(value = "object.do")

@ResponseBody

public String object(User user,Admin admin){

return user.toString()+" "+admin.toString();

}

在這裡是有Spring註解@InitBinder來初始化一個物件。 對於兩個不同的類,遇到同名屬性的情況,SpringMVC會預設針對所有類的同名屬性賦值,如下面url傳遞的name,age引數將是兩個物件共有的: http://localhost:8080/object.do?name=Tom&age=10

如果想要區別對待,直接使用xxx.xxx的形式是不行的,還需要在對應的Controller中定義方法, 以 @InitBinder 註解標記屬性名,形參使用 WebDataBinder 來定義請求引數字首,若沒加字首則是共有的。方法定義如下:

@InitBinder("user") //@InitBinder 初始化一個物件

public void initUser(WebDataBinder binder){

binder.setFieldDefaultPrefix("user.");

}

@InitBinder("admin")

public void initAdmin(WebDataBinder binder){

binder.setFieldDefaultPrefix("admin.");

}

使用url傳遞引數,如下: http://localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=10 其中age引數是兩個物件共用的。

繫結List物件

Java中List集合型別:List是一個有序,可重複的的線性表。 在繫結List物件資料時,首先要將物件封裝為List物件,並設定它的get/set方法,以User物件為例,封裝如下: private List users; 然後controller下對應的方法定義如下:

@RequestMapping(value = "list.do")

@ResponseBody

public String list(UserListForm userListForm){

return "listSize:"+userListForm.getUsers().size() + " " + userListForm.toString();

}

其中UserListForm是封裝的List物件類,使用url傳遞引數的方式如下: http://localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy

Controller中List引數不能直接傳值,需要一個包裹類,類中有需要傳的List作為屬性和對應的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不可重複,值value可以重複。 在繫結Map物件資料時,首先要將物件封裝為Map物件,並設定它的get/set方法,以User物件為例,封裝如下:

private Mapusers;
然後controller下對應的方法定義如下:

[email protected](value="map.do")
@ResponseBody
publicStringmap(UserMapFormuserMapForm){
returnuserMapForm.toString();
}
其中UserMapForm是封裝的Map物件,使用url傳遞引數的方式如下: 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集合無序,且不可重複,因為它重寫了hashCode()方法和equals()方法; Set集合在實際的應用中,常用於物件的重複判斷或者排除重複。 在SpringMVC中繫結Set資料型別,介面的引數形式和繫結list是類似的,都是通過索引。但是不同的在於,Set必須初始化,它必須先包含了初始化物件,也即是說必須提前手動分配好空間,才能進行賦值,而使用List則沒有這個要求。

另外的一個坑在於,初始化Set時需要留意物件的equals方法,假如我們在提前分配兩個物件空間時,兩個物件通過equals方法判斷為相同,則我們期望的Set的size為2,最後實際因為去重變成了1,導致在資料繫結時很容易出現數組越界的異常。

Set集合型別:我們一般用來排重 使用Set的時候需要先進行初始化 要使用Set的排重功能必須在物件中覆寫hashcode和equals方法。 SpringMVC對Set支援並不太好,初始化進行排重時會導致size變小,致使無法接受更多的資料而丟擲異常,所以我們開發一般優先使用List。

在繫結Set物件資料時,首先要將物件封裝為Set物件,並設定它的get/set方法,並提供構造方法,封裝如下:

private Set<User> users;

private UserSetForm(){

users = new LinkedHashSet<User>();

users.add(new User()); //定義兩個物件

users.add(new User());

}

其次還要重寫User物件的hashCode()方法和equals()方法 然後controller下對應的方法定義如下:

@RequestMapping(value = "set.do")

@ResponseBody

public String set(UserSetForm userSetForm){

return userSetForm.toString();

}

其中UserSetForm是封裝的Set物件,使用url傳遞引數的方式如下: 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是一種擴充套件標記語言,常用來儲存或傳輸資料。 對於xml型別的資料繫結,需要在方法形參上增加註解 @RequestBody,並且在Post請求時請求頭為Content-Type: application/xml。 這樣SpringMVC就會呼叫對應的解析器去解析,所以我們同時還需要在pom中新增xml解析的相關依賴 spring-oxm ,如下:

org.springframework

spring-oxm

4.0.0.RELEASE

將xml對應的實體類進行註解標註,根節點放在類名,並使用name屬性設定對應的xml中的根節點名稱,其他節點同理。 對於Admin物件的name,age屬性定義為xml,格式如下:

Jim 16 xml 資料繫結:必須在實體類裡面加註解@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 裡面對應的age資料新增到實體類中的age屬性中去。 然後controller下對應的方法定義如下:

@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 是輕量級的文字資料交換格式,常用於儲存和交換文字資訊。 SpringMVC接受http中body的json格式內容為引數,在方法的形參前加上註解 @RequestBody,用以呼叫解析器進行轉換,值得注意的是: 1、在引數中加註解@RequestBody( @RequestBody User user)。@RequestBody是把傳過來的Json資料反序列化繫結到控制器引數上。 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 來源:慕課網 本文原創釋出於慕課網 ,轉載請註明出處,謝謝合作

•end•


本公眾號免費提供csdn下載服務,海量IT學習資源,如果你準備入IT坑,勵志成為優秀的程式猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大資料、面試資料、前端 等資源。同時我們組建了一個技術交流群,裡面有很多大佬,會不定時分享技術文章,如果你想來一起學習提高,可以公眾號後臺回覆【2】,免費邀請加技術交流群互相學習提高,會不定期分享程式設計IT相關資源。


掃碼關注,精彩內容第一時間推給你

00f4aa5475e60f18d0e8af45234dc852.png