kangyongh的gravatar头像
kangyongh 2018-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头像
最近浏览
zhangtian1997  LV10 2022年3月23日
是一个鸽子啊  LV17 2021年7月9日
kmpanbo  LV1 2021年6月14日
水光浮藻  LV6 2021年4月29日
夜奏花  LV2 2020年2月18日
hhuangh  LV5 2019年11月21日
1248612588  LV1 2019年10月22日
y844294098  LV1 2019年8月10日
linzhu 2019年7月9日
暂无贡献等级
sky_hui  LV6 2019年7月3日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友