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.mzph.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…

致敬词

见义勇为致敬词 面对灾难和死神&#xff0c;你们大义凛然、知险而上&#xff0c;把平安和生机留给他人&#xff0c;把困难和危险留给自己。巍巍乎高山景行&#xff0c;铮铮然铁骨侠风&#xff1b;壮志谱传奇&#xff0c;热血写春秋。你们是&#xff1a;百姓英雄&#xff0c;平安…

经常使用计算机的孩子,常玩电脑对孩子负面影响大,家长们不容小觑!

相信不少的家庭都会备有电脑&#xff0c;人们在网络世界里面能够找到自己需要的东西。不仅是大人喜欢玩电脑&#xff0c;小孩也喜欢玩电脑。然而常玩电脑对孩子负面影响大吗&#xff1f;有多大&#xff1f;一、行为问题全国青少年教育协会指出&#xff0c;5岁以下的使用电脑的孩…

VMware下ubuntu与Windows实现文件共享的方法

最近安装caffe需要将Windows下文件拷贝到ubuntu16.04下&#xff0c;就进行了共享文件夹的设置&#xff0c;期间遇到一些困难&#xff0c;记录下来&#xff0c;方便以后遇到此类问题不再困惑。 &#xff08;记录只为更好的分享&#xff09; 言归正传&#xff1a; 1、首先需要在u…

mybatis入门-新手注意问题

参数问题 在映射文件中通过parameterType指定输入参数的类型&#xff1b;在映射文件中通过resultType指定输出结果的类型。 占位符和拼接符问题 #{}表示一个占位符号&#xff0c;#{}接收输入参数&#xff0c;类型可以是简单类型&#xff0c;pojo、hashmap。 如果接收简单类型&a…

远程桌面连接时无法访问远程计算机的计算机属性提示系统调用失败,远程过程调用失败【应对技巧】...

喜欢使用电脑的小伙伴们一般都会遇到win7系统远程过程调用失败的问题&#xff0c;突然遇到win7系统远程过程调用失败的问题就不知道该怎么办了&#xff0c;其实win7系统远程过程调用失败的解决方法非常简单&#xff0c;按照1&#xff1a;第一步我们可以看到sql server数据库出现…

库卡机器人C4计算机无法启动,KUKA-C4标准版机器人启动时序

描述1.T1模式下选择CELL程序&#xff0c;手动执行程序&#xff0c;注意中间路径&#xff0c;有时机器人不在HOME点附近&#xff0c;回原点的过程中需慢速运行&#xff0c;直至到达BCO。2.松开执行键&#xff0c;重新按下&#xff0c;信息栏出现“运行方式错误”提示&#xff0c…

ADF:将UI类别与动态表单一起使用

JDev 11g R2具有有趣的新功能“ UI类别”。 它使我们可以在视图对象定义级别上以声明方式对VO的属性进行分组。 例如&#xff0c;我的VEmployees视图对象的“ UI Categories”选项卡如下所示&#xff1a; 默认情况下&#xff0c;每个视图对象都有一个预定义的类别“默认”。 我…

Exchange超级实用命令行

发现Powershell很强大以后&#xff0c;就欲罢不能了。来点干货 有PST文件的没有成功导出&#xff0c;原因是执行时会报错&#xff0c;说需要64位Outlook&#xff0c;dotnet4.5以上环境。还有说法是Exchange2010开始不支持PST导入导出。 整理了一下最近尝试比较实用的命令&#…

位数不足前面补0mysql语句_全网热议:监控补光灯爆亮闪瞎眼!你遇到过吗?

唔知大家有无咁ga体会每当夜晚揸车经过一排监控补光灯瞬间像“瞎子”那样看不到东西&#xff0c;“威力”堪比远光灯(△ 11月12日晚&#xff0c;安定门外大街&#xff0c;主路上的监控补光灯)近日&#xff0c;“监控补光灯太刺眼&#xff0c;给夜间行车安全造成极大隐患”一事引…

4种常见的 PHP 设计模式

工厂模式 在大型系统中&#xff0c;许多代码依赖于少数几个关键类。需要更改这些类时&#xff0c;可能会出现困难。例如&#xff0c;假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类&#xff0c;但是&#xff0c;所有的代码都引用从文件读取的原始类。…

安装卡主_智能温室四周玻璃的安装学问还这么多

智能玻璃温室大棚是指顶部及四周以玻璃为覆盖材料的尖顶温室大棚&#xff0c;玻璃温室大棚这几年的流行是由于纹络型温室顶部阳光板问题的抗老化方面容易出现问题。因此很多客户为了种植获得更高的透光率&#xff0c;更长的使用年限&#xff0c;因而多选择全玻璃温室大棚。那么…

String类详解(1)

首先String是一个类。  1&#xff0c;实例化String类方法。 1&#xff09;直接赋值&#xff1a;String name"haha"; 2)通过关键字&#xff1a;String namenew String("haha"); 2&#xff0c;String类的数据比较。 首先回顾一下&#xff0c;基础数据的比较…

WebApi Post 后台无法获取参数的解决方案

事件回放&#xff1a; 之前一段时间&#xff0c;公司里前端用的Angularjs 发送http请求也是用的ng的组件&#xff0c;后台是.Net的WebApi 前端 var data {PArgs: {PageIndex: 0,PageSize: 8,RowsCount: 0} };$http.post("/Api/Test/ABC", data).success(function (d…

南京大学计算机系周小莉,周会群

媒体报道&#xff1a;南京大学周会群&#xff1a;用计算机聪明地做实验Q《中国教育网络》A周会群Q&#xff1a;南京大学的高性能计算中心非常特殊&#xff0c;分布在物理&#xff0c;化学、天文、地球科学四个不同的学科中&#xff0c;为什么采取这种模式&#xff1f;A&#xf…

不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph...

GAN 这个领域发展太快&#xff0c;日新月异&#xff0c;各种 GAN 层出不穷&#xff0c;前几天看到一篇关于 Wasserstein GAN 的文章&#xff0c;讲的很好&#xff0c;在此把它分享出来一起学习&#xff1a;https://zhuanlan.zhihu.com/p/25071913。相比 Wasserstein GAN &#…

用于MyBatis CRUD操作的Spring MVC 3控制器

到目前为止&#xff0c;我们已经为域类“ User ”创建了CRUD数据库服务&#xff0c;并且还将MyBatis配置与Spring Configuration文件集成在一起。 接下来&#xff0c;我们将使用Spring MVC创建一个网页&#xff0c;以使用MyBatis CRUD服务对数据库执行操作。 使用MyBatis 3创建…