2種中文亂碼處理--方法和過(guò)濾器
Posted on 2008-12-15 14:46 wesley1987 閱讀(660) 評(píng)論(1) 編輯 收藏 所屬分類: struts學(xué)習(xí)項(xiàng)目一. 使用 方法調(diào)用處理中文:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
private FilterConfig config;
private String encoding;
public void destroy() {
// 銷毀配置
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 如果編碼已經(jīng)配置, 則使用該編碼.
if(this.encoding != null) {
request.setCharacterEncoding(this.encoding);
}
// 將資源鏈到下一Filter, 如果這是最后一個(gè)Filter, 則將資源鏈到目的位置.
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// 方便銷毀配置
this.config = config;
// 讀取web.xml中CharacterEncodingFilter內(nèi)的初始編碼參數(shù)
this.encoding = this.config.getInitParameter("encoding");
}
2 在web.xml中 根節(jié)點(diǎn)下加入
使用過(guò)濾器 可謂是一勞永逸,所有頁(yè)面表單是POST的請(qǐng)求,即所有struts中的Form基本都OK了。
但注意:它也僅對(duì)POST請(qǐng)求有效。對(duì)于GET請(qǐng)求和重寫URL的請(qǐng)求,它也會(huì)去處理,但由于他們和POST的編碼區(qū)別,
過(guò)濾器會(huì)把他們過(guò)濾成??
解決方法:
找到Tomcat安裝目錄內(nèi)conf文件夾下的server.xml文件,
給其中的連接器元素Connector添加屬性: URIEncoding, 屬性值為: UTF-8.
public static String changeStr(String str){
if(str==null)return null;
String temp=null;
try {
temp = new String(str.getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return temp;
}
if(str==null)return null;
String temp=null;
try {
temp = new String(str.getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return temp;
}
我們將這個(gè)方法作為靜態(tài)寫入了BaseAction中,使所有的方法都能調(diào)用。
String offername = changeStr(request.getParameter("offername"));
這種方法的好處是: 無(wú)論是POST/GET的頁(yè)面表單,還是重寫的URL他都一并處理了。寫起來(lái)也簡(jiǎn)單
可問(wèn)題是:對(duì)于所有頁(yè)面參數(shù)幾乎都要調(diào)用一下這個(gè)方法,對(duì)于大的工程就很不合適了。
特別是參數(shù)很多的Form中,所有的參數(shù)都要用它處理一次。雖然我把這個(gè)處理寫入了驗(yàn)證中自動(dòng)調(diào)用。
但是還是感覺(jué)比較麻煩。
二. 使用 過(guò)濾器 Filter
1 新建一個(gè)java文件:SetCharacterEncodingFilter
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharacterEncodingFilter implements Filter {
private FilterConfig config;
private String encoding;
public void destroy() {
// 銷毀配置
this.config = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 如果編碼已經(jīng)配置, 則使用該編碼.
if(this.encoding != null) {
request.setCharacterEncoding(this.encoding);
}
// 將資源鏈到下一Filter, 如果這是最后一個(gè)Filter, 則將資源鏈到目的位置.
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// 方便銷毀配置
this.config = config;
// 讀取web.xml中CharacterEncodingFilter內(nèi)的初始編碼參數(shù)
this.encoding = this.config.getInitParameter("encoding");
}
2 在web.xml中 根節(jié)點(diǎn)下加入
<!-- 設(shè)置request編碼方式 -->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.neusoft.struts.platform.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.neusoft.struts.platform.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GB2312</param-value>
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>
使用過(guò)濾器 可謂是一勞永逸,所有頁(yè)面表單是POST的請(qǐng)求,即所有struts中的Form基本都OK了。
但注意:它也僅對(duì)POST請(qǐng)求有效。對(duì)于GET請(qǐng)求和重寫URL的請(qǐng)求,它也會(huì)去處理,但由于他們和POST的編碼區(qū)別,
過(guò)濾器會(huì)把他們過(guò)濾成??
解決方法:
找到Tomcat安裝目錄內(nèi)conf文件夾下的server.xml文件,
給其中的連接器元素Connector添加屬性: URIEncoding, 屬性值為: UTF-8.
1 <Connector port="8080" protocol="HTTP/1.1"
2 connectionTimeout="20000"
3 redirectPort="8443"
4 URIEncoding="UTF-8" />
2 connectionTimeout="20000"
3 redirectPort="8443"
4 URIEncoding="UTF-8" />
關(guān)于亂碼詳細(xì)問(wèn)題即解決,見(jiàn) 亂碼問(wèn)題詳解