数组类型参数传递:
若一个请求中包含多个值,如:(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()方法获取到数据,否则会解析出错。