Struts2 + Ajax 乱码问题

近来,在开始做的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代码   收藏代码
  1. /** 
  2.  * 使用ajax检查用户是否存在 
  3.  */  
  4. public void checkUser(){  
  5.   
  6.     try{  
  7.         System.out.println("userName="+user.getUserName());  
  8.         HttpServletResponse response=ServletActionContext.getResponse();  
  9.         response.setContentType("text/xml;charset=utf-8");  
  10.         response.setHeader("Cache-Control""no-cache");  
  11.        
  12.         PrintWriter pw=response.getWriter(); //输出中文,这一句一定要放到response.setContentType("text/xml;charset=utf-8"),  response.setHeader("Cache-Control", "no-cache")后面,否则中文返回到页面是乱码  
  13.         
  14.         if(existUser.contains(user.getUserName()))  
  15.         {  
  16.             pw.print("存在");  
  17.         }else{  
  18.             pw.print("不存在");  
  19.         }  
  20.        
  21.         pw.close();  
  22.     }catch(IOException e){  
  23.         e.printStackTrace();  
  24.     }  


只有在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;
		  }

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值