jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误

前几天回家了一趟,唉,回家的感觉真爽。

不多废话,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去存储这个数组了。

================================如果你只为寻找答案,那么只到这里就可以了================================

下面深究一下:

经过查看源代码,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


可以将 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

可以看到,如果不加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

转载于:https://www.cnblogs.com/ini_always/archive/2011/12/17/2291290.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值