您的位置:首页 > 编程语言 > Java开发

SpringMVC接收复杂集合参数

2017-08-16 16:18 423 查看
SpringMVC集合  Spring MVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody默认接收的enctype
(MIME编码)是application/json,因此发送POST请求时需要设置请求报文头信息,否则Spring MVC在解析集合请求参数时不会自动的转换成JSON数据再解析成相应的集合。以下列举接收List<String>、List<User>、List<Map<String,Object>>、User[]、User(bean里面包含List)几种较为复杂的集合参数示例:

接收List<String>集合参数:

1、页面js代码:

  

Js代码  


var idList = new Array();  
idList.push(“1”);   
idList.push(“2”);   
idList.push(“3”);  
var isBatch = false;  
$.ajax({  
    type: "POST",  
    url: "<%=path%>/catalog.do?fn=deleteCatalogSchemes",  
    dataType: 'json',  
    data: {"idList":idList,"isBatch":isBatch},  
    success: function(data){  
        …  
    },  
    error: function(res){  
        …  
    }  
});  

 

 2、Controller方法:

 

Java代码  


@Controller  
@RequestMapping("/catalog.do")  
public class CatalogController {  
  
    @RequestMapping(params = "fn=deleteCatalogSchemes")  
    @ResponseBody  
    public AjaxJson deleteCatalogSchemes(@RequestParam("idList[]") List<String> idList,Boolean isBatch) {  
            …  
    }  
}  

 

 接收List<User>、User[]集合参数:

 1、User实体类:

 

Java代码  


public class User {  
        private String name;   
    private String pwd;  
    //省略getter/setter  
}  

 

2、页面js代码:

Js代码  


var userList = new Array();  
userList.push({name: "李四",pwd: "123"});   
userList.push({name: "张三",pwd: "332"});   
$.ajax({  
    type: "POST",  
    url: "<%=path%>/catalog.do?fn=saveUsers",  
    data: JSON.stringify(userList),//将对象序列化成JSON字符串  
    dataType:"json",  
    contentType : 'application/json;charset=utf-8', //设置请求头信息  
    success: function(data){  
        …  
    },  
    error: function(res){  
        …  
    }  
});  

 

3、Controller方法:

Java代码  


@Controller  
@RequestMapping("/catalog.do")  
public class CatalogController {  
  
    @RequestMapping(params = "fn=saveUsers")  
    @ResponseBody  
    public AjaxJson saveUsers(@RequestBody List<User> userList) {  
        …  
    }  
}  

    如果想要接收User[]数组,只需要把saveUsers的参数类型改为@RequestBody User[] userArray就行了。

 

接收List<Map<String,Object>>集合参数:

 1、页面js代码(不需要User对象了):

Js代码  


var userList = new Array();  
userList.push({name: "李四",pwd: "123"});   
userList.push({name: "张三",pwd: "332"});   
$.ajax({  
    type: "POST",  
    url: "<%=path%>/catalog.do?fn=saveUsers",  
    data: JSON.stringify(userList),//将对象序列化成JSON字符串  
    dataType:"json",  
    contentType : 'application/json;charset=utf-8', //设置请求头信息  
    success: function(data){  
        …  
    },  
    error: function(res){  
        …  
    }  
});  

  

2、Controller方法:

Java代码  


@Controller  
@RequestMapping("/catalog.do")  
public class CatalogController {  
  
    @RequestMapping(params = "fn=saveUsers")  
    @ResponseBody  
    public AjaxJson saveUsers(@RequestBody List<Map<String,Object>> listMap) {  
        …  
    }  
}  

 

 接收User(bean里面包含List)集合参数:
 1、User实体类:

Java代码  


public class User {  
    private String name;   
    private String pwd;  
    private List<User> customers;//属于用户的客户群  
    //省略getter/setter  
}  

 

2、页面js代码:

 

Js代码  


var customerArray = new Array();  
customerArray.push({name: "李四",pwd: "123"});   
customerArray.push({name: "张三",pwd: "332"});   
var user = {};  
user.name = "李刚";  
user.pwd = "888";  
user. customers = customerArray;  
$.ajax({  
    type: "POST",  
    url: "<%=path%>/catalog.do?fn=saveUsers",  
    data: JSON.stringify(user),//将对象序列化成JSON字符串  
    dataType:"json",  
    contentType : 'application/json;charset=utf-8', //设置请求头信息  
    success: function(data){  
        …  
    },  
    error: function(res){  
        …  
    }  
});  

  3、Controller方法:

Java代码  


@Controller  
@RequestMapping("/catalog.do")  
public class CatalogController {  
  
    @RequestMapping(params = "fn=saveUsers")  
    @ResponseBody  
    public AjaxJson saveUsers(@RequestBody User user) {  
        List<User> customers = user.getCustomers();  
        …  
    }  


 接收User(bean里面包含List)集合参数:
 1、User实体类:

Java代码  


public class User {  
    private String name;   
    private String pwd;  
    private List<User> customers;//属于用户的客户群  
    //省略getter/setter  
}  

 

2、页面js代码:

 

Js代码  


var customerArray = new Array();  
customerArray.push({name: "李四",pwd: "123"});   
customerArray.push({name: "张三",pwd: "332"});   
var user = {};  
user.name = "李刚";  
user.pwd = "888";  
user. customers = customerArray;  
$.ajax({  
    type: "POST",  
    url: "<%=path%>/catalog.do?fn=saveUsers",  
    data: user

    dataType:"json",  
    success: function(data){  
        …  
    },  
    error: function(res){  
        …  
    }  
});  

  3、Controller方法:

Java代码  


@Controller  
@RequestMapping("/catalog.do")  
public class CatalogController {  
  
    @RequestMapping(params = "fn=saveUsers")  
    @ResponseBody  
    public AjaxJson saveUsers(User user) {  
        List<User> customers = user.getCustomers();  
        …  
    }  

前端使用jQuery向后台传递数组类型的参数,Java后台直接通过list类型接收,会发现无法取到参数的情况。就像下面的情况:

前端代码

[javascript] view
plain copy

$.ajax{  

      url:"xxxx",  

      data:{  

            p: ["123", "456", "789"]  

      }  

}  

后台代码

[java] view
plain copy

@RequestMapping("/getEventData")  

public Map<String, Object> getEventData(List<String> areaList) {  

    // TODO  

}  

这么写的话,在java后台是无法取到参数的,因为jquery需要调用jQuery.param序列化参数。如果后台非要用list接收参数的话,有2种方法可以实现。

方法一:创建一个对象,将list类型的参数封装在对象中。

    先定义一个ParamVo对象,里面声明一个areaList属性。然后将后台代码改成下面的样子就可以接收到前端的参数了。

[java] view
plain copy

public class ParamVo {  

  

    /**行政区域*/  

    private List<String> areaList;  

  

    public List<String> getAreaList() {  

        return areaList;  

    }  

  

    public void setAreaList(List<String> areaList) {  

        this.areaList = areaList;  

    }  

  

}  

[java] view
plain copy

@RequestMapping("/getEventData")  

public Map<String, Object> getEventData(ParamVo param) {  

    // TODO  

}  

方法二 :ajax中添加traditional:true。

[javascript] view
plain copy

$.ajax{  

      url:"xxxx",  

      traditional: true,  

      data:{  

            p: ["123", "456", "789"]  

      }  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: