springmvc接收前台(亦可是ajax)传来的数组,复杂对象数组等图文详解

在springmvc接收数组对象List<user>时:

         批量删除比较简单,用我的解决方案一的十分之一功力就可以解决,传个id数组就行了,后台根据id数组删除就行了。麻烦的是对一    个对象的数组,进行批量新增修改,这时,如果可以把前台传来的数据,直接封装到对象的数组(List<user>)中:即数据封装到list的同时,也把name,pwd两个属性,封装到user对象中,就会简化后面对数据的处理。

一:常见的解决方案

1.1博客上看到的一些解决方案

       着重介绍下引入新的"参数解析器",使用“springmvc内置的支持”,这两个方案,为什么要着重介绍呢?因为我发现很多人都是从这里拷贝的,但是没有拷贝完整,所以导致有人在文章下面评论:楼主,你真的测试过这个方法吗?你确定这个办法可行? 我觉得引入新的“参数解析器”是很牛逼的(对彪哥来说),涛哥(京东)写的"参数解析器"点我:我是外链,使用“springmvc内置的支持”点我:我是外链

而且开涛在这个专栏里也写了参数绑定里的源码,推荐可以去看看。

1.2还有一个作者写的:

        点我:我是外链这个我测试过,可行,但是不好处理接收的数据。为什么这么说呢:我想接受的数据是User对象的数组,但是接收的数据是:[{name=111, pwd=111},{name=222, pwd=222}],不能自动封装到我的对象里,没有把name,pwd,封装到User对象中。
下面是我的测试:

class MyDomain{

private String name;

private String pwd;

..........

}

         我想封装到 List<MyDomain> 中,list里是两个MyDomain对象,封装到 List的同时也把name和pwd两个属性也封装到MyDomain对象中,见下图中 上半部分图。但是他的list里是两个LinkedHasnMap,name和pwd两个属性没有封装到MyDomain对象中,见图下半部分1,不是我想要的list里是两个MyDomain对象。谁有好的办法可以发给我。。。。。。。



二:我的方案解决方案

2.1 方案一

我最常用的解决方案是RequestParam,直接提交表单

jsp页面

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <form .....method="post"..............>  
  2. 姓名1:<input  type="text" name="id"   value="">  
  3. 年龄1:<input  type="text" name="age"   value="">  
  4. 地址1:<input  type="text" name="address"   value="">  
  5.   
  6. 姓名2:<input  type="text" name="id"   value="">  
  7. 年龄2:<input  type="text" name="age"   value="">  
  8. 地址2:<input  type="text" name="address"   value=""><pre code_snippet_id="1597573" snippet_file_name="blog_20160304_1_2164278" name="code" class="html"></form>  

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.          controller  
  2.         @RequestMapping("/...........")  
  3.     public String update(Export export,     @RequestParam("id")String[] ids,  
  4.                                                 @RequestParam("age")String[] ages,  
  5.                                                 @RequestParam("address")String[] address,  
  6.                                                 Model model){  
  7. //ids,ages,addres接收进来的是什么样的数据呢?  
  8. //接收的数据类型是ids[111,222,333],ages[222,333,444],address[sss,ddd,yyy]  
  9. //拓展:若用@RequestParam("id")String ids接收,则传进来的是一个个String字符串,用逗号分隔。例如ids:“abc,cde,def”  
  10.   
  11. //批量增加  
  12. for(int i=0,len=ids.length;i<len;i++){  
  13.               
  14.                 User user=new User();  
  15.                 user.setId(ids[i]);  
  16.                 user.setAge(ages[i]);  
  17.                 user.setAddress(address[i]);  
  18.                                   
  19.                 userDao.isnert(user);         
  20.             }  
  21. }  
  22. 这种方案适合特别修改删除,而且相比用js拼接数据有个好处,不用在前端拼接参数。  

2.2 方案二

       由于后台不能接收数组,所以要想办法让后台接收数组,这样就陷入了困境。这里可以转换下思路,
