SpringMVC后臺接收list類型的數據的實現方式

一、背景

  最近在做一些東西的時候,遇到一個需要Springmvc后臺接收list類型數據的需求,幾經輾轉才完美解決了這個問題,今天記下來方便以后使用,也分享給需要的小伙伴們~

二、實現方式

實現方式一

前端頁面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>測試</title>
 8 </head>
 9 <body>
10     <input type="button" name="request" value="請求后臺" style="width:200px;height:50px;background-color:red;margin-bottom:20px;">
11     <div name="rs"></div>
12     <input type="checkbox" name="se" value="1">hafiz.zhang<br/>
13     <input type="checkbox" name="se" value="2">jack.chen<br/>
14     <input type="checkbox" name="se" value="3">lili.wang<br/>
15 <script type="text/javascript">
16 
17     $("input[name='request']").click(function(){
18         var data = [];
19         $("input[name='se']").each(function(){
20             if($(this).prop("checked")) {
21                 data.push($(this).val());
22             }
23         });
24         var json_data = JSON.stringify(data);
25         $.ajax({
26             type:"post",
27             url:$.wap.url + "/test/index",
28             contentType:"application/json",
29             data:json_data ,
30             dataType:"json",
31             success:function(data){
32                 var str="";
33                 for(var i = 0; i < data.length; i++) {
34                     str += ";name=" + data[i];
35                 }
36                 $("div[name='rs']").html(str);
37             },
38             error:function(){
39                 alert("出錯啦");
40             }
41         });
42     });    
43 </script>
44 </body>
45 </html>

后臺接收

 1 package com.hafiz.www.controller;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestBody;
 8 import org.springframework.web.bind.annotation.RequestMapping;
 9 import org.springframework.web.bind.annotation.RequestMethod;
10 import org.springframework.web.bind.annotation.ResponseBody;
11 
12 @Controller
13 @RequestMapping("/test")
14 public class TestController {
15     @RequestMapping(value = "/index", method = RequestMethod.POST)
16     @ResponseBody
17     public List<Integer> test(@RequestBody ArrayList<Integer> ids){
18         System.out.println("List==" + ids);
19         return ids;
20     }
21 }

注意:這種方法只適用于POST方法提交,(上面代碼中標紅的是必不可少的代碼)如果使用get方法會出現如下圖所示的錯誤

這是因為get方式的參數中的雙引號會被編碼,導致傳到后臺的不再是json串格式,所以解析出錯。

實現方式二

?前端頁面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>測試</title>
 8 </head>
 9 <body>
10     <input type="button" name="request" value="請求后臺" style="width:200px;height:50px;background-color:red;margin-bottom:20px;">
11     <div name="rs"></div>
12     <input type="checkbox" name="se" value="1">hafiz.zhang<br/>
13     <input type="checkbox" name="se" value="2">jack.chen<br/>
14     <input type="checkbox" name="se" value="3">lili.wang<br/>
15 <script type="text/javascript">
16 
17     $("input[name='request']").click(function(){
18         var data = [];
19         $("input[name='se']").each(function(){
20             if($(this).prop("checked")) {
21                 data.push($(this).val());
22             }
23         });
24         $.ajax({
25             type:"get",
26             url:$.wap.url + "/test/index",
27             data:{"datas":data},//或者data:{"datas[]":data}
28             dataType:"json",
29             success:function(data){
30                 var str="";
31                 for(var i = 0; i < data.length; i++) {
32                     str += ";name=" + data[i];
33                 }
34                 $("div[name='rs']").html(str);
35             },
36             error:function(){
37                 alert("出錯啦");
38             }
39         });
40     });    
41 </script>
42 </body>
43 </html>

后臺接收,指定參數名必須以數組方式,如:@RequestParam("datas[]")

  1).通過ArrayList接收

 1 package com.hafiz.www.controller;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestMethod;
 9 import org.springframework.web.bind.annotation.RequestParam;
10 import org.springframework.web.bind.annotation.ResponseBody;
11 
12 @Controller
13 @RequestMapping("/test")
14 public class TestController {
15     @RequestMapping(value = "/index", method = RequestMethod.GET)
16     @ResponseBody
17     public List test(@RequestParam("datas[]") ArrayList<Integer> ids){
18         System.out.println("List==" + ids);
19         return ids;
20     }
21 }

  2).通過數組進行接收

 1 package com.hafiz.www.controller;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.springframework.stereotype.Controller;
 7 import org.springframework.web.bind.annotation.RequestMapping;
 8 import org.springframework.web.bind.annotation.RequestMethod;
 9 import org.springframework.web.bind.annotation.RequestParam;
