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。結果亂碼。後來才發現是頁面重複設定字元集了。