SpringMVC參數(shù)傳遞之基本數(shù)據(jù)類型和復雜對象說明
前言
本文主要記錄SpringMVC如何接收前臺傳過來的基本數(shù)據(jù)類型和對象,以及可能出現(xiàn)的組合。
在了解下面參數(shù)如何傳遞前先記住兩個結(jié)論
- 當Ajax以application/x-www-form-urlencoded編碼格式上傳數(shù)據(jù),必須使用JSON對象傳遞數(shù)據(jù),后臺需要使用@RequestParam 或者HttpServletRequest來接收數(shù)據(jù)
- 當Ajax以application/json編碼格式上傳數(shù)據(jù),必須使用JSON字符串傳遞數(shù)據(jù),后臺需要使用@RquestBody標識參數(shù)來獲取數(shù)據(jù),使用Map或者實體對象來接收數(shù)據(jù),如果只單單是接收一個數(shù)組,可以使用List來接收數(shù)據(jù)。
下面可能會用到的一些類
public class User {
private String name;
private int age;
//getter and setter...
}1.當簡單接收基本數(shù)據(jù)類型和包裝類型的時候
當前臺發(fā)送過來一些基本類型或包裝類型的數(shù)據(jù),可以直接使用基本類型或包裝類型形參接收,或者把這些參數(shù)封裝在對象中,使用對象來接收。
前臺發(fā)送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){
}
})
})后臺使用基本類型或包裝類型形參接收數(shù)據(jù)
形參名必須和前臺發(fā)送過來的屬性名統(tǒng)一,如果不相同(前臺是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.當接收復雜對象的時候
當從前臺發(fā)過來的json對象中又包含對象的時候,我們可以考慮用Map集合接收,或者使用自定義類來封裝。
前端發(fā)送json字符串(注意:這里使用application/json)
$(function () {
var obj={};
obj.name="展示";
var user1={"name":"李四","age":1};
var user2={"name":"網(wǎng)四","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":"網(wǎng)四","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";
}接收數(shù)據(jù)后的map形參

無論使用自定義類封裝還是使用Map集合,json對象的屬性名一定要和接收對象的屬性一致。
那我們可不可以使用前臺發(fā)送json對象(application/x-www-form-urlencoded),后臺直接使用自定義類來接收呢?
是不可以的,你們自己可以試試。從以往的經(jīng)驗來看,只要前端發(fā)過來的json對象中包含對象或者數(shù)組,都只能使用前臺發(fā)送json字符串,后臺使用@RequestBody修飾的形參接收。
上面只是講解了關(guān)于簡單對象和復雜對象參數(shù)的傳遞,如果對象中涉及到數(shù)組呢?
可以看看我另一篇文章SpringMVC參數(shù)的傳遞——接收List數(shù)組類型的數(shù)據(jù)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringSecurity實現(xiàn)登陸認證并返回token方式
這篇文章主要介紹了SpringSecurity實現(xiàn)登陸認證并返回token方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
SpringSecurity實現(xiàn)前后端分離的示例詳解
Spring Security默認提供賬號密碼認證方式,具體實現(xiàn)是在UsernamePasswordAuthenticationFilter 中,這篇文章主要介紹了SpringSecurity實現(xiàn)前后端分離的示例詳解,需要的朋友可以參考下2023-03-03

