问题收集:ajax从前台向后台传数组问题.

//批量删除
	$('body').on("click", "#deleteBatch", function () {
		var cbs = $(".cbs");
		var cbsArr = new Array();
		for(var i=0; i<cbs.length; i++){
			if($(cbs[i]).prop("checked")){
				var q = $(cbs[i]).parent().parent().children();
				q = Number($(q[q.length-1]).html());
				cbsArr.push(q);
			}
		}
		cbsArr = toString(cbsArr);
		console.log(cbsArr);
		
		$.ajax({
			url:'NewsDeleteBatchServlet',
			type:'post',
			async:true,
			//ajax的traditional属性
			//traditional:true,
			data:{
				cbsArr:cbsArr
			},
			success:function(){
				//window.location.replace('NewsTablePage.jsp');
			}
		})
	})

通过勾选复选框,获取参数,进行批量操作.

jq获取的是集合或者数组,通过ajax传递到后台,后台使用 req.getParameter( )   去接收这个参数,结果发现无法获取,得到的是 null.

经过在网络上搜索之后,发现了 解决方法:

方案一: ajax的data属性要为String格式,我们可以先把代码中的cbsArr先改为String类型,然后再往后传参数.可以仿照JAVA中的Arrays.toString()来写一个.也就是:

function toString(arr){
	var b = '';
	for(var i = 0 ; i < arr.length ;i++){
		if(arr[i] != null){
			b = b +"'"+ arr[i] +"'";
			if( i == arr.length-1){
				return b;
			}
			b = b + ',';
		}
	}
}

这样,后台就可以得到了数据了

方案二: 我们可以为ajax添加一个traditional:true 属性.

traditional:true

查询这个属性得知,这个属性默认是false,jquery会深度序列化这个对象,以适应PHP等框架,我们可以通过设置tradtional为true阻止深度序列化

设置traditional属性后,data就可以传递集合或数组的类型了.后台要通过

String[] arrs = req.getParameterValues("cbsArr");

getParameterValues来接收数组或集合参数.

这样以后碰到复选框传多个id的时候就不用前台拼后台spilt了或者toString了,直接用ajax的traditional属性,传过去一个数组,后台直接一个List<Long> idList接受即可。非常方便。

猜你喜欢

转载自blog.csdn.net/u33445687/article/details/80535331