一個項目中碰到亂碼的問題了,只用到struts2,就是前臺輸入中文,後臺解析參數發生了亂碼,在網上找到了這篇文章,特此轉載。經測試,真實有用。。html
java 編程中得中文亂碼問題,一直都是個困擾程序員的問題。java
數據庫進出的數據,咱們暫時不去管它,咱們先解決頁面到程序的亂碼問題,後面那都是後話。程序員
第一步:web
jsp頁面編碼統一問題,這個最容易解決。spring
<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=GBK"%>數據庫
以GBK爲例子,jsp頁面加上上面一句就能解決頁面編碼問題。apache
其中pageEncoding="GBK"是解決頁面java代碼模塊編碼,contentType="text/html; charset=GBK"是解決頁面靜態部分的編碼。編程
好了,第一步輕鬆解決。準備開始第二步,可是在第二步以前,先說明一下。tomcat
jsp的操做流程,是jsp接受各類請求,而後轉給servlet處理。在這個過程當中會有中文亂碼產生。知道了這個亂碼產生的緣由,就容易辦了,接下來就是第二步了。服務器
第二步:
我這裏用到了Struts2.2.3,目前較新版本吧。咱們到知道,struts2封裝了servlet,由action來處理jsp的頁面請求。
既然用到了struts2,咱們的web.xml確定配置了struts2的攔截器。配置代碼以下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這段是攔截全部請求交給struts2去處理。可是編碼問題怎麼解決?別急,接着看。
手寫個字符編碼過濾器的類。代碼以下:
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;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
public class EncodeFilter extends StrutsPrepareAndExecuteFilter implements Filter {
private FilterConfig config = null;
private String encoding = null;
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (encoding == null) {
encoding = config.getInitParameter("encoding");
}
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {
config = null;
encoding = null;
}
}
過濾器的類寫好了,確定要配置到web.xml中去得。因而在web.xml配置文件中加入下列代碼。
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>com.org.midland.common.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
ok,第二步到這裏就完成了。jsp頁面進行表單提交的時候是否是沒有亂碼了?怎麼?還有亂碼?是的,由於還有最後一步。
以上兩步,在表單作post提交的時候是沒有亂碼問題的。可是若是表單作get提交就會有亂碼。還有url帶參數的請求都還有中文亂碼問題。這要怎麼解決?不急,還有第三步,下面開始第三步。
第三步:
配置應用服務器的編碼,這裏以tomcat爲例子。找到server.xml這個配置文件,並在該文件中找到以下位置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"/>
在這裏面加入URIEncoding="GBK"變成下面的樣子
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="GBK" />
好了,服務器編碼已經解決了。服務跑起來,看看還有沒有中文亂碼問題?沒有了吧。
三步搞定一切亂碼。
--------------------------------------------------
說明 :我用的時struts2.2.3+spring 其實spring有自帶的過濾器 而且已經配置了,這個就能夠解決表單以post方式提交的中文亂碼問題。
但是經過將參數放置在url中,後臺接收的中文是亂碼 看到這篇文章後 嘗試將jboss的server.xml中添加配置項 URIEncoding="GBK" 重啓jboss後 亂碼問題搞定
在測試過程當中發現 啓動服務後 先走了是struts的過濾器 而後才走的Spring的過濾器 ,這個執行順序跟你在web.xml中配置配置這兩個過濾器的前後順序不要緊。
web.xml中的配置
<!-- Struts2 Configuration -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring Encoding filter --> <filter> <filter-name>Spring character encoding filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>Spring character encoding filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>