SpringMVC參數傳遞——基本數據類型和複雜對象

前言

本文主要記錄SpringMVC如何接收前臺傳過來的基本數據類型和對象,以及可能出現的組合。

在瞭解下面參數如何傳遞前先記住兩個結論:

  • Ajaxapplication/x-www-form-urlencoded編碼格式上傳數據,必須使用JSON對象傳遞數據,後臺需要使用@RequestParam 或者HttpServletRequest來接收數據
  • Ajaxapplication/json編碼格式上傳數據,必須使用JSON字符串傳遞數據,後臺需要使用@RquestBody標識參數來獲取數據,使用Map或者實體對象來接收數據,如果只單單是接收一個數組,可以使用List來接收數據。

下面可能會用到的一些類

public class User {
    private String name;
    private int age;
	//getter and setter...
}

1.當簡單接收基本數據類型和包裝類型的時候

當前臺發送過來一些基本類型或包裝類型的數據,可以直接使用基本類型或包裝類型形參接收,或者把這些參數封裝在對象中,使用對象來接收。

前臺發送json對象(application/x-www-form-urlencoded

$(function () {
    var obj={};
    obj.name="李四";
    obj.age=12;
    $.ajax({
        url: "/param/test1",
        type:"POST",
        contentType:"application/x-www-form-urlencoded",
        data:obj,
        dataType:"json",
        success:function(data){
        }
    })
})

後臺使用基本類型或包裝類型形參接收數據

形參名必須和前臺發送過來的屬性名統一,如果不相同(前臺是age字段,後臺使用userAge字段接收),可以使用@RequestParam聲明是要接收哪個字段的值

@RequestMapping(value = "/test1", method = RequestMethod.POST)
@ResponseBody
private String Test1(String name,@RequestParam("age")int  userAge) {
   System.out.println(name);
   System.out.println(userAge);
   return "success";
}

當然這裏也可以使用對象來接收,前提是對象的成員變量名必須和json對象的屬性名一致。

@RequestMapping(value = "/test1", method = RequestMethod.POST)
@ResponseBody
private String Test1(User user) {
   System.out.println(user);
   return "success";
}

2.當接收復雜對象的時候

當從前臺發過來的json對象中又包含對象的時候,我們可以考慮用Map集合接收,或者使用自定義類來封裝。

前端發送json字符串(注意:這裏使用application/json

$(function () {
    var obj={};
    obj.name="展示";
    var user1={"name":"李四","age":1};
    var user2={"name":"網四","age":23};
    obj.users={};
    obj.users.user1=user1;
    obj.users.user2=user2;
    var s=JSON.stringify(obj);
    $.ajax({
        url: "/param/test1",
        type:"POST",
        contentType:"application/json",
        data:JSON.stringify(obj),//"{"name":"展示","users":{"user1":{"name":"李四","age":1},"user2":{"name":"網四","age":23}}}"
        dataType:"json",
        success:function(data){
        }
    })
})

使用自定義類來接收

public class StringAndMap {
    private String name;
    private Map<String,User> users;
    //getter and setter....
}
@RequestMapping(value = "/test1", method = RequestMethod.POST)
@ResponseBody
private String Test1(@RequestBody StringAndMap sam) {
    System.out.println(sam.getName());
    Map<String,User> userMap=sam.getUsers();
    System.out.println(userMap.get("user1"));
    System.out.println(userMap.get("user2"));
    return "success";
}

使用Map集合接收

@RequestMapping(value = "/test1", method = RequestMethod.POST)
@ResponseBody
private String Test1(@RequestBody Map<String,Object> map) {
    System.out.println(map.get("name"));
    Map<String,Object> userMap=(Map<String,Object>)map.get("users");
    System.out.println(userMap.get("user1"));
    System.out.println(userMap.get("user2"));
    return "success";
}

接收數據後的map形參
在這裏插入圖片描述
無論使用自定義類封裝還是使用Map集合,json對象的屬性名一定要和接收對象的屬性一致。那我們可不可以使用前臺發送json對象(application/x-www-form-urlencoded),後臺直接使用自定義類來接收呢?是不可以的,你們自己可以試試。從以往的經驗來看,只要前端發過來的json對象中包含對象或者數組,都只能使用前臺發送json字符串,後臺使用@RequestBody修飾的形參接收。

上面只是講解了關於簡單對象和複雜對象參數的傳遞,如果對象中涉及到數組呢?可以看看我另一篇文章SpringMVC參數的傳遞——接收List數組類型的數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章