springmvc后台接前端的参数,数组,集合,复杂对象等

参考地址:https://blog.csdn.net/feicongcong/article/details/54705933

 常用的几种方式如下:
 
前端使用jquery向后台传递数组类型的参数,Java后台直接通过List类型接收,会发现无法取到参数。
如果后台非要用List接收参数的话,可以这样实现:

POST方法时Java后端使用@RequestBody注解接收参数

$.ajax{
      url:"xxxx",
      type : 'POST',
      dataType:"json",      
      contentType:"application/json", 
      data: JSON.stringify(["123", "456"]),
      ......

}

后台

@RequestMapping("/getEventData") 
public void getEventData(@RequestBody List<String> areaList) {
    // TODO
}

 
(1)数组:
后台
@ResponseBody
@RequestMapping(value = "/ajaxsortPriority")
public ResultDo ajaxsortPriority(@RequestParam("ids[]") Long[] ids) {
ResultDo resultDo=new ResultDo();
int size=cmsBannerService.sortPriority(ids);
if(size==ids.length){
resultDo.setSuccess(true);
}else{
resultDo.setSuccess(false);
}
return resultDo;
}

前端

var param=[];
$("#tb_order").find("td[name='id']").each(function(){
param.push($(this).text());
})
var ids={ids:param};
$.ajax({
cache: true,
type: "GET",
url: "/cmsBanner/ajaxsortPriority",
dataType:"json",
data:ids,
async: false,
success: function (data) {

(2)集合

后台

@RequestMapping(value = "/cfgRepayRemind", method = RequestMethod.POST)
@ResponseBody
public ResultDo<?> cfgRepayRemind(
@RequestBody List<SysDictPojo> sysDictPojos //@RequestBody 前台请求的数据格式必须为json ) {
ResultDo<?> resultDo = ResultDo.build();
try {
icProjectRepayService.cfgRepayRemind(sysDictPojos);
} catch (Exception e) {
resultDo.setSuccess(false);
} return resultDo;
}
//pojo类
public class SysDictPojo extends AbstractBasePojo {
private Long id;
private String key;
private String value;
private String description; }

前端

function cfgRepayRemind(ele) {
var url = $(ele).attr("value");
var params = [];
$("#repayRemindMobile").find("ul").each(function () {
var id = $(this).find("input[name='id']").eq(0).val();
var value = $(this).find("input[name='value']").eq(0).val(); params.push({id: id, value: value});//id,value 为java bean里的属性,名字一致
}) $.ajax({
cache: true,
type: "POST",
url: url,
data: JSON.stringify(params),// 指定请求的数据格式为json,实际上传的是json字符串
contentType: 'application/json;charset=utf-8',//指定请求的数据格式为json,这样后台才能用@RequestBody 接受java bean
dataType: "json",
async: false,
success: function (data) {
if (data.success) {
toastr.success("操作成功");
setTimeout(function () {
location.reload();
}, 1000)
}
}
});
}

(3) 单参数

前端

$.ajax({
type:"post",
data:{total:'100'},
dataType:'json', url:"http://127.0.0.1:8089/icProject/test",
success:function () { }
})

后台

@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String test(@RequestParam("total") String total
) {
return null;
}

(3)传多个参数

前端

var tagIds = []
$.ajax({
type: "POST",
url: "/auth/childComment/createComment",
data: {
id: $("#sourceId").val(),
courseId: $("#courseId").val(),
classId: $("#commentClassId").val(),
content: $("#updateContent").val(),
childId: $("#childId").val(),
classCatalogId: $("#classCatalogId").val(),
tagId: tagIds
},

后台

@PostMapping("createComment")
@PreAuthorize("hasAnyAuthority('merchant:childComment:index')")
@ResponseBody
public ResultDo createComment(
@RequestParam(value = "childId") Long childId,
@RequestParam(value = "courseId") Long courseId,
@RequestParam(value = "classId") Long classId,
@RequestParam(value = "classScheduleId") Long classScheduleId,
@RequestParam(value = "content") String content,
@RequestParam(value = "tagId[]", required = false) List<Long> tagIds
) {

(4)表单数据序列化传参,ajax提交

前端

var params = $("#sysUserFrm").serialize();
var url = "/sysUser/settingSave"
$.ajax({
cache: true,
type: "POST",
url: url,
data: params,
dataType: "json",
async: false,
success: function (data) {}
})

后台

@RequestMapping(value = "/settingSave", method = RequestMethod.POST)
@ResponseBody
public ResultDo<?> settingSave(SysUserPojo sysUserPojo) {}

这样sysUserPojo也能接收到Bean,其实这里的$("#sysUserFrm").serialize()  就相当于组装的  json对象 { }

使用时必须先组装json对象{username:"carter" }

我的习惯是用 @RequestBody接受带List对象的对象或者List对象,因为js中有个push方法用来组合得到 List 比较简单

不使用contentType: “application/json”则data可以是对象,使用contentType: “application/json”则data只能是json字符串

使用@RequestBody(实际上接受的是json的字符串)

function logined() {
$.ajax({
type: "POST",
url: "/backend/logined",
data:JSON.stringify({userName:"cater",password:"123456"}) ,//转成字符串
contentType: "application/json;charset=utf-8",//不使用contentType: “application/json”则data可以是对象,使用contentType: “application/json”则data只能是json字符串
success: function (data) {}
})
}
   @RequestMapping(value = "adds",method = RequestMethod.POST,produces="text/html;charset=UTF-8")
@ResponseBody
public SimpleResult adds(HttpServletRequest request, HttpServletResponse response){
SimpleResult simpleResult=null; String str = null;
try {
//解码,为了解决中文乱码
str = URLDecoder.decode(request.getParameter("model"),"UTF-8");
System.out.println("----------------str"+str);
JSONObject jb=new JSONObject();
//将json格式的字符串转换为json数组对象
JSONArray array=(JSONArray)jb.fromObject(str).get("dts"); //取得json数组中的第一个对象
JSONObject o = (JSONObject) array.get(0);//获得第一个array结果
System.out.println("数组大小:"+array.size());
//取出json数组中第一个对象的“userName”属性值
String name=o.get("drunam").toString();//获得属性值
System.out.println(name);
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
} simpleResult=SimpleResult.success();
return simpleResult;
}

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

服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,且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后台接前端的参数,数组,集合,复杂对象等的更多相关文章

  1. ajax使用json数组------前端往后台发送json数组及后台往前端发送json数组

    1.引子 Json是跨语言数据交流的中间语言,它以键/值对的方式表示数据,这种简单明了的数据类型能被大部分编程语言理解.它也因此是前后端数据交流的主要方式和基础. 2.前端往后台传输json数据 第一 ...

  2. 前端请求参数MD5加密发送后台

    最近在项目开发中遇到前端发送参数加密的问题,网上查找半天也是很乱,小编自己在项目开发中总结了一下,写到博客中,希望能够帮助大家. 查看所有代码可到我的github上查看源文件,下载后在控制台查看结果即 ...

  3. springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)

    上一篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)中我们已经介绍了参数解析相关的东西,并且也提到了HandlerMethodArgume ...

  4. springmvc:请求参数绑定集合类型

    一.请求参数绑定实体类 domain: private String username; private String password; private Double money; private ...

  5. SpringMVC后台接收list类型的数据的实现方式

    一.背景 最近在做一些东西的时候,遇到一个需要Springmvc后台接收list类型数据的需求,几经辗转才完美解决了这个问题,今天记下来方便以后使用,也分享给需要的小伙伴们~ 二.实现方式 1.实现方 ...

  6. Springmvc中 同步/异步请求参数的传递以及数据的返回

    转载:http://blog.csdn.net/qh_java/article/details/44802287 注意: 这里的返回就是返回到jsp页面 **** controller接收前台数据的方 ...

  7. springmvc中同步/异步请求参数的传递以及数据的返回

    注意: 这里的返回就是返回到jsp页面 **** controller接收前台数据的方式,以及将处理后的model 传向前台***** 1.前台传递数据的接受:传的属性名和javabean的属性相同 ...

  8. AJAX 向后台发送带 List 集合的对象

    现有基类: public class School { int name; int address; List<Student> students = new ArrayList<S ...

  9. SpringMVC学习(二)———— 参数绑定

    一.参数绑定 1.1.什么是参数绑定? 客户在浏览器端会提交一些参数到服务器端,比如用户的登录等,就会传username 和 password过来,springmvc则通过参数绑定组件将请求参数的内容 ...

随机推荐

  1. linux查看系统状态的命令

    vmstat查看机器实时的综合情况:load,内存,swap,cpu使用率等方面 procs: r:运行队列中进程数量 b:等待IO的进程数量 memory(内存): swpd:使用虚拟内存大小 fr ...

  2. Java基础整理

    一.Java中的遍历 1.在java开发中会碰到遍历List删除其中多个元素的情况,如果使用一般的for循环以及增强的for循环,代码会抛出异常ConcurrentModificationExcept ...

  3. CSS 选择器权重计算规则

    其实,CSS有自己的优先级计算公式,而不仅仅是行间>内部>外部样式:ID>class>元素. 一.样式类型 1.行间 <h1 style="font-size: ...

  4. linux OS与SQL修改时区,系统时间

    linux修改系统时间和linux查看时区.修改时区的方法 一.查看和修改Linux的时区 1. 查看当前时区命令 : "date -R" 2. 修改设置Linux服务器时区方法 ...

  5. 关于字符串split一些用法

    split方法在大数据开发中的多用于日志解析及字段key值分割,最近需求中碰到一个问题在 无论怎么分割都会出现数组下标越界问题, 由于前台在sdk中多加了几个字段(测试数据很少,大多为空) ,需要我们 ...

  6. GoldenGate实时投递数据到大数据平台(6)– HDFS

    GoldenGate可以实时将RDBMS的数据投递到HDFS中,在前面的文章中,已经配置过投递到kafka, mongodb等数据平台,本文通过OGG for bigdata的介质中自带的示例演示实时 ...

  7. 怎样从外网访问内网Web?

    本地部署了一个Web服务端,只能在局域网内访问,怎样从外网也能访问到本地的Web服务呢?本文将介绍具体的实现步骤. 准备工作 部署并启动Web服务程序 默认部署的Web服务端口是8080. 实现步骤 ...

  8. git获取一个版本相对于另一个版本新增,修改,删除的文件

    git diff --name-status 00ef237ef0f0a4b8bd9609c2b6d570472028212d abf13b4d58abbb05a7d494cdc205d025978a ...

  9. Quick Find (QF)

    Quick Find 顾名思义就是快速查找,构建一个数组,通过下标即可迅速查找其id Union and Find:构建一个数组,下标为索引,数组元素的值为其id,初始id和索引相同 Union(p, ...

  10. 【题解】Luogu P3950 部落冲突

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 我们用Link-Cut-Tree维护连通性(十分无脑) 一开始先把树中每条边的两端连接 U操作:把u,v两个点连起来 ...