資料庫進出的資料,我們暫時不去管它,我們先解決頁面到程式的亂碼問題,後面那都是後話。
第一步:
jsp頁面編碼統一問題,這個最容易解決。
<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=UTF-8"%>
以GBK為例子,jsp頁面加上上面一句就能解決頁面編碼問題。
其中pageEncoding="UTF-8"是解決頁面java代碼子產品編碼,contentType="text/html; charset=UTF-8"是解決頁面靜态部分的編碼。
好了,第一步輕松解決。準備開始第二步,但是在第二步之前,先說明一下。
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>
<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;
}
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);
public void destroy() {
config = null;
encoding = null;
}
過濾器的類寫好了,肯定要配置到web.xml中去得。于是在web.xml配置檔案中加入下列代碼。
<filter-name>encodeFilter</filter-name>
<filter-class>com.org.midland.common.EncodeFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<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="UTF-8""變成下面的樣子
redirectPort="8443"
URIEncoding="UTF-8"" />
好了,伺服器編碼已經解決了。服務跑起來,看看還有沒有中文亂碼問題?沒有了吧。
三步搞定一切亂碼。
--------------------------------------------------
說明 :我用的時struts2.2.3+spring 其實spring有自帶的過濾器 并且已經配置了,這個就可以解決表單以post方式送出的中文亂碼問題。
可是通過将參數放置在url中,背景接收的中文是亂碼 看到這篇文章後 嘗試将jboss的server.xml中添加配置項 URIEncoding="UTF-8" 重新開機jboss後 亂碼問題搞定
在測試過程中發現 啟動服務後 先走了是struts的過濾器 然後才走的Spring的過濾器 ,這個執行順序跟你在web.xml中配置配置這兩個過濾器的先後順序沒關系。
web.xml中的配置
<!-- Struts2 Configuration -->
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<url-pattern>/*</url-pattern>
<!-- Spring Encoding 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>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>