Struts框架下Ajax发送中文乱码问题…

来自:http://blog.zol.com.cn/434/article_433704.html

今天在使用AJAX向服务器端发送中文数据时,出现乱码,折腾了很久,在网上也找了很多解决办法,比如全站UTF-8编码、请求头编码为中文、使用javascript中的escape函数等等,但一一试过均无效。在绝望之际,找到了一篇和我的情况比较相近的文章(详见:http://blog.csdn.net/wallimn/archive/2006/11/12/1380106.aspx),在详细参考这篇文章的做法之后终于把问题解决。

现在,把自己的解决方法写出来,以便有需要的朋友不要再像我那样走弯路。


环境:WinXP + Eclipse,JSP + Struts,页面用JavaScript结合Ajax控制,页面和服务器都使用UTF-8编码。


---------------------------------------------------------------------

MyActionForm的属性:

private String nameEn = null;
private String nameSc = null;
private String nameTc = null;

---------------------------------------------------------------------

Action(MyAction) 的excute方法里面代码:


MyActionForm maForm = (MyActionForm)form;
 
// must decoding, or else it will disorderly code

// 第二个设编码参数一定要设
String strNameEn = java.net.URLDecoder.decode(maForm.getNameEn(), "UTF-8");

String strNameSc = java.net.URLDecoder.decode(maForm.getNameSc(), "UTF-8");
String strNameTc = java.net.URLDecoder.decode(maForm.getNameTc(), "UTF-8");

System.out.println("strNameEn: " + strNameEn);
System.out.println("strNameSc: " + strNameSc);
System.out.println("strNameTc: " + strNameTc);
 

---------------------------------------------------------------------

客户端代码:


<html>
<head>
<title>Test Ajax Send Chinese</title>
<script language="javascript">
<!--
var req;
function retrieveURL(url)
{
if(window.XMLHttpRequest){ // Non-IE browsers
   req = new XMLHttpRequest();
}else if (window.ActiveXObject) { // IE browsers
   req = new ActiveXObject("Microsoft.XMLHTTP");
}
if(req){
   req.onreadystatechange = callback;
   try {
    req.open("POST", url, true);
    req.setRequestHeader("CONTENT-TYPE", "application/x-www-form-urlencoded");
   } catch (e) {
    alert(e);
   }
   req.send(null);
}
}

function callback()
{
if (req.readyState == 4) { // Complete
   if (req.status == 200) { // OK response
    processMessage();
   } else {
    alert("Problem: " + req.statusText);
   }
}
}

function processMessage()
{
alert('Test OK!');
}

function trim(srcString)
{
return srcString.replace(/^\s*/,'').replace(/\s*$/,'');
}


function test()
{
if(trim(document.MyActionForm.nameEn.value)==''||
    trim(document.MyActionForm.nameSc.value)==''||
    trim(document.MyActionForm.nameTc.value)=='')
{
   alert('NO INPUT!');
   return;
}
var url = 'MyAction.do';
url += '&nameEn=' + document.MyActionForm.nameEn.value +
     '&nameSc=' + document.MyActionForm.nameSc.value +
     '&nameTc=' + document.MyActionForm.nameTc.value;

url = encodeURI(encodeURI(url)); //这里一定要执行两次encodeURI,否则Action端会提示NULL

retrieveURL(url);
}
//-->
</script>
</head>

<body>
<h2>Test Ajax Send Chinese</h2>
<hr>
<html:form action="MyAction.do">
<table>
<tr><td>Name(English) </td><td><input type="text" name="nameEn"/></td></tr>
<tr><td>Name(Simplified Chinese) </td><td><input type="text" name="nameSc"/></td></tr>
<tr><td>Name(Traditional Chinese) </td><td><input type="text" name="nameTc"/></td></tr>
<tr><td align="right"><p><input type="button" name="btnSubmit" value="Test" οnclick="test();"/></td><td>&nbsp;</td></tr>
</table>
<html:form>
</body>

</html>
 

注:

1、上面的MyAction对应你的Action,MyActionForm对应你的ActionForm

2、该方法对用“GET”(上面例子用“POST”)方法发送也有效,即javascript函数retrieveURL里面的语句:


req.open("POST", url, true);

    改成


req.open("GET", url, true);

    也行。

3、关键地方在于编码:


url = encodeURI(encodeURI(url));
    和解码:

String strNameEn = java.net.URLDecoder.decode(maForm.nameEn(), "UTF-8");

String strNameSc = java.net.URLDecoder.decode(maForm.nameSc(), "UTF-8");
String strNameTc = java.net.URLDecoder.decode(maForm.nameTc(), "UTF-8");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值