10 import org.springframework.web.bind.annotation.ResponseBody;
11 
12 @Controller
13 @RequestMapping("/test")
14 public class TestController {
15     @RequestMapping(value = "/index", method = RequestMethod.POST)
16     @ResponseBody
17     public Integer[] test(@RequestParam("datas[]") Integer[] ids){
18         System.out.println("ids==" + ids);
19         return ids;
20     }
21 }

注意:

  1.這種方式對于get和post方式的請求同樣都適用....

  2.以上兩種實現方式傳到后臺的數據不能為null,否則會報Http 400錯誤。

實現方式三

 前端頁面

 1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 3 <html>
 4 <head>
 5     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 6     <title>測試</title>
 7 </head>
 8 <body>
 9 <input type="button" name="request" value="請求后臺"
10        style="width:200px;height:50px;background-color:red;margin-bottom:20px;">
11 <div name="rs"></div>
12 <input type="checkbox" name="se" value="1">hafiz.zhang<br/>
13 <input type="checkbox" name="se" value="2">jack.chen<br/>
14 <input type="checkbox" name="se" value="3">lili.wang<br/>
15 <script type="application/javascript" src="js/jquery-1.11.1.min.js"></script>
16 <script type="text/javascript">
17 
18     $("input[name='request']").click(function () {
19         var data = [];
20         $("input[name='se']").each(function () {
21             if ($(this).prop("checked")) {
22                 data.push($(this).val());
23             }
24         });
25         $.ajax({
26             type: "post",
27             url: "/test/index",
28             data: {"datas": data.join()}
29             dataType: "json",
30             success: function (data) {
31                 var str = "";
32                 for (var i = 0; i < data.length; i++) {
33                     str += ";name=" + data[i];
34                 }
35                 $("div[name='rs']").html(str);
36             },
37             error: function () {
38                 alert("出錯啦");
39             }
40         });
41     });
42 </script>
43 </body>
44 </html>

后端代碼

  1)通過數組接收

 1 package com.hafiz.www.controller;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 import org.springframework.web.bind.annotation.RequestMethod;
 6 import org.springframework.web.bind.annotation.RequestParam;
 7 import org.springframework.web.bind.annotation.ResponseBody;
 8 
 9 import java.util.ArrayList;
10 import java.util.List;
11 
12 /**
13  * Desc:測試控制器
14  * Created by hafiz.zhang on 2017/7/2.
15  */
16 @Controller
17 @RequestMapping("/test")
18 public class TestController {
19     @RequestMapping(value = "/index", method = RequestMethod.POST)
20     @ResponseBody
21     public Integer[] test(@RequestParam("datas") Integer[] ids) {
22         System.out.println("ids=" + ids);
23         return ids;
24     }
25 }

  2).通過List接收

package com.hafiz.www.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;/*** Desc:測試控制器* Created by hafiz.zhang on 2017/7/2.*/
@Controller
@RequestMapping("/test")
public class TestController {@RequestMapping(value = "/index", method = RequestMethod.POST)@ResponseBodypublic List test(@RequestParam("datas") List<Integer> ids) {System.out.println("ids=" + ids);return ids;}
}

這種方式即使沒有選中任何復選框進行提交,也不會報錯!

?

對于想要前端傳自定義對象數組到后端,以上的方式就不適用了,那么解決辦法是什么呢?

?

  • ajax請求中設置contentType:"application/json;charset=utf-8"

  • ajax請求中設置data:JSON.stringify(dataList)

  • 后端Controller種用@RequestBody YourObject[] data進行接收,并且只能用數組接收.

?

如果你有更好的實現方式,希望可以拿來分享。。。。

三、總結

1.實現方式一只對post方法有效,且比較繁瑣,不推薦!

2.實現方式二要求后端接收的時候必須聲明參數為數組,但可以使用數組或者list進行接收參數,如:@RequestParam("datas[]"),前端使用data:{"datas":data}或data:{"datas[]":data}都可以!且post和get方法都適用。但是不能傳空數組,限制也比較多,也不太推薦。

3.實現方式三只需要前端傳值的時候使用數組的join()方法,為空數組也不會報錯,配置簡單,要求少,且支持使用數組和list進行接收參數,比較推薦!?

