您的位置:首页 > 编程语言 > Java开发

Struts2 + Ajax 乱码问题

2013-05-07 00:11 393 查看
近来,在开始做的NewsMS系统中,要整合Ajax,却发觉问题多多。最烦人的是中文乱码问题。以前,在纯Struts2+JSP时,是没有问题的,而一旦加入Ajax就不一样了(我用的JS库是Jquery)。弄了很长一段时间,还是解决不了。到网上找,有许多文章介绍的方法是:在Ajax中encode一次,而在服务器端decode一次,有的还夸张,要通过双重encode和decode来解决中文提交问题。这样方法应该可以解决问题的,但如果提交的表单字段比较多时,那不是要encode和decode许多次,那可能会使人崩溃掉。

我的测试例子是表单提交的例子,分两种方案:一种是JSP直接提交给Struts,一种是JSP通过Ajax提交给Struts。

在看本文前,大家应该知道的处理中文乱问题的方法:

在Struts.xml中配置:


<constant name="struts.i18n.encoding" value="GBK"/> 当然,我们过去也习惯设置JSP页面的编码为:




<%

@ page language="java"
contentType="text/html; charset=GBK"


pageEncoding="GBK"%>




<meta http-equiv="Content-Type" content="text/html; charset=GBK"> 当然上面的GBK也可以是GB18030,GB2312。

我们暂且把上面的两种的编码设置称为Struts端编码设置和JSP端编码设置。我们来开始我们的探索和测试吧!


1、Struts+JSP时,


Struts设置成GBK,而而JSP端设置成GBK,GB2312,GB18030 --> 没问题


Struts设置成GBK,而而JSP端设置成UTF-8 --> 乱码


Struts设置成UTF-8,而JSP端设置成GBK,GB2312,GB18030 --> 乱码


Struts设置成UTF-8,而JSP设置成UTF-8 -->没问题


2、Struts+Ajax+JSP时,


Struts设置成GBK,而而JSP设置成GBK,GB2312,GB18030 --> 乱码


Struts设置成GBK,而而JSP设置成UTF-8 -->乱码


Struts设置成UTF-8,而JSP端GBK,GB2312,GB18030 --> 没问题


Struts设置成UTF-8,而JSP设置成UTF-8 -->没问题
看看我们的测试结果,想想,得出结论:

结论一、如果Struts端设置为GBK,则它要求传进去的内容编码一定要是GBK或其它的国标编码;如果Struts端设置为UTF-8,则它也一定要求传进去的是UTF-8。

结论二、JSP直接传给Struts和JSP通过Ajax传给Struts是不同的,Ajax的post方法(不推荐用get方法)默认传送的编码方式是UTF-8,而JS能自动把客户端的GB系列的编码转成UTF-8再发送(IE中是这样,其它浏览器不清楚)。这样一来,最终传给Struts端一定是UTF-8,而如果Struts端设置成GBK或其它的GB编码的话,就会出现乱码。

所以,比较合理的编码设置是:Struts端和JSP端都统一设置成UTF-8。这对于Struts+JSP的整合方案和Struts+Ajax+JSP的整合方案都适用。近来,在开始做的NewsMS系统中,要整合Ajax,却发觉问题多多。最烦人的是中文乱码问题。以前,在纯Struts2+JSP时,是没有问题的,而一旦加入Ajax就不一样了(我用的JS库是Jquery)。弄了很长一段时间,还是解决不了。到网上找,有许多文章介绍的方法是:在Ajax中encode一次,而在服务器端decode一次,有的还夸张,要通过双重encode和decode来解决中文提交问题。这样方法应该可以解决问题的,但如果提交的表单字段比较多时,那不是要encode和decode许多次,那可能会使人崩溃掉。

我的测试例子是表单提交的例子,分两种方案:一种是JSP直接提交给Struts,一种是JSP通过Ajax提交给Struts。

在看本文前,大家应该知道的处理中文乱问题的方法:

在Struts.xml中配置:


<constant name="struts.i18n.encoding" value="GBK"/> 当然,我们过去也习惯设置JSP页面的编码为:




<%

@ page language="java"
contentType="text/html; charset=GBK"


pageEncoding="GBK"%>




<meta http-equiv="Content-Type" content="text/html; charset=GBK"> 当然上面的GBK也可以是GB18030,GB2312。

我们暂且把上面的两种的编码设置称为Struts端编码设置和JSP端编码设置。我们来开始我们的探索和测试吧!


1、Struts+JSP时,


Struts设置成GBK,而而JSP端设置成GBK,GB2312,GB18030 --> 没问题


Struts设置成GBK,而而JSP端设置成UTF-8 --> 乱码


Struts设置成UTF-8,而JSP端设置成GBK,GB2312,GB18030 --> 乱码


Struts设置成UTF-8,而JSP设置成UTF-8 -->没问题


2、Struts+Ajax+JSP时,


Struts设置成GBK,而而JSP设置成GBK,GB2312,GB18030 --> 乱码


Struts设置成GBK,而而JSP设置成UTF-8 -->乱码


Struts设置成UTF-8,而JSP端GBK,GB2312,GB18030 --> 没问题


Struts设置成UTF-8,而JSP设置成UTF-8 -->没问题

看看我们的测试结果,想想,得出结论:

结论一、如果Struts端设置为GBK,则它要求传进去的内容编码一定要是GBK或其它的国标编码;如果Struts端设置为UTF-8,则它也一定要求传进去的是UTF-8。

结论二、JSP直接传给Struts和JSP通过Ajax传给Struts是不同的,Ajax的post方法(不推荐用get方法)默认传送的编码方式是UTF-8,而JS能自动把客户端的GB系列的编码转成UTF-8再发送(IE中是这样,其它浏览器不清楚)。这样一来,最终传给Struts端一定是UTF-8,而如果Struts端设置成GBK或其它的GB编码的话,就会出现乱码。

所以,比较合理的编码设置是:Struts端和JSP端都统一设置成UTF-8。这对于Struts+JSP的整合方案和Struts+Ajax+JSP的整合方案都适用。
http://penghuaiyi.iteye.com/blog/470325
Java代码


/**
* 使用ajax检查用户是否存在
*/
public void checkUser(){

try{
System.out.println("userName="+user.getUserName());
HttpServletResponse response=ServletActionContext.getResponse();
response.setContentType("text/xml;charset=utf-8");
response.setHeader("Cache-Control", "no-cache");

PrintWriter pw=response.getWriter(); //输出中文,这一句一定要放到response.setContentType("text/xml;charset=utf-8"), response.setHeader("Cache-Control", "no-cache")后面,否则中文返回到页面是乱码

if(existUser.contains(user.getUserName()))
{
pw.print("存在");
}else{
pw.print("不存在");
}

pw.close();
}catch(IOException e){
e.printStackTrace();
}
}

只有在Action里调用
public class Encoding
{
public String Convert(String s) throws UnsupportedEncodingException{
String result;
byte[] temp =null ;

try
{
temp = s.getBytes("iso-8859-1");
} catch (UnsupportedEncodingException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
result = new String(temp,"utf-8");

return result;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: