一個項目中碰到亂碼的問題了,只用到struts2,就是前台輸入中文,后台解析參數發生了亂碼,在網上找到了這篇文章,特此轉載。經測試,真實有用。。
java 編程中得中文亂碼問題,一直都是個困擾程序員的問題。
數據庫進出的數據,我們暫時不去管它,我們先解決頁面到程序的亂碼問題,后面那都是后話。
第一步:
jsp頁面編碼統一問題,這個最容易解決。
<%@ page language="java" import="java.util.*" pageEncoding="GBK" contentType="text/html; charset=GBK"%>
以GBK為例子,jsp頁面加上上面一句就能解決頁面編碼問題。
其中pageEncoding="GBK"是解決頁面java代碼模塊編碼,contentType="text/html; charset=GBK"是解決頁面靜態部分的編碼。
好了,第一步輕松解決。准備開始第二步,但是在第二步之前,先說明一下。
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>