關于傳遞自定義對象的集合,可以參考這篇文章:https://blog.csdn.net/sweetgirl520/article/details/79127223

轉載于:https://www.cnblogs.com/hafiz/p/5498936.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373034.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven集成測試和Spring Restful Services

介紹 我的原始博客通過一個非常簡單的示例展示了如何分離Maven單元和集成測試。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;許多人要求我提供比最初使用的示例更實際的示例。 這篇文章展示了如何在實際環境中&#…

玩cf出現outofmemory_CF畫質粗糙平衡感人,卻能歷經十年經久不衰,靠的是什么?...

Hello大家好&#xff0c;我是沐辰。《穿越火線》這款游戲國內運營時間已長達十年&#xff0c;從最早接觸這款游戲開始&#xff0c;很多玩家都在這里烙刻下了許多關于青春的回憶。CF的許多問題一直頗受詬病&#xff0c;例如落后且粗糙的畫質、英雄級武器與平民武器的巨大差距、千…

jquery遍歷ajax返回的json數據

我們以前在前端遍歷ajax拿到的數據一般都是用for或其他方式遍歷&#xff0c;這樣做麻煩且費事&#xff0c;效率不高&#xff0c;下面提供一個函數&#xff0c;只需調用函數即可把數據遍歷出來&#xff0c;方便高效。 html代碼&#xff1a; <html> <head><script…

Apache JMeter:隨心所欲進行負載測試

這是有關使用Apache JMeter進行負載測試的第二篇文章&#xff0c;請在此處閱讀第一篇文章&#xff1a; 有關對關系數據庫進行負載測試的分步教程。 JMeter有很多采樣器 。 如果您需要JMeter不提供的采樣器&#xff0c;則可以編寫自定義采樣器。 &#xff08;自定義采樣器在JMet…

html5歷史管理

在網易云課堂上看了妙味課堂的關于html5歷史管理的課程&#xff0c;在這里做一下筆記。 單頁面或ajax局部刷新的頁面中&#xff0c;沒有辦法通過前一步和后一步得到歷史訪問數據&#xff0c;此時有兩種方法可以解決這個問題&#xff1a; 1.onhashchange事件&#xff0c;示例代碼…

elementui下拉框 清空_巧妙解決element-ui下拉框選項過多的問題

1. 場景描述不知道你有沒有這樣的經歷&#xff0c;下拉框的選項很多&#xff0c;上萬個選項甚至更多&#xff0c;這個時候如果全部把數據放到下拉框中渲染出來&#xff0c;瀏覽器會卡死&#xff0c;體驗會特別不好用人會說element-ui的select有一個remote-method&#xff0c;支…

致敬詞

見義勇為致敬詞 面對災難和死神&#xff0c;你們大義凜然、知險而上&#xff0c;把平安和生機留給他人&#xff0c;把困難和危險留給自己。巍巍乎高山景行&#xff0c;錚錚然鐵骨俠風&#xff1b;壯志譜傳奇&#xff0c;熱血寫春秋。你們是&#xff1a;百姓英雄&#xff0c;平安…

MOXy作為您的JAX-RS JSON提供程序–客戶端

最近&#xff0c;我發布了如何利用EclipseLink JAXB&#xff08;MOXy&#xff09;的JSON綁定來創建RESTful服務。 在本文中&#xff0c;我將演示在客戶端利用MOXy的JSON綁定有多么容易。 MOXy作為您的JAX-RS JSON提供程序–服務器端 MOXy作為您的JAX-RS JSON提供程序–客戶端 …

經常使用計算機的孩子,常玩電腦對孩子負面影響大,家長們不容小覷!

相信不少的家庭都會備有電腦&#xff0c;人們在網絡世界里面能夠找到自己需要的東西。不僅是大人喜歡玩電腦&#xff0c;小孩也喜歡玩電腦。然而常玩電腦對孩子負面影響大嗎&#xff1f;有多大&#xff1f;一、行為問題全國青少年教育協會指出&#xff0c;5歲以下的使用電腦的孩…

基于SpringBoot的養老院管理系統

文章目錄 項目介紹主要功能截圖:部分代碼展示設計總結項目獲取方式?? 作者主頁:超級無敵暴龍戰士塔塔開 ?? 簡介:Java領域優質創作者??、 簡歷模板、學習資料、面試題庫【關注我,都給你】 ??文末獲取源碼聯系?? 項目介紹 基于SpringBoot的養老院管理系統,java項…

