javascript
SpringMVC参数的传递——接收List数组类型的数据
前言
本文主要是記錄SpringMVC中當前臺傳過來數組的時候,如何把前臺傳過來的數據封裝到Controller層方法的形參中。
在了解下面參數如何傳遞前先記住兩個結論:
- 當Ajax以application/x-www-form-urlencoded編碼格式上傳數據,必須使用JSON對象傳遞數據,后臺需要使用@RequestParam 或者HttpServletRequest來接收數據
- 當Ajax以application/json編碼格式上傳數據,必須使用JSON字符串傳遞數據,后臺需要使用@RquestBody標識參數來獲取數據,使用Map或者實體對象來接收數據,如果只單單是接收一個數組,可以使用List來接收數據。
1.前臺發送String和基本類型數組
前臺數據的發送(發送json對象(或js對象)
$(function () {var obj={};obj.name="李四";obj.nums=[1,2,3];$.ajax({url: "/param/test1",type:"POST",contentType:"application/x-www-form-urlencoded",data:obj,dataType:"json",success:function(data){}}) })后臺接收數據
后臺接收數據時的形參必須和前臺表單里的字段名一樣(如果不一致要使用@RequestParam聲明,數組必須聲明)
@RequestMapping(value = "/test1", method = RequestMethod.POST)@ResponseBodyprivate String Test1(String name,@RequestParam("nums[]") Integer[] nums) {System.out.println(name);for(int i=0;i<nums.length;i++){System.out.println(nums[i]);}return "success";}當然,也可以使用List來接收
@RequestMapping(value = "/test1", method = RequestMethod.POST)@ResponseBodyprivate String Test1(String name,@RequestParam("nums[]") List<Integer> nums) {System.out.println(name);System.out.println(nums);return "success";}對于上面的這兩種接收方式只適用于接收基本類型或包裝類型的數組。
2.前臺發送String類型和對象數組
一些將要使用的類
public class User {private String name;private int age;//getter and setter... } public class StringAndList {private List<User> users;private String name;//getter and setter... }前端發送json字符串(注意:這里使用application/json)
$(function () {var obj={};obj.name="展示";var user1={"name":"李四","age":1};var user2={"name":"網四","age":23};obj.users=[];obj.users.push(user1);obj.users.push(user2);var s=JSON.stringify(obj);$.ajax({url: "/param/test1",type:"POST",contentType:"application/json",//注意編碼格式data:JSON.stringify(obj),//"{"name":"展示","users":[{"name":"李四","age":1},{"name":"網四","age":23}]}"dataType:"json",success:function(data){}}) })后臺接收數據
一個方法中只允許有一個@RequestBody修飾的參數(此時方法中只可以有一個形參),它實際上是將輸入流的body體作為一個整體進行轉換,而body整體只有一份,解析完成之后會關閉輸入流。如果傳入多個參數則會報錯,除非自定義參數解析器。所以當我們既要接收String參數,又要接收對象數組的時候,我們只能把這兩個參數封裝在一個自定義類中。
@RequestMapping(value = "/test1", method = RequestMethod.POST)@ResponseBodyprivate String Test1(@RequestBody StringAndList sal) {System.out.println(sal);return "success";}前面不是說可以使用Map來接收數據嗎,那使用Map來接收的數據是怎么樣的呢?我們來試試
@RequestMapping(value = "/test1", method = RequestMethod.POST)@ResponseBodyprivate String Test1(@RequestBody Map<String,Object> map) {return "success";}通過debug,我們可以發現map保存的數據是什么(我們可以把傳過來的json對象中的屬性-值想象成一個個key-value,就不難理解為什么可以用Map接收了)
3.前臺只發送對象數組
上面展示了同時接收其他類型和對象數組的情況,那么如果只接收對象數組呢?
前端發送json字符串
$(function () {var obj=[];var user1={"name":"李四","age":1};var user2={"name":"網四","age":23};obj.push(user1);obj.push(user2);var s=JSON.stringify(obj);//"[{"name":"李四","age":1},{"name":"網四","age":23}]"$.ajax({url: "/param/test1",type:"POST",contentType:"application/json",data:JSON.stringify(obj),dataType:"json",success:function(data){}}) })后臺接收數據
因為只要接收數組,所以不用自定義一個類來封裝數據
@RequestMapping(value = "/test1", method = RequestMethod.POST)@ResponseBodyprivate String Test1(@RequestBody List<User> users) {//參數名任意System.out.println(users);return "success";} 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的SpringMVC参数的传递——接收List数组类型的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可视化:中国地图 python/ geo
- 下一篇: Debug Pytorch: Runti