背景介绍
前端页面为HTML, 后端为Spring
html中根据多选框的值,使用ajax请求接口动态加载其他元素的选项值。
代码
// select 下拉多选框的值
var idCardType = $("#idCardType").val();
// ['2075', '2077', '2078']
$.ajax({
url : url,
type : "post",
dataType : "json",
traditional: true,
data : {
"idCardType" : idCardType
},
success : function(data) {
},
error : function() {
showMessage("获取部门信息失败,请重试!");
}
});
接口:
@RequestMapping("/url")
@ResponseBody
public JSONArray getTreeDataByUser(String idCardType) {
JSONArray array = new JSONArray();
System.out.println("idCardType:" + idCardType);
// idCardType:2075,2077,2078
return array;
}
总结
traditional:是否使用传统的方式浅层序列化。
数组或jQuery对象会按照name/value对进行序列化,普通对象按照key/value对进行序列化。
通过ajax提交数组时,会自动在所设定的参数后面增加中括号:“[]”,导致后端spring MVC中的@RequestParam获取不到参数。
解决方法:
ajax请求时增加:traditional: true 就可以正常提交了。原因如下:
jQuery会调用jQuery.param序列化参数,jQuery.param( obj, traditional ),默认的话,traditional为false,即jquery会深度序列化参数对象,以适应如PHP和Ruby on Rails框架,但servelt api无法处理,我们可以通过设置traditional 为true阻止深度序列化。
如果不加 traditional: true
加上 traditional: true