外呼機器人起名_智能外呼機器人,目前都有哪些公司做產品?

做智能外呼機器人的企業現在已經挺多了&#xff0c;比如各個答案中提到的各家的產品。它的市場認可度也比較高&#xff0c;大家都知道它能用于通知、回訪、問卷調查、營銷等業務場景。外呼機器人的價值很好衡量&#xff0c;用了外呼機器人后&#xff0c;能給企業賺多少錢&#…

VMware下ubuntu與Windows實現文件共享的方法

最近安裝caffe需要將Windows下文件拷貝到ubuntu16.04下&#xff0c;就進行了共享文件夾的設置&#xff0c;期間遇到一些困難&#xff0c;記錄下來&#xff0c;方便以后遇到此類問題不再困惑。 &#xff08;記錄只為更好的分享&#xff09; 言歸正傳&#xff1a; 1、首先需要在u…

前端開發流程

一般都是在我們開發一個項目之前我們會進行一個討論會&#xff0c;然后一起分析一下這個項目應該怎么去做&#xff0c;那些地方可以用最新的一些技術&#xff0c;那些技術有兼容問題&#xff0c;哪些可以實現&#xff0c;哪些不可以實現&#xff0c;這些討論完以后&#xff0c;…

TestNG和Maven配置指南

為了有用&#xff0c;自動測試應該運行得非常快。 否則&#xff0c;將不會在開發期間經常運行&#xff0c;甚至在開發人員工作站的默認配置中將被忽略。 最簡單的規則是僅編寫小型單元測試&#xff0c;該測試將模擬給定類的鄰居。 但是&#xff0c;有時在IoC容器上下文&#xf…

微型計算機廣告牌實驗報告,微型計算機實驗報告1資料.doc

實驗報告1. 實驗名稱程序編譯及調試2. 實驗目的掌握匯編語言語句格式&#xff0c;程序結構&#xff0c;上機調試步驟和各種類型程序的設計方法。了解匯編語言的基本語法&#xff0c;匯編程序的功能和匯編&#xff0c;調試過程&#xff0c;偽指令&#xff0c;匯編語言程序設計&a…

mybatis入門-新手注意問題

參數問題 在映射文件中通過parameterType指定輸入參數的類型&#xff1b;在映射文件中通過resultType指定輸出結果的類型。 占位符和拼接符問題 #{}表示一個占位符號&#xff0c;#{}接收輸入參數&#xff0c;類型可以是簡單類型&#xff0c;pojo、hashmap。 如果接收簡單類型&a…

python文件管理包_Python標準庫04 文件管理 (部分os包,shutil包)

Python標準庫04 文件管理 (部分os包&#xff0c;shutil包)在操作系統下&#xff0c;用戶可以通過操作系統的命令來管理文件&#xff0c;參考。Python 標準庫則允許我們從 Python 內部管理文件。相同的目的&#xff0c;我們有了兩條途徑。盡管在 Python 調用標準庫的方式不如操作…

Delphi Berlin 10.1 for iOS 成生 info.plist 順序改變了

在 Delphi Seattle 10 update 1 版本&#xff08;含之前版本&#xff09;&#xff0c;只要 Project > Build 會立即生成 info.plist 如果需要修改 info.plist 可以利用 TMS 提供的修改工具 Fixing on iOS 9 來修改。 在 Delphi Berlin 10.1 版本&#xff0c;順序改變了&…

MANIFEST.MF和feature.xml版本控制規則

我永遠忘記了OSIF插件和功能的 MANIFEST.MF和feature.xml中的依賴項聲明的規則是什么。 谷歌搜索經常導致沮喪而不是答案。 所以&#xff0c;因為今天我實際上找到了這些規則的簡要列表&#xff0c;所以我想在這里重新發布它們&#xff0c;并進行一些小的修改以幫助闡明。 OSGi…

遠程桌面連接時無法訪問遠程計算機的計算機屬性提示系統調用失敗,遠程過程調用失敗【應對技巧】...

喜歡使用電腦的小伙伴們一般都會遇到win7系統遠程過程調用失敗的問題&#xff0c;突然遇到win7系統遠程過程調用失敗的問題就不知道該怎么辦了&#xff0c;其實win7系統遠程過程調用失敗的解決方法非常簡單&#xff0c;按照1&#xff1a;第一步我們可以看到sql server數據庫出現…