一. 使用 方法調用處理中文:
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 {
// 如果編碼已經配置, 則使用該編碼.
if(this.encoding != null) {
request.setCharacterEncoding(this.encoding);
}
// 將資源鏈到下一Filter, 如果這是最后一個Filter, 則將資源鏈到目的位置.
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// 方便銷毀配置
this.config = config;
// 讀取web.xml中CharacterEncodingFilter內的初始編碼參數
this.encoding = this.config.getInitParameter("encoding");
}
2 在web.xml中 根節點下加入
使用過濾器 可謂是一勞永逸,所有頁面表單是POST的請求,即所有struts中的Form基本都OK了。
但注意:它也僅對POST請求有效。對于GET請求和重寫URL的請求,它也會去處理,但由于他們和POST的編碼區別,
過濾器會把他們過濾成??
解決方法:
找到Tomcat安裝目錄內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;
}
我們將這個方法作為靜態寫入了BaseAction中,使所有的方法都能調用。
String offername = changeStr(request.getParameter("offername"));
這種方法的好處是: 無論是POST/GET的頁面表單,還是重寫的URL他都一并處理了。寫起來也簡單
可問題是:對于所有頁面參數幾乎都要調用一下這個方法,對于大的工程就很不合適了。
特別是參數很多的Form中,所有的參數都要用它處理一次。雖然我把這個處理寫入了驗證中自動調用。
但是還是感覺比較麻煩。
二. 使用 過濾器 Filter
1 新建一個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 {
// 如果編碼已經配置, 則使用該編碼.
if(this.encoding != null) {
request.setCharacterEncoding(this.encoding);
}
// 將資源鏈到下一Filter, 如果這是最后一個Filter, 則將資源鏈到目的位置.
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
// 方便銷毀配置
this.config = config;
// 讀取web.xml中CharacterEncodingFilter內的初始編碼參數
this.encoding = this.config.getInitParameter("encoding");
}
2 在web.xml中 根節點下加入
<!-- 設置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>
使用過濾器 可謂是一勞永逸,所有頁面表單是POST的請求,即所有struts中的Form基本都OK了。
但注意:它也僅對POST請求有效。對于GET請求和重寫URL的請求,它也會去處理,但由于他們和POST的編碼區別,
過濾器會把他們過濾成??
解決方法:
找到Tomcat安裝目錄內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" />
關于亂碼詳細問題即解決,見 亂碼問題詳解