为什么非要让后台接收数组呢?可以把数组序列化成Json字符串提交,后台springmvc里用@ RequestBody  String 方式接收,然后把这个接收到的json串用json工具转换为数组,这样就解决了springmvc不能绑定对象数组的问题了。 为什么用和json相关的解决方案呢?因为现在json和java对象的转换的工具特别多,也特别方便,而且网上有很多成熟的工具,jackson,Gson,fastjson.......等等,所以用和json相关的解决方案。
因为jackson,引入jar少。所以我这里用了jackson处理。不会jackson的可以参考点我:我是外链点我:我是外链

js:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var users = JSON.stringify([    
  2.             {name: "wabiaozai1", pwd: "123"},    
  3.             {name: "wabiaozai2", pwd: "123"}    
  4.         ]);  
  5.   
  6.         $.ajax({    
  7.             type: "post",   
  8.             url: "/wabiaozai",   
  9.             data:users ,    
  10.             contentType: "application/json; charset=utf-8",    
  11.             dataType: "json",    
  12.             success: function (response, ifo) {    
  13.                 alert("success");    
  14.             }, error: function () {    
  15.                 alert("error");    
  16.             }    
  17.         })        

js中注意两个细节:

dataType:'json',//预期的服务器响应的数据类型。

contentType: "application/json; charset=utf-8",//发送数据到服务器时所使用的内容类型。默认是:"application/x-www-form-urlencoded"。
关于ajax分享两篇文章:jquery_ajax: 点我:我是外链 ajax: 点我:我是外链
如果不加contentType,myDomain接收的数据为类似%7B%22id%22%3A243%2C%name%22%3A4%2C%22age%22%3A1048%2C%22格式,json转换会报错,

controller层

我这里用的@requestBody,是否可以用其他的我没有测试。
[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @RequestMapping(value = "/wabiaozai"method = RequestMethod.POST)    
  2.     public  void myDomain(HttpServletRequest request, @RequestBody String myDomain) throws Exception{  
  3.           
  4.         ObjectMapper objectMapper = new ObjectMapper();  
  5.         JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, MyDomain.class);  
  6.         List<MyDomain> list = objectMapper.readValue(myDomain, javaType);  
  7.       
  8.         System.out.println("");    
  9.     }    

         这里提一点@RequestBody的相关知识,该注解用来处理Content-Type编码方式: 一般不是适用于application/x-www-form-urlencoded编码的内容,而是适用于application/json, application/xml等;它是通过使用HandlerAdapter 配置的HttpMessageConverters来解析post data body,然后绑定到相应的bean上的。因为配置有FormHttpMessageConverter,所以也可以用来处理 application/x-www-form-urlencoded的内容,处理完的结果放在一个MultiValueMap<String, String>里,这种情况在某些特殊需求下使用,详情查看FormHttpMessageConverter api;更多介绍见: 点击打开链接
三:debug看结果

ok,代码写完了,我们debug一下看结果:



用json转换:不会jackson的可以参考http://www.blogjava.net/bolo/archive/2014/04/16/412533.html



..............................................................................................呵呵,成功..............................................................................................

四:思考

这个是在前端拼接组合的users,

var users = JSON.stringify([  
            {name: "wabiaozai1", pwd: "123"},  
            {name: "wabiaozai2", pwd: "123"}  
        ]);

有没有办法不要拼?我要告诉你

http://blog.csdn.net/lutinghuan/article/details/46820023 里面的第4种方法:将表单对象序列化成Json字符串提交,以List接收 ,把对象转换成json数组,我已经测试过,也成功转换,但究竟有bug吗暂时未知

五:写在最后

20160427重新排版.

20160428重新配图.

有真的不要组合对象传递参数的吗?

欲知后事如何请听下回分解。。。。。。。。。。。

我博客所有文章目录:http://blog.csdn.net/wabiaozia?viewmode=contents 

转载标明链接:http://blog.csdn.net/wabiaozia/article/details/50803581 


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值