SpringMVC接收ajax传递的list或数组对象

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

最下面有博主关于传递list或数组外,再一起传其他参数的自己的方法,有需要的小伙伴可以自己直接往下看。

SpringMVC通过ajax传递参数list对象或传递数组对象到后台
环境:

  • 前台传递参数到后台
  • 前台使用ajax,后台使用SpringMVC(版本为4.1.9)
  • 传递的参数是N多个对象

JSON对象和JSON字符串在SpringMVS的区别:

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

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,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。

下面有三种传递list或数组的方式

1、传递的参数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是实体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
    }

2、传递的键值对

jsp文件同上。
java文件:

@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 了
 }

3、当做字符串:

能够传递多个参数,但是每一个参数都是字符串(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) ;
    }

以上三种方法种,我个人最推荐第1种方法中,java的第1个方法,传的就是一个list,但仅能接收一个list,不能传递其他参数了。假设你要传递的其他参数比较少的话,可以利用SpringMVC中的@PathVariable标签,其具体写法为:
假设你还想传递一个id字段,其值为12345。
jsp文件:

$("#saveuddd").click(function(){
    var saveDataAry=[];
    var data1={"name":"test","password":"gz"};
    var data2={"name":"ququ","password":"gr"};
    saveDataAry.push(data1);
    saveDataAry.push(data2);
    var id = '12345';
    $.ajax({
        type:"POST",
        url: basePath + "/user/saveUser/" + id,
        dataType:"json",
        contentType:"application/json", // 指定这个协议很重要
        data:JSON.stringify(saveDataAry), //只有这一个参数,json格式,后台解析为实体,后台可以直接用
        success:function(data){}
    });
})

java文件:

@RequestMapping(value = "saveUser/{id}", method = {RequestMethod.POST })
     @ResponseBody
    public void saveu( @RequestBody List<User> users, @PathVariable("id") String id){ //此时的user是实体bean
         System.out.println(users) ;
         System.out.println(id);
    }

这就是博主目前想到的最优方法,如果大家关于接受list或数组且还能传递其他参数,有什么更好的方法的话,欢迎在下方留言,博主将感激不尽。

猜你喜欢

转载自blog.csdn.net/death05/article/details/79122890
今日推荐