jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误
2011-12-17 19:32
1001 查看
前几天回家了一趟,唉,回家的感觉真爽。
不多废话,jQuery在发送ajax请求时,如果请求的参数里有数组对象,后台的Struts2在用List作为接收对象的时候,会报OGNL错误:
ognl.ExpressionSyntaxException: Malformed OGNL expression: arrayList[] [ognl.ParseException: Encountered " "]" "] "" at line xx, column xx.
放狗搜到一篇相关的文章:http://www.cnblogs.com/tanhao/archive/2011/06/22/2086513.html,在数组参数的外层套一个$.param()函数即可,例子如下:
这样处理之后,后台Struts2就可以正确地去List去存储这个数组了。
================================如果你只为寻找答案,那么只到这里就可以了[b][b]================================[/b][/b]
下面深究一下:
经过查看源代码,jQuery在处理ajax请求的data时,如果直接传递非string类型的数据给它(包括object,array等),那么它会调用$.param()将其转换成string:
第二个参数s.traditional用来控制是否转换为传统格式,默认为false。在w3school上找到这样一段说明:
我们可以如下显示对象的查询字符串表示以及 URI 编码版本:
var myObject = {
a: {
one: 1,
two: 2,
three: 3
},
b: [1,2,3]
};
var recursiveEncoded = $.param(myObject);
var recursiveDecoded = decodeURIComponent($.param(myObject));
alert(recursiveEncoded);
alert(recursiveDecoded);
recursiveEncoded 和 recursiveDecoded 的值输出如下:
可以将 traditional 参数设置为 true,来模拟 jQuery 1.4 之前版本中 $.param() 的行为:
var myObject = {
a: {
one: 1,
two: 2,
three: 3
},
b: [1,2,3]
};
var shallowEncoded = $.param(myObject, true);
var shallowDecoded = decodeURIComponent(shallowEncoded);
alert(shallowEncoded);
alert(shallowDecoded);
recursiveEncoded 和 recursiveDecoded 的值输出如下:
可以看到,如果不加true参数,数组会被转换成b[]=1&b[]=2&b[]=3的形式,Struts2目前还不能正确解析该形式;而加true参数的所谓“传统”解析方式会把数组解析成b=1&b=2&b=3的形式,所以Struts2就可以正确解析了。
jQuery从1.4版本开始就有了如此蛋疼的解析方式(据说是为了满足PHP、RoR等后台的需要),不过幸好它还保留了原来的解析方式,对Struts2等框架最简单的解决方法就是将其ajax的traditional属性设为true即可:
不多废话,jQuery在发送ajax请求时,如果请求的参数里有数组对象,后台的Struts2在用List作为接收对象的时候,会报OGNL错误:
ognl.ExpressionSyntaxException: Malformed OGNL expression: arrayList[] [ognl.ParseException: Encountered " "]" "] "" at line xx, column xx.
放狗搜到一篇相关的文章:http://www.cnblogs.com/tanhao/archive/2011/06/22/2086513.html,在数组参数的外层套一个$.param()函数即可,例子如下:
$.ajax({ url: _this.get_detail_url, type: 'POST', data: $.param(_this.params, true), // 注意要传递第二个参数 dataType: 'json', timeout: 30000, success: function(returnData, textStatus) { // do something here }, error: function(xhr, textStatus, errorThrown) { // do something here } });
这样处理之后,后台Struts2就可以正确地去List去存储这个数组了。
================================如果你只为寻找答案,那么只到这里就可以了[b][b]================================[/b][/b]
下面深究一下:
经过查看源代码,jQuery在处理ajax请求的data时,如果直接传递非string类型的数据给它(包括object,array等),那么它会调用$.param()将其转换成string:
// Convert data if not already a string if ( s.data && s.processData && typeof s.data !== "string" ) { s.data = jQuery.param(s.data, s.traditional); }
第二个参数s.traditional用来控制是否转换为传统格式,默认为false。在w3school上找到这样一段说明:
我们可以如下显示对象的查询字符串表示以及 URI 编码版本:
var myObject = {
a: {
one: 1,
two: 2,
three: 3
},
b: [1,2,3]
};
var recursiveEncoded = $.param(myObject);
var recursiveDecoded = decodeURIComponent($.param(myObject));
alert(recursiveEncoded);
alert(recursiveDecoded);
recursiveEncoded 和 recursiveDecoded 的值输出如下:
a%5Bone%5D=1&a%5Btwo%5D=2&a%5Bthree%5D=3&b%5B%5D=1&b%5B%5D=2&b%5B%5D=3
a[one]=1&a[two]=2&a[three]=3&b[]=1&b[]=2&b[]=3
a[one]=1&a[two]=2&a[three]=3&b[]=1&b[]=2&b[]=3
可以将 traditional 参数设置为 true,来模拟 jQuery 1.4 之前版本中 $.param() 的行为:
var myObject = {
a: {
one: 1,
two: 2,
three: 3
},
b: [1,2,3]
};
var shallowEncoded = $.param(myObject, true);
var shallowDecoded = decodeURIComponent(shallowEncoded);
alert(shallowEncoded);
alert(shallowDecoded);
recursiveEncoded 和 recursiveDecoded 的值输出如下:
a=%5Bobject+Object%5D&b=1&b=2&b=3
a=[object+Object]&b=1&b=2&b=3
a=[object+Object]&b=1&b=2&b=3
可以看到,如果不加true参数,数组会被转换成b[]=1&b[]=2&b[]=3的形式,Struts2目前还不能正确解析该形式;而加true参数的所谓“传统”解析方式会把数组解析成b=1&b=2&b=3的形式,所以Struts2就可以正确解析了。
jQuery从1.4版本开始就有了如此蛋疼的解析方式(据说是为了满足PHP、RoR等后台的需要),不过幸好它还保留了原来的解析方式,对Struts2等框架最简单的解决方法就是将其ajax的traditional属性设为true即可:
jQuery.ajaxSettings.traditional = true
相关文章推荐
- jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误
- jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误
- jquery多选择动态参数的使用以及ajax异步请求中提交整个form表单中serializeArray()的使用以及后台值得获取方式
- JQuery发送ajax请求不能用数组作为参数
- Jquery发送ajax请求以及datatype参数为text/JSON方式
- Struts学习_Jquery发送ajax请求以及datatype参数为text/JSON方式
- jquery发送ajax请求,以及struts2的action响应请求并传回json数据的做法
- 前台发送 ajax 请求到后台传递数组参数
- jQuery的AJAX请求发送JSON数组参数
- Jquery发送ajax请求以及datatype参数为text/JSON方式
- jquery通过ajax向后台发送(checkbox)数组,并在后台接收,(发送的数据是checkedbox)
- struts2的验证码及利用jquery发送ajax请求并利用json做数据交换
- struts2 + ajax(从后台获取json格式的数据返回到前端,然后前端用jquery对json数据进行解析)
- MVC学习笔记之使用JQuery方式发送Ajax请求调用后台Controller
- Jquery 页面初始化常用的三种方法以及Jquery 发送ajax 请求
- jquery+ajax每秒向后台发送请求数据然后返回页面的代码
- jQuery发送ajax请求并把得到的数据存放到数组中并判断是否有某值
- Vue------第五天(Vue的Ajax请求,使用Axios,目前熟悉了一下,主要包括GET请求、POST请求、并发请求、请求参数的配置、服务器响应的结构以及对服务器响应错误的简单处理)
- struts2 当同时发送多个含有同名参数的请求时会报错
- springmvc中 ajax请求错误,返回406,并一直进入error的回调方法,以及返回参数为Object