通過Servlet插入資料庫的中文資料亂碼解決
1.亂碼原因
亂碼的原因: 當使用表單進行Post方式提交後接收到的亂碼問題。 這個問題也是一個常見的問題。這個亂碼也是tomcat的內部編碼格式ISO8859-1在搗亂,也就是說post提交時,如果沒有設定提交的編碼格式,則會以ISO8859-1方式進行提交,接受的jsp卻以UTF-8的方式接受。導致亂碼。
2.解決方法
2-1 接受引數時進行編碼轉換 String s = new String(request.getParameter(“something”).getBytes(“ISO-8859-1”),”UTF-8”);這樣的話,每一個引數都必須這樣進行轉碼,因為要執行對每一個引數的轉碼,比較麻煩,可以捨棄。
2-2 在請求頁面上開始處,執行請求的編碼程式碼,request.setCharacterEncoding(“UTF-8”),把提交內容的字符集設為UTF-8。這樣的話,接受此引數的頁面就不必在轉碼了。直接使用String s=request.getParameter(“something”);即可得到漢字引數。但是如果存在多頁的話,我們需要在每一頁執行 這個方法也就對post提交的有效果,對於get提交和上傳檔案時的enctype=”multipart/form-data”是無效的。
2-3為了避免每頁都要寫request.setCharacterEncoding(“UTF-8”),建議使用過濾器對所有jsp進行編碼處理。比較推薦使用過濾器,降低了程式碼的冗餘。
3.過濾器的使用:
3-1:簡介:過濾器是在伺服器上執行的,且位於請求響應中間起過濾功能的程式,其工作原理就是在與過濾器相關聯的Servlet或JSP前執行,一個過濾器可以與一個或者多個Servlet,JSP繫結。 工作原理: 程式碼分析: filter程式碼:
//實現編碼轉換的過濾器 package filter; 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 EncodingFilter implements Filter { protected String encoding = null; protected FilterConfig config; public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; // 得到在 web.xml 中配置的編碼 this.encoding = filterConfig.getInitParameter("Encoding"); } public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request.getCharacterEncoding() == null) { // 得到指定的編碼 String encode = getEncoding(); if (encode != null) { //設定 request 的編碼 request.setCharacterEncoding(encode); response.setCharacterEncoding(encode); } } chain.doFilter(request, response); } protected String getEncoding() { return encoding; } public void destroy() { } }
web.xml配置檔案
<filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
<init-param>
<param-name>Encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>