1. 程式人生 > >Struts2亂碼終極解決辦法

Struts2亂碼終極解決辦法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

這個暑假一直在做有關Struts2的相關開發,可是亂碼問題一直出現,也一直沒在意。。。今天閒來有空,總結一下,希望以後亂碼問題不要再出現

  先把以往需要設定的點羅列一下:
  1. JSP 檔案頭    
  2. struts.properties中的編碼設定
  struts.locale = UTF-8
        struts.i18n.encoding=utf-8
  3. Resource的native2ascii 轉碼
  通常這些搞定就能解決編碼問題了。
  再過一點在web.xml裡面配置一個編碼的filter:   
  struts-cleanup
  
  org.apache.struts2.dispatcher.ActionContextCleanUp   
  
  struts-cleanup
  /*

 

幾種常見的亂碼問題

 
 
 
1. 在struts2裡面,最好將所有字元都設成utf-8。 <%@ page contentType="text/html; charset=UTF-8"%> <%@ page pageEncoding="UTF-8" %>1.1 在jsp頁面設定字元編碼。這邊有必有說明的是如果是jsp+java bean+servlet的方案,中文亂碼很好解決,統一設成gb2312就可以了。 1.2 使用struts框架字符集不能設成gb2312,要改成utf-8。
 2. 在struts.properties 新增:
struts.devMode=false struts.enable.DynamicMethodInvocation=true struts.i18n.reload=true struts.ui.theme=simple
struts.locale=zh_CN struts.i18n.encoding=UTF-8
struts.serve.static.browserCache=false struts.url.includeParams=none
其中locale、encoding就是字符集的設定了。
  3. 在web.xml加個filter
  <!-- zh-cn encoding --> <filter> <filter-name>struts-cleanup</filter-name> <filter-class> org.apache.struts2.dispatcher.ActionContextCleanUp </filter-class> </filter> <filter-mapping> <filter-name>struts-cleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 
  跟上述方法,類似還有在action中設定字元編符.
  HttpServletResponse response = null; response = ServletActionContext.getResponse(); request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");


  通過上述方法,基本就可以搞定中文亂碼的問題了。當然,也有例外(如web server的版本\資料庫的版本等等)。象在我的一個專案碰到一箇中文亂碼,tomcate5.5是會亂碼的,而在tomcate6中就不會。這邊就涉及到tomcate connector字元的設定了。
  <Connector port="80" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />

--------------------------------------------------------------------
後記之一:在使用struts2時,仍是遇到一種亂碼。後來除錯才發現,struts2的web.xml配置是有順序的。
  在web.xml中EncodingFilter的位置應該在Struts2的FilterDispatcher之前,因為要先調整字符集,然後進入Action。
按照Struts2的API,filter的順序是 struts-cleanup filter SiteMesh filter FilterDispatcher
--------------------------------------------------------------------
  後記之二:這個方法是下下策了,只有在前面的方法都無效時才使用。
在action中直接使用request.getParameter()時;還是出現亂碼。原因分析如下:
  1、getParameter()是有帶字元引數的。例:
String s = (String)request.getParameter("txt").getBytes("iso-8859-1");
  2、String也可以帶有字元引數。
String(byte[] bytes, String charsetName) 構造一個新的 String,方法是使用指定的字符集解碼指定的位元組陣列。
例:String s = new String("中文","utf-8");
  3、綜合上述兩點,編寫一個類來完成此項任務
  public class ConvertCharacter{
  public String Convert(String s){
  String result;
  byte[] temp ;
  try{
  temp = s.getBytes("iso-8859-1");
  result = new String(temp,"utf-8");
  }
  return result;
  }
  }

request.getParameter亂碼的問題
方法一:
通過設定tomcat的配置檔案server.xml
Connector port="8080" maxHttpHeaderSize="8192"
  maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  enableLookups="false" redirectPort="8443" acceptCount="100"
  connectionTimeout="20000" disableUploadTimeout="true" uRIEncoding="gbk"/>

方法二:
1: String id=new String(request.getParameter("id").getBytes("ISO8859-1"),"UTF-8");

 

 

 

總結:

問題:jsp中設定編碼為gbk,用struts2的form表單提交中文出現亂碼
原因:struts2預設提交的字元編碼是utf-8,與gbk不一致!
解決辦法:1.在struts.xml或是struts.properties檔案中講struts.i18n.encoding設定為gbk,一切就ok了!

                    2.把jsp檔案<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>的pageEncoding設定為UTF-8

 

 

JAVA 中URL連結中文引數亂碼的若干處理方法,現在整理收錄如下:

方法一:

http://xxx.do?ptname='我是中國人'

String strPtname = request.getParameter("ptname");

strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");  

方法二:

<%@ page contentType="text/html;charset=gb2312" %>

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("編碼的是這裡","GB2312")%>">點選這裡</a>

<%

//request.setCharacterEncoding("GBK");

if(request.getParameter("url")!=null)

{

str=request.getParameter("url");

str=java.net.URLDecoder.decode(str,"GB2312");

str=new String(str.getBytes("ISO-8859-1"));

out.print(str);

}

%>

==================================

public String chinatoString(String str)

     {

      String s=str;

      try

      {

       byte tempB[]=s.getBytes("ISO-8859-1");

       s=new String(tempB);

       return s;

      }

      catch(Exception e)

      {

       return s;

      }

    }

====================================================

function URLencode(sStr)

    {

      return escape(sStr).

               replace(/\+/g, '%2B').

                  replace(/\"/g,'%22').

                     replace(/\'/g, '%27').

                       replace(/\//g,'%2F');

    }

方法三:

如果用jstl的話,可以自己寫一個el的function,呼叫URLEncoder.encode來編碼。

IE預設對URL後面的引數是不編碼傳送的,但是tomat預設是按ISO8859-1來進行URL解碼,因此才會出現上述錯誤。好的做法是:

1、在URL引數中確保用UTF-8編碼之,方法可以用js函式encodeURI(),或呼叫自定義的el function;

2、設定server.xml中的Connector熟悉URIEncoding="UTF-8",確保解碼格式與編碼格式統一;

方法四:

<script>

for(var i=0;i<document.links.length;i++){

document.links[i].href=encodeURI(document.links[i].href);

}

</script>

在action中,String s=request.getParameter("s");

s=new String(s.getBytes("iso-8859-1"),"gbk");

1在struts2裡面,最好將所有字元都設成utf-8。

  1.1 在jsp頁面設定字元編碼。這邊有必有說明的是如果是jsp+java bean+servlet的方案。中文亂碼很好解決,統一設成gb2312就可以了。但如果用struts框架就不能設成gb2312,要改成utf-8。

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ page pageEncoding="UTF-8" %>

 2.2 在struts.properties 新增:

struts.devMode=false

struts.enable.DynamicMethodInvocation=true

struts.i18n.reload=true

struts.ui.theme=simple

struts.locale=zh_CN

struts.i18n.encoding=UTF-8

struts.serve.static.browserCache=false

struts.url.includeParams=none

其中locale、encoding就是字符集的設定了。

  2.3 在web.xml加個filter

如下:

  <!-- zh-cn encoding -->

    <filter>

        <filter-name>struts-cleanup</filter-name>

        <filter-class>

            org.apache.struts2.dispatcher.ActionContextCleanUp

        </filter-class>

    </filter>  

    <filter-mapping>

        <filter-name>struts-cleanup</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping> 

 通過上述方法,基本就可以搞定中文亂碼的問題了。當然,也有例外。象在我的一個專案碰到一箇中文亂碼,就是從頁面跳轉到另一個頁面,然後update進mysql。結果亂碼。後來才發現是頁面重複設定字元集了。

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述