kangyongh的gravatar头像
kangyongh2018-01-31 19:09:23
Spring MVC中传list和map

首先申明,写此博客,是为了以防我之后忘记,所以作为记录使用,喜欢勿喷。

   前提:  由于在做银企直连项目的时候,只有一个工具来发送和接收返回报文,在开发人员开发是,使用main方法来测试,那么在移交到测试组测试的时候就没法测试,很困难。在行方提议下,我使用SpringMVC+mybaties开发一个测试的应用web,以方便测试使用,在项目进行时,需要提交from表单数据到后台,组装成相应的报文,发送到目标系统,这是就遇到一个问题,不关需要表单中的输入数据,同时表当中还需要提交list,相信大家都知道SpringMVC中是不支持直接提交list集合的,直接使用<input name="list[index].XXX" value="">就行不通,提交过去的数据类似于list[0].xxx=value,这样是无法使用list来接收,也不好转化成list集合,这时,就会想,既然不支持list和map,支持对象,我们定义一个对象,属性值定义list集合,再给属性赋值不就可以了吗?得到进一步的想法后,开始写代码,定义对象

public class CommList {
    private List<Map<String, String>> list;

    public List<Map<String, String>> getList() {
        return list;
    }

public void setList(List<Map<String, String>> list) {

        this.list = list;
    }
  }

使用form提交,如果只有自定义的list属性,能够提提交过去,其余的值就不行,此方法不满足需求,需要不但是表单中其他输入框的值,那么改用ajaxt交,首先系列化表单, var data=$("#submitFrm").serialize();并将list组装好,var list = new Array();  

                  for(var i=0;i<$("#BillList").find("tr").length;i++){
                       if($("#billMoney"+i).val()!="" && parseFloat($("#billMoney"+i).val())){
                            list.push({"billMoney":$("#billMoney"+i).val()});   
                            list.push({"billNum":1});   
                       }
                   }

通过data:{data:data;list:list}提交,这时,data有值,list也有值,注意到 这时,系列化的表单是一个字符串,request.getParameter()就拿不到任何值,那就和共用拼报文的方法需要拿到name来生成xml节点不相符,又不能改方法,那么这个方法就行不通,pass。百度,然鹅,并没有卵用,没有找打类似的情况,怎么办,这时就只能找大神帮忙啊,大神也是同样的思路,都不行。经过分析 ,js定义一个对象obj,将list组装的数据给obj,即 obj.list=list,同时再把系列化后的表单中的数据也同样通过遍历,给对象obj,即              $.each(data,function(item){
                      obj[data[item].name]=data[item].value;
                  });

这时候在使用,ajax提交, $.ajax({  
                       type: "POST",  
                       dataType: 'json',  
                           url:"xxx"
                       data:obj, 

............................

} 见证奇迹,断点一看,list有值,激动,那request.getParameter()如果有值,此方法就成功,赶紧获取里面的值看看,我去!既然真拿到了,这样list传过去了,同时表单中的数据通过request.getParameter()也那拿到了,那问题就解决了,这时就想,如果不需要将遍历的表单数据都赋值给obj,而是放到map中,再把map给obj,已同样的方式提交,这样就可以满足以后无论是使用list,还是map都可以提交,不用再去管Parameter中有没有值,修改

public class CommList {
    private List<Map<String, String>> list;
    private Map<String, String> map;
    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

public List<Map<String, String>> getList() {

        return list;
    }

    public void setList(List<Map<String, String>> list) {
        this.list = list;
    }
  } 经过测试 ,成功通过。

希望 能帮我通过一下,不是说可以帮到一些人,希望自己以后忘记能够找到看的地方。谢谢!


打赏

已有1人打赏

最代码官方的gravatar头像

分享到:

最近浏览
badboy1979 LV108月13日
月亮月亮星星星星
ssmtest LV18月7日
星星
二十八画 LV56月26日
月亮星星
yangfeng666 LV66月19日
月亮星星星星
暂无贡献等级
luowenchao LV26月2日
星星星星
Luis虎子 LV145月25日
月亮月亮月亮星星星星
liangxiang LV55月23日
月亮星星
bondon1 LV35月22日
星星星星星星
渐行渐远66 LV25月18日
星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友