springMVC通过ajax传递参数list对象或传递数组对象到后台

环境:

  • 前台传递参数到后台
  • 前台使用ajax
  • 后台使用springMVC
  • 传递的参数是N多个对象

JSON对象和JSON字符串

在SpringMVC环境中,@RequestBody接收的是一个Json对象的字符串,而不是一个Json对象。然而在ajax请求往往传的都是Json对象,用 JSON.stringify(data)的方式就能将对象变成字符串。同时ajax请求的时候也要指定dataType: "json",contentType:"application/json" 这样就可以轻易的将一个对象或者List传到Java端!

Content-Type

服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,且Content-Type为application/x-www-form-urlencoded,而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。

jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

第一种方式 传递的参数Bean

jsp文件:
$("#saveuddd").click(function(){
var saveDataAry=[];
var data1={"name":"test","password":"gz"};
var data2={"name":"ququ","password":"gr"};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:"POST",
url: basePath + "/user/saveUser",
dataType:"json",
contentType:"application/json", // 指定这个协议很重要
data:JSON.stringify(saveDataAry), //只有这一个参数,json格式,后台解析为实体,后台可以直接用
success:function(data){
}
});
})
java文件
@RequestMapping(value = "saveUser", method = {RequestMethod.POST })
@ResponseBody
public void saveu( @RequestBody List<User> users ){ //此时的user是map数据,并没有解析为bean // 不建议使用
System.out.println(users) ;
}
使用如下方法,可以使用bean
@RequestMapping(value = "saveUser", method = {RequestMethod.POST })
@ResponseBody
public void saveu( @RequestBody User[] users ){
System.out.println(users.getName()) ; // 此时的user是实体bean
}

第二种方式 传递的键值对

jsp同上
另外一种:
@RequestMapping(value = "saveUser", method = {RequestMethod.POST })
@ResponseBody
public void saveu( @RequestBody List<Map<String,String>> users ){ // spring MVC只能解析外层的json格式,内部的bean转化为Map格式的键值对,需要对map解析
List<User> userList = new ArrayList<User>();
for(Map<String,String> map : users){
User u = new User();
u.setName(map.get("name"));
u.setPassword(map.get("password"));
userList.add(u);
}
// 这里就可以使用 userList 了
}

第三种方式

能够传递多个参数,但是每一个参数都是字符串(bean类型的数据会转化为JSON格式的字符串)

jsp文件
$("#saveuddd").click(function(){
var saveDataAry=[];
var data1={"name":"test","password":"gz"};
var data2={"name":"ququ","password":"gr"};
saveDataAry.push(data1);
saveDataAry.push(data2);
$.ajax({
type:"POST",
url: basePath + "/user/saveUser",
dataType:"json",
data:{users:JSON.stringify(saveDataAry),aa:"ddd"},
// 可以传递多个参数,但此时的users内容与另外一个参数:aa 的内容一起传递,所以后台解析为字符串
// 后台接收的users内容:[{"name":"test","password":"gz"},{"name":"ququ","password":"gr"}]
// 后台接收的 aa 内容:"ddd"
success:function(data){ }
});
})
java文件
@RequestMapping(value = "saveUser", method = {RequestMethod.POST })
@ResponseBody
public void saveu( String users , String aa ){
System.out.println(users) ;
}

以上是自己整理思考而来,如愿意打赏,请微信扫描,金额随意~~

springMVC通过ajax传递参数list对象或传递数组对象到后台的更多相关文章

  1. [Effective JavaScript 笔记]第58条:区分数组对象和类数组对象

    示例 设想有两个不同类的API.第一个是位向量:有序的位集合 var bits=new BitVector(); bits.enable(4); bits.enable([1,3,8,17]); bi ...

  2. 简述JavaScript对象、数组对象与类数组对象

    问题引出 在上图给出的文档中,用JavaScript获取那个a标签,要用什么办法呢?相信第一反应一定是使用document.getElementsByTagName('a')[0]来获取.同样的,在使 ...

  3. js之数组,对象,类数组对象

    许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...

  4. Java调用函数传递参数到底是值传递还是引用传递

    今天翻看微信上有关Java技术的公众号时,看到了一篇关于Java中值传递的问题,文章讨论了在Java中调用函数进行传参的时候到底是值传递还是引用传递这个面试时会问到的问题.之前也接触过类似的问题,但只 ...

  5. jquery解析php通过ajax传过来的json二维数组对象

    ajax获得php传过来的json二维数组对象,jquery解析 php代码: <?php $news = array( '武汉'=>array(1,2,3), '广州'=>arra ...

  6. Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理

    Array 数组对象数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的数组定义的方法: 1. 定义了一个空数组: var ...

  7. JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)

    1.字符串属性   <script>   var test_var = "I Iove you"; console.log(test_var.charAt(3)) // ...

  8. 类数组对象arguments 和 数组对象

    arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象: 就像下面的这段输出,就是典型的类数组对象: {0:12, 1:23} 一.类数组 VS 数组 相同点: 都 ...

  9. JavaScript 浅析数组对象与类数组对象

    数组(Array对象) 数组的操作 创建数组方法 添加与修改数组元素 删除数组元素 使用数组元素 遍历数组元素 多维数组 数组相关的函数 concat() join() pop() push() sh ...

  10. js遍历数组对象和非数组对象

    //---------for用来遍历数组对象 var i,myArr = ["a","b","c"]; ; i < myArr.len ...

随机推荐

  1. TortoiseSvn安装的时候,将svn的命令行工具单独隔离出来

    https://stackoverflow.com/questions/2967176/where-is-svn-exe-in-my-machine The subversion program co ...

  2. Codeforces 344A Magnets

    Description Mad scientist Mike entertains himself by arranging rows of dominoes. He doesn't need dom ...

  3. 自动与因特网时间服务器同步 NTP 服务器 pool.ntp.org, 120.24.166.46 端口 123

    自动与因特网时间服务器同步   NTP 服务器 pool.ntp.org 海康提供的NTP服务器   120.24.166.46     端口  123

  4. CentOS桥接网卡配置

    网桥方式配置步骤 1.增加网桥设备br0 vi /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge B ...

  5. [Python] Generates permutations

    >>> import itertools >>> for p in itertools.permutations('ABCD'): ... print(p) ('A ...

  6. [Python] Python Libs

    The Python Standard Library has a lot of modules! To help you get familiar with what's available, he ...

  7. 认识 Atlassian Datacenter 产品

    认识 Atlassian Datacenter 产品 云端原本就是群集化的架构,Atlassian 系列产品.应用的开发团队相当广范且行之有年,可是将应用程序作为节点(比方Jira,confluenc ...

  8. POJ 2391 Floyd+二分+拆点最大流

    题意: 思路: 先Floyd一遍两两点之间的最短路 二分答案 建图 跑Dinic 只要不像我一样作死#define int long long 估计都没啥事-- 我T到死辣--.. 最后才改过来-- ...

  9. janos.io

    http://janos.io/ https://developer.mozilla.org/en-US/Firefox_OS/Developing_Firefox_OS/Porting

  10. LuoguP1251 餐巾计划问题(费用流)

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...