前段时间写一个页面要使用ajax提交一个中文参数,在后台得到数组,环境是jquery+struts2+Tomcat6
当然可以使用拼接url参数串实现,"?values='小王'&values='小张'",后台得到是乱码,需要重新编码,
for(int i=0;
i< this.getValues().length; i++){
values[i] = new
String((this.getValues())[i].getBytes("ISO-8859-1"), "GBK");
this.value += values[i]+",";
}
还有没有跟好的办法呢。发送post请求,struts2可以将其自动编码为pageEncoding指定的编码集。
那么使用jquery的$.post();方法,但是怎么拼接json参数串呢,呵呵,这就是我要介绍的。
呵呵,当然是调用大名鼎鼎的eval函数(这个函数真是强大啊,不仅可以将字符串解析为js代码执行,而且可以将字符串转换为json)。
那么还等什么,先动手做个简单的测试吧
eval_r('({values:["小王",'"小张,""小李"]})') ; //这里我们直接将模拟结果的字符串作为输入,注意:json字符串要用"()"包围。
注:json字符串必须用'()'包围,'[]'表示values是数组值,共有“小王”,“小张”,“小李”三个值。
好了,闲话不多说,继续我们的事业吧...
向后台post参数,不出所聊,发送请求后后台包了一个OgnlException,说是包含了非法字符。不急,原来在发送数组参数前要先将其编码,否则struts2不识别。幸好jquery已经为我们写好了$.param(jsonObject,boolean)方法。第一个参数是一个键值对对象,可以是Array,Map,Jquery,json。第二个参数指明是否深度递归对象。
我将这个方法写成一个工具函数,参数为Array类型,返回值为ajax所需的json参数。
function
evalData(array){
var values =
"({'values':[";
for(i=0;
i
values += "'"+array[i]+"',";
}
values = values.substring(0 , values.length-1)+
"]})";
var json = $.param(eval_r(values), true);
//序列化参数值
/// eval中传的输入值为 ({'values':['1','2','3']}) return json;
}
然后再发送
var param = evalData(array);
//alert(jsonVal);
$.post(
"/projec/package/act.action?frameName="+frameName,
param ,
function(data){
parent.frames[frameName].fillValue(data.value); //
TODO:将选择的值填充到父窗口的文本框
},
"json"
);
// ajax 方法中对应的是写成 data:param就好
//
大家只需要关注param,它是我们需要包装的中文参数。evalData是我上面定义的函数,主要调用了eval方法。将传入的数组包装成编码的参数。大家可以直接拷贝后修改使用。
参考:摘自javascript API
eval 方法
检查 JScript 代码并执行.
eval_r(codeString)
必选项 codestring 参数是包含有效 JScript 代码的字符串值。这个字符串将由 JScript
分析器进行分析和执行。
说明
eval 函数允许 JScript 源代码的动态执行。例如,下面的代码创建了一个包含 Date
对象的新变量 mydate :
eval("var mydate = new Date();");
传递给 eval 方法的代码执行时的上下文和调用 eval 方法的一样.
参考:摘自Jquery 中文API1.4.4
jQuery.param(obj,
[traditional])
概述
将表单元素数组或者对象序列化。是.serialize()的核心方法。
在jQuery
1.3中,如果传递的参数是一个函数,那么用.param()会得到这个函数的返回值,而不是把这个函数作为一个字符串来返回。
在jQuery 1.4中,.param()会深度递归一个对象来满足现在脚本语言和框架,比如PHP, Ruby on
Rails等。你可以通过jQuery.ajaxSettings.traditional = true; 来全局得禁用这个功能。
注意:因为有些框架在解析序列化数字的时候能力有限,所以当传递一些含有嵌套对象、数组的对象作为参数时,请务必小心!
在jQuery 1.4中,HTML5的input元素也会被序列化。
参数
objArray,
jQuery, Object
数组或jQuery对象会按照name/value对进行序列化,普通对象按照key/value对进行序列化。
traditional
(可选)Boolean
是否使用传统的方式浅层序列化。