1. 程式人生 > >總結徹底解決Spring MVC+Mybatis中文亂碼問題

總結徹底解決Spring MVC+Mybatis中文亂碼問題

Java對於新手最容易出現的問題就是中文亂碼的問題。今天我就來總結一下徹底解決Spring mvc+Mybatis中文亂碼的方案。

首先要看打一斷點看一下Controller接收到引數值是否正常。如果不正常多半是因為Spring或者頁面編碼的設定問題。

一、Spring或頁面編碼問題

在JSP頁面第一行加上下面程式碼:

  1. <%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>

因為Springmvc採用預設的編碼(ISO-8859-1)進行解析引數, 這時就會出現亂碼問題

在Web.xml加上Spring編碼轉換過濾器filter。

  1. <filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>utf-8</param-value>
  7. </init-param>
  8. <init-param>
  9. <param-name>forceEncoding</param-name>
  10. <param-value>true</param-value>
  11. </init-param>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>encodingFilter</filter-name>
  15. <url-pattern>/*</url-pattern>
  16. </filter-mapping>

二、Web容器的問題

如果上面方案一還沒有解決亂碼的問題,看一下你的Web容器的問題的編碼設定,比如我使用的是Tomcat,找到server.xml。

可以看到Connector沒有設定編碼。加上編碼屬性URIEncoding,如下:

  1. <Connectorport="8081"protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443"URIEncoding="UTF-8"/>
埠我使用是8081。上面主要是解決GET請求中文亂碼的問題。

三、資料庫或者連結資料庫問題

如果通過打斷點看到Spring Controller接收到值中方是正常的,但是插入資料庫之後就是亂碼了。一般這種情況無非就是兩種問題。

1、資料庫編碼、表編碼、列編碼依次檢查是否是UTF-8編碼

2、mysql的連結字串加上編碼引數,如下:

  1. <environmentsdefault="development">
  2. <environmentid="development">
  3. <transactionManagertype="JDBC"/>
  4. <dataSourcetype="POOLED">
  5. <propertyname="driver"value="com.mysql.jdbc.Driver"/>
  6. <propertyname="url"value="jdbc:mysql://127.0.0.1:3306/lanhuprivi?useUnicode=true&amp;characterEncoding=UTF-8"/>
  7. <propertyname="username"value="root"/>
  8. <propertyname="password"value="root"/>
  9. </dataSource>
  10. </environment>
  11. </environments>

四、Response或者Servlet亂碼問題

第一種方法:

  1. //getWriter()方法將 輸出編碼設定成iso-8859-1,這樣輸出utf8編碼字串必然亂碼
  2. PrintWriter pw = response.getWriter();
  3. //1、
  4. //response.setCharacterEncoding("UTF-8");
  5. //2、
  6. response.setContentType("text/html; charset=utf-8");
  7. pw.write(resStr);
  8. pw.flush();
  9. pw.close();

setContentType 和 setCharacterEncoding兩方法中設定characterEncoding的方法對伺服器效果一致,不需要反覆呼叫。

在輸出文字內容時,採用response.setContentType("text/html; charset=utf-8");似乎更為方便。

第二種方法:

  1. PrintWriter out =newPrintWriter(newOutputStreamWriter(newFileOutputStream(),"UTF-8"));