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

来源:互联网 发布:数据对门店的重要性 编辑:程序博客网 时间:2024/06/05 20:36

在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 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子感冒鼻子塞怎么办 月子里感冒了怎么办 宝宝感冒鼻塞严重怎么办 婴幼儿鼻塞有痰怎么办 感冒了浑身没劲怎么办 四个月宝宝鼻塞怎么办 四个月小孩鼻塞怎么办 小儿流清水鼻涕怎么办 小孩总是流鼻子怎么办 四个月小孩咳嗽怎么办 儿童流清水鼻涕怎么办 四个月婴儿发烧怎么办 宝宝体温36度怎么办 儿童感冒后鼻塞怎么办 儿童没感冒鼻塞怎么办 宝宝鼻塞怎么办3岁 儿童刚开始感冒鼻塞怎么办 婴儿感冒打喷嚏流鼻涕怎么办 宝宝感冒鼻涕多怎么办 一个多月的宝宝鼻塞怎么办 五个月宝宝鼻塞怎么办 4个月大婴儿鼻塞怎么办 四个月婴儿鼻塞怎么办 鼻炎晚上睡觉鼻塞怎么办 感冒了一直流鼻涕怎么办 感冒了鼻塞严重怎么办 两边鼻子都塞怎么办 感冒睡觉鼻子堵怎么办 孩子鼻炎流清水怎么办 小儿鼻涕流不停怎么办 老是单侧流鼻涕怎么办 有鼻炎光流鼻涕怎么办 一只鼻塞流鼻涕怎么办 鼻子总痒流鼻涕怎么办 鼻子总是痒流鼻涕怎么办 感冒后老流鼻涕怎么办 鼻炎犯了鼻塞怎么办 鼻炎鼻塞鼻涕多怎么办 猪鼻塞怎么办速效办法 感冒难受怎么办小窍门 来月经上火了怎么办