tinguo002

           

          jquery form提交時中文亂碼

          jquery form提交時中文亂碼
            博客分類:
          • java
          在使用jsp開始時,一不小心就會出現中文亂碼的情況。通常可以使用如下方法解決:
          第一種解決方法:
          從jsp到servlet統一使用utf-8編碼.全部使用utf-8編碼能省去很多麻煩,但一點不足是utf-8編碼對漢字是使用3-4個字節,會加大網絡傳輸量。
          第二種方法:
          1.jsp頁面使用GBK
          2.使用servlet過濾器設置request.setCharacterEncoding("GBK");google一下就能找到很多怎么使用過濾器轉換編碼。
          以上兩種方法能解決大部分的亂碼問題,特別是第一種方法,能解決使用ajax提交時的中文亂碼問題。如果采用第二種方法,那么在使用ajax提交表單時仍然會有中文亂碼。這是因為ajax方式提交時js使用的是utf-8的編碼,過濾器使用gbk進行轉碼就不正確了,應該使用utf-8進行轉碼。要解決這個問題,網上也有很多個版本,其中一個是我曾經采用的在客戶端使用encodeURI,然后再在服務器端進行URLDecoder.decode,這種方案在偶爾處理一下中文是可行的,但是如果頁面有大量數據錄入,那么這種方案是不可行的。有沒有好的解決方法呢?在經過新一輪的google之后,還是找到了方法。參考http://www.iteye.com/topic/157698?page=1。原理就是根據httpheader中的內容來區分是ajax方式請求還是普通的請求。在jquery1.2.6中,ajaxSettings默認設置contentType為"application/x-www-form-urlencoded",在ajax方法中設置xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");,我們只要在servlet中根據這兩個參數值來判斷是不是通過xmlhttprequest發起的請求。這里值得一提的是jquery在提交form時對參數進行了encodeURIComponent調用,參見param方法
          Java代碼 復制代碼 收藏代碼
          1. jQuery.each( a, function(){ 
          2.                 s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) ); 
          3.             }); 

          所以傳給servlet的就是utf-8編碼了,那么我們在過濾器中就必須使用utf-8進行轉碼。
          對其中的過濾器做了下修正,在IE下和chrome下,request.getContentType()的值為"application/x-www-form-urlencoded",但是在firefox下,這個值為"application/x-www-form-urlencoded; charset=UTF-8",不是很明白ff為什么會是這個值。
          filter代碼如下:
          Java代碼 復制代碼 收藏代碼
          1. package com.ajax.demo.action; 
          2.  
          3. import java.io.IOException; 
          4.  
          5. import javax.servlet.Filter; 
          6. import javax.servlet.FilterChain; 
          7. import javax.servlet.FilterConfig; 
          8. import javax.servlet.ServletException; 
          9. import javax.servlet.ServletRequest; 
          10. import javax.servlet.ServletResponse; 
          11. import javax.servlet.http.HttpServletRequest; 
          12. import javax.servlet.http.HttpServletResponse; 
          13.  
          14. public class AjaxPostFilter implements Filter { 
          15.  
          16.     private static final String IE_CONTENT_TYPE = "application/x-www-form-urlencoded"
          17.     private static final String FF_AJAX_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=UTF-8"
          18.     private static final String XMLHTTP_REQUEST = "XMLHttpRequest"
          19.     private static final String AJAX_CHARACTER_ENCODING_UTF8 = "UTF-8"
          20.  
          21.     public void destroy() { 
          22.         // TODO Auto-generated method stub 
          23.  
          24.     } 
          25.  
          26.     public void doFilter(ServletRequest servletRequest, 
          27.             ServletResponse servletResponse, FilterChain filterChain) 
          28.             throws IOException, ServletException { 
          29.         HttpServletRequest request = (HttpServletRequest) servletRequest; 
          30.         HttpServletResponse response = (HttpServletResponse) servletResponse; 
          31.         String requestedWith = request.getHeader("x-requested-with"); 
          32.         String type = request.getContentType(); 
          33.         if (XMLHTTP_REQUEST.equals(requestedWith)&& (FF_AJAX_CONTENT_TYPE.equals(type) 
          34.                 ||IE_CONTENT_TYPE.equals(type))) { 
          35.             request.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8); 
          36.             response.setCharacterEncoding(AJAX_CHARACTER_ENCODING_UTF8); 
          37. //          request.getParameterMap(); 
          38.         } 
          39.         filterChain.doFilter(request, response); 
          40.  
          41.     } 
          42.  
          43.     public void init(FilterConfig arg0) throws ServletException { 
          44.         // TODO Auto-generated method stub 
          45.  
          46.     } 
          47.  


          web.xml配置,我用的是struts
          Java代碼 復制代碼 收藏代碼
          1. <filter> 
          2.         <filter-name>ajaxEncodeFilter</filter-name> 
          3.         <filter-class>com.ajax.demo.action.AjaxPostFilter</filter-class
          4.     </filter> 
          5.     <filter-mapping> 
          6.         <filter-name>ajaxEncodeFilter</filter-name> 
          7.         <url-pattern>*.do</url-pattern> 
          8.     </filter-mapping> 
          9.     <filter-mapping> 
          10.         <filter-name>ajaxEncodeFilter</filter-name> 
          11.         <url-pattern>*.jsp</url-pattern> 
          12.     </filter-mapping> 


          這個filter應該在你的EncodeFilter之后,RoyMax說要在之前,我試了下是不行的。
          經過這樣設置之后,jsp使用gbk采用ajax提交就不會存在中文亂碼了。

          在使用chrome進行測試時,還發現chrome的一個奇怪問題,對于返回的結果,使用jquery.ajax處理
          Java代碼 復制代碼 收藏代碼
          1. success:function showResponse(responseText, statusText)  {  
          2. //這里name為input text id,如果"aa"在前,那么name的值會改為aa+返回的結果 
          3.                     $('#name').val("aa"+responseText); 
          4. //如果改成$('#name').val(responseText+"aa"),那么name的值仍然是//responseText,“aa”沒有加到后面去,不知道是什么原因 



          歡迎大家訪問我的個人網站 萌萌的IT人

          posted on 2013-03-29 08:16 一堣而安 閱讀(252) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德令哈市| 瑞安市| 屯留县| 平武县| 陆川县| 法库县| 澄城县| 怀仁县| 申扎县| 盘锦市| 桐柏县| 峨眉山市| 密山市| 杭州市| 榆树市| 锡林郭勒盟| 永修县| 逊克县| 吕梁市| 彩票| 社会| 那曲县| 神木县| 肥城市| 济阳县| 博湖县| 鹤庆县| 庆元县| 苍南县| 西畴县| 永清县| 互助| 荣成市| 西宁市| 丹阳市| 汕尾市| 达孜县| 多伦县| 恩施市| 黑水县| 宝坻区|