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头像

分享到:

最近浏览
暂无贡献等级
maguiyi2月16日
暂无贡献等级
maniheim2月14日
最代码贡献等级说明
zhangfa2月11日
最代码贡献等级说明
发哥1234562月11日
暂无贡献等级
hpoick2月11日
暂无贡献等级
lsy10729151212月11日
最代码贡献等级说明
mrliu892月10日
暂无贡献等级
han1082月9日
最代码贡献等级说明
a10487331802月9日
最代码贡献等级说明
zhos02122月9日
最代码贡献等级说明
ITfans2月9日
最代码贡献等级说明
心印语2月9日
最代码贡献等级说明
yzh1234562月9日
最代码贡献等级说明
4382657642月8日
最代码贡献等级说明
132769914212月8日
最代码贡献等级说明
zhangweiq2月7日
暂无贡献等级
nsq00062月7日
最代码贡献等级说明
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友