前言
本文主要記錄SpringMVC
如何接收前臺傳過來的基本數據類型和對象,以及可能出現的組合。
在瞭解下面參數如何傳遞前先記住兩個結論:
- 當
Ajax
以application/x-www-form-urlencoded
編碼格式上傳數據,必須使用JSON
對象傳遞數據,後臺需要使用@RequestParam
或者HttpServletRequest
來接收數據 - 當
Ajax
以application/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數組類型的數據