總結徹底解決Spring MVC+Mybatis中文亂碼問題
阿新 • • 發佈:2019-01-05
Java對於新手最容易出現的問題就是中文亂碼的問題。今天我就來總結一下徹底解決Spring mvc+Mybatis中文亂碼的方案。
首先要看打一斷點看一下Controller接收到引數值是否正常。如果不正常多半是因為Spring或者頁面編碼的設定問題。
一、Spring或頁面編碼問題
在JSP頁面第一行加上下面程式碼:
- <%@ page language="java"import="java.util.*" pageEncoding="UTF-8"%>
因為Springmvc採用預設的編碼(ISO-8859-1)進行解析引數, 這時就會出現亂碼問題。
在Web.xml加上Spring編碼轉換過濾器filter。
- <filter>
- <filter-name>encodingFilter</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>encodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
二、Web容器的問題
如果上面方案一還沒有解決亂碼的問題,看一下你的Web容器的問題的編碼設定,比如我使用的是Tomcat,找到server.xml。
可以看到Connector沒有設定編碼。加上編碼屬性URIEncoding,如下:
- <Connectorport="8081"protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"URIEncoding="UTF-8"/>
三、資料庫或者連結資料庫問題
如果通過打斷點看到Spring Controller接收到值中方是正常的,但是插入資料庫之後就是亂碼了。一般這種情況無非就是兩種問題。
1、資料庫編碼、表編碼、列編碼依次檢查是否是UTF-8編碼
2、mysql的連結字串加上編碼引數,如下:
- <environmentsdefault="development">
- <environmentid="development">
- <transactionManagertype="JDBC"/>
- <dataSourcetype="POOLED">
- <propertyname="driver"value="com.mysql.jdbc.Driver"/>
- <propertyname="url"value="jdbc:mysql://127.0.0.1:3306/lanhuprivi?useUnicode=true&characterEncoding=UTF-8"/>
- <propertyname="username"value="root"/>
- <propertyname="password"value="root"/>
- </dataSource>
- </environment>
- </environments>
四、Response或者Servlet亂碼問題
第一種方法:
- //getWriter()方法將 輸出編碼設定成iso-8859-1,這樣輸出utf8編碼字串必然亂碼
- PrintWriter pw = response.getWriter();
- //1、
- //response.setCharacterEncoding("UTF-8");
- //2、
- response.setContentType("text/html; charset=utf-8");
- pw.write(resStr);
- pw.flush();
- pw.close();
setContentType 和 setCharacterEncoding兩方法中設定characterEncoding的方法對伺服器效果一致,不需要反覆呼叫。
在輸出文字內容時,採用response.setContentType("text/html; charset=utf-8");似乎更為方便。
第二種方法:
- PrintWriter out =newPrintWriter(newOutputStreamWriter(newFileOutputStream(),"UTF-8"));