SpringMVC接收复杂集合参数

来源:互联网 发布:网络教育网络统考 编辑:程序博客网 时间:2024/05/29 14:53
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代码  收藏代码
  1. var idList = new Array();  
  2. idList.push(“1”);   
  3. idList.push(“2”);   
  4. idList.push(“3”);  
  5. var isBatch = false;  
  6. $.ajax({  
  7.     type: "POST",  
  8.     url: "<%=path%>/catalog.do?fn=deleteCatalogSchemes",  
  9.     dataType: 'json',  
  10.     data: {"idList":idList,"isBatch":isBatch},  
  11.     success: function(data){  
  12.         …  
  13.     },  
  14.     error: function(res){  
  15.         …  
  16.     }  
  17. });  

 

 2Controller方法:

 

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/catalog.do")  
  3. public class CatalogController {  
  4.   
  5.     @RequestMapping(params = "fn=deleteCatalogSchemes")  
  6.     @ResponseBody  
  7.     public AjaxJson deleteCatalogSchemes(@RequestParam("idList[]") List<String> idList,Boolean isBatch) {  
  8.             …  
  9.     }  
  10. }  

 

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

 1、User实体类:

 

Java代码  收藏代码
  1. public class User {  
  2.         private String name;   
  3.     private String pwd;  
  4.     //省略getter/setter  
  5. }  

 

2、页面js代码:

Js代码  收藏代码
  1. var userList = new Array();  
  2. userList.push({name: "李四",pwd: "123"});   
  3. userList.push({name: "张三",pwd: "332"});   
  4. $.ajax({  
  5.     type: "POST",  
  6.     url: "<%=path%>/catalog.do?fn=saveUsers",  
  7.     data: JSON.stringify(userList),//将对象序列化成JSON字符串  
  8.     dataType:"json",  
  9.     contentType : 'application/json;charset=utf-8'//设置请求头信息  
  10.     success: function(data){  
  11.         …  
  12.     },  
  13.     error: function(res){  
  14.         …  
  15.     }  
  16. });  

 

3Controller方法:

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/catalog.do")  
  3. public class CatalogController {  
  4.   
  5.     @RequestMapping(params = "fn=saveUsers")  
  6.     @ResponseBody  
  7.     public AjaxJson saveUsers(@RequestBody List<User> userList) {  
  8.         …  
  9.     }  
  10. }  

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

 

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

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

Js代码  收藏代码
  1. var userList = new Array();  
  2. userList.push({name: "李四",pwd: "123"});   
  3. userList.push({name: "张三",pwd: "332"});   
  4. $.ajax({  
  5.     type: "POST",  
  6.     url: "<%=path%>/catalog.do?fn=saveUsers",  
  7.     data: JSON.stringify(userList),//将对象序列化成JSON字符串  
  8.     dataType:"json",  
  9.     contentType : 'application/json;charset=utf-8'//设置请求头信息  
  10.     success: function(data){  
  11.         …  
  12.     },  
  13.     error: function(res){  
  14.         …  
  15.     }  
  16. });  

  

2Controller方法:

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/catalog.do")  
  3. public class CatalogController {  
  4.   
  5.     @RequestMapping(params = "fn=saveUsers")  
  6.     @ResponseBody  
  7.     public AjaxJson saveUsers(@RequestBody List<Map<String,Object>> listMap) {  
  8.         …  
  9.     }  
  10. }  

 

  •  接收User(bean里面包含List)集合参数:

 1、User实体类:

Java代码  收藏代码
  1. public class User {  
  2.     private String name;   
  3.     private String pwd;  
  4.     private List<User> customers;//属于用户的客户群  
  5.     //省略getter/setter  
  6. }  

 

2、页面js代码:

 

