zl程序教程

您现在的位置是:首页 >  前端

当前栏目

数组类型参数传递问题:$.ajax传递数组的traditional参数传递必须true

AJAX数组 类型 必须 传递 True 参数传递 问题
2023-09-11 14:19:55 时间

数组类型参数传递:

  若一个请求中包含多个值,如:(test.action?tid=1&tid=2&tid=3),参数都是同一个,只是指定多个值,这样请求时后台会发生解析错误,应先使用 tradititonal 格式化

$.ajax({
    type:"post",
    url:"test.action",
    data:{
        tid:[1,2,3]
    },
    traditional:true,
    ……
});

  起初我认为traditional:true,可有可无,但是后来不用traditional的时候,发现后台无法获取selectUsers的值,那么可以肯定的是traditional默认值是false。
  当提交的参数是数组( {selectUsers:[value,value,value]} ),如果是false的话,则提交时会是"selectUsers[]=value&selectUsers[]=value";如果设置成true,则提交时会是"selectUsers=value&selectUsers=value",这样后台就能用String[] ids=request.getParameterValues("selectUsers"); 获取到值
  官方文档的解释如下:traditional   类型:Boolean
  如果你想要用传统的方式来序列化数据,那么就设置为 true。(底层原理其实就是设置param()方法的traditional参数为true
  Set this to true if you wish to use the traditional style of param serialization

1、前台jquery

function deleteAll() {
    var selectUsers=new Array();
    //var selectUsers = null;
    $(":checkbox[name='userID']").each(function() {
        if ($(this).prop("checked"))
        selectUsers.push($(this).val());
        //selectUsers += "," + $(this).val();
    });

    $.ajax({
        async : false,
        traditional: true,
        type:"post",
        url:"elecUserAction_delete.do",
        data:{selectUsers:selectUsers},
        success:function(responsText){
            if(responsText=="1"){
                alert("删除成功");
            }
        }
    });
}

2、后台Action代码

public String delete(){
    String[] ids=request.getParameterValues("selectUsers");  
    System.out.println(ids.toString());
    PrintWriter out = null;
    out.write("1");
    return home();
}

总结:

  当ajax传的data数据是数组时,必须设置traditional参数,并为true,然后后台才可以通过request.getParameterValues()方法获取到数据,否则会解析出错。