struts2接受ajax请求,jquery+struts2发送ajax请求中文参数问题的解决

前段时间写一个页面要使用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

是否使用传统的方式浅层序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值