Js代码  收藏代码
  1. var customerArray = new Array();  
  2. customerArray.push({name: "李四",pwd: "123"});   
  3. customerArray.push({name: "张三",pwd: "332"});   
  4. var user = {};  
  5. user.name = "李刚";  
  6. user.pwd = "888";  
  7. user. customers = customerArray;  
  8. $.ajax({  
  9.     type: "POST",  
  10.     url: "<%=path%>/catalog.do?fn=saveUsers",  
  11.     data: JSON.stringify(user),//将对象序列化成JSON字符串  
  12.     dataType:"json",  
  13.     contentType : 'application/json;charset=utf-8'//设置请求头信息  
  14.     success: function(data){  
  15.         …  
  16.     },  
  17.     error: function(res){  
  18.         …  
  19.     }  
  20. });  

  3Controller方法:

Java代码  收藏代码
  1. @Controller  
  2. @RequestMapping("/catalog.do")  
  3. public class CatalogController {  
  4.   
  5.     @RequestMapping(params = "fn=saveUsers")  
  6.     @ResponseBody  
  7.     public AjaxJson saveUsers(@RequestBody User user) {  
  8.         List<User> customers = user.getCustomers();  
  9.         …  
  10.     }  

    •  接收User(bean里面包含List)集合参数:

     1、User实体类:

    Java代码  收藏代码
    1. public class User {  
    2.     private String name;   
    3.     private String pwd;  
    4.     private List<User> customers;//属于用户的客户群  
    5.     //省略getter/setter  
    6. }  

     

    2、页面js代码:

     

    Js代码  收藏代码
    1. var customerArray = new Array();  
    2. customerArray.push({name: "李四",pwd: "123"});   
    3. customerArray.push({name: "张三",pwd: "332"});   
    4. var user = {};  
    5. user.name = "李刚";  
    6. user.pwd = "888";  
    7. user. customers = customerArray;  
    8. $.ajax({  
    9.     type: "POST",  
    10.     url: "<%=path%>/catalog.do?fn=saveUsers",  
    11.     data: user
    12.     dataType:"json",  
    13.     success: function(data){  
    14.         …  
    15.     },  
    16.     error: function(res){  
    17.         …  
    18.     }  
    19. });  

      3Controller方法:

    Java代码  收藏代码
    1. @Controller  
    2. @RequestMapping("/catalog.do")  
    3. public class CatalogController {  
    4.   
    5.     @RequestMapping(params = "fn=saveUsers")  
    6.     @ResponseBody  
    7.     public AjaxJson saveUsers(User user) {  
    8.         List<User> customers = user.getCustomers();  
    9.         …  
    10.     }  

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

    前端代码

    [javascript] view plain copy
    1. $.ajax{  
    2.       url:"xxxx",  
    3.       data:{  
    4.             p: ["123""456""789"]  
    5.       }  
    6. }  


    后台代码

    [java] view plain copy
    1. @RequestMapping("/getEventData")  
    2. public Map<String, Object> getEventData(List<String> areaList) {  
    3.     // TODO  
    4. }  


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


    方法一:创建一个对象,将list类型的参数封装在对象中。
        先定义一个ParamVo对象,里面声明一个areaList属性。然后将后台代码改成下面的样子就可以接收到前端的参数了。

    [java] view plain copy
    1. public class ParamVo {  
    2.   
    3.     /**行政区域*/  
    4.     private List<String> areaList;  
    5.   
    6.     public List<String> getAreaList() {  
    7.         return areaList;  
    8.     }  
    9.   
    10.     public void setAreaList(List<String> areaList) {  
    11.         this.areaList = areaList;  
    12.     }  
    13.   
    14. }  
    [java] view plain copy
    1. @RequestMapping("/getEventData")  
    2. public Map<String, Object> getEventData(ParamVo param) {  
    3.     // TODO  
    4. }  


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

    [javascript] view plain copy
    1. $.ajax{  
    2.       url:"xxxx",  
    3.       traditional: true,  
    4.       data:{  
    5.             p: ["123""456""789"]  
    6.       }  


原创粉丝点击