一、亂碼分析與解決:
1】JSP傳值給Action過程中出現亂碼;
1、前台頁面與action:
從最初的jsp頁面說起,如果在jsp版面設定編碼與action中的編碼
struts.xml中的<constant name="struts.i18n.encoding" value="UTF-8"></constant>)
不一致的就一定會出現亂碼;所以在項目中將有編碼統一為UTF-8;
2、伺服器::
如果jsp頁面和action中的設定為UTF-8,action中亂碼依然出現,說明,伺服器tomcat中的編碼設定不是UTF-8;可以在tomcat的service.xml設定檔中設定:
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>;tomcat的編碼,眾所周知為ISO-8859-1;設為UTF-8;
理論上,這是根本上解決問題的方法,action中就不會有亂碼了,但是這個方法,偶爾管用;
如果,action中依然接收的值是亂碼;說明tomcat的設定沒有起到作用;這時候,不得不手動在項目中添加一個過濾器filter,手動的將tomcat中傳來的值設定為UTF-8的編碼;下面為filter:
package servlets;import java.io.IOException;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 { public void init(FilterConfig config) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("utf-8"); chain.doFilter(request, response); } public void destroy() { }}在web.xml註冊<filter> <filter-name>EncodingFilter </filter-name> <filter-class>servlets.EncodingFilter </filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter </filter-name> <url-pattern>/* </url-pattern> </filter-mapping>
添加filter之後,確認filter被調用,在action執行前被執行過,這樣,在action中的亂碼就會徹底解決;
以前在action中解決亂碼,簡單的通過new String()轉碼,這樣不是根本方法;通過以上三處JSP、tomcat、action)通過不同的方式將編碼統一為UTF-8;就解決問題了;如果action中亂碼依然在;問題就在這三個上面;可以試著不同的方法將他們設定統一編碼;
2】、action和資料庫過程中亂碼mysql)
1、如果測試過,action中傳值給Hibernate之前的參數確實為中文,不是亂碼;這問題便出現在Hibernate或者資料庫本身;
假設問題在Hibernate上,就可以在Hibernate的設定檔中,將sessionfactory的添加屬性;
<property name="url" value="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8">
和
<property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.query.factory_class"> org.hibernate.hql.classic.ClassicQueryTranslatorFactory </prop> </props> </property>
這些屬性設定表明Hibernate在資料庫儲存的時候,會以指定的編碼進行儲存;這時候資料庫中的資料就會想要的中文了;但如果你還是存在資料庫亂碼;就手動的將資料庫的的預設編碼改為UTF-8;這樣就沒有問題了;
插曲:本人,在通過以上的配置,出現一個怪現象;往資料庫中save資料時,是中文,但是一旦查詢資料,資料便變成亂碼;糾結了好久;原來是,在我測試過程中;在Bean層中的實體類的setXXX方法中,將得到的參數通過new String()這種笨蛋方法轉碼過,所以,第一次save時,參數被這個方法編碼為UTF-8,這樣參數沒有問題地以UTF-8存進資料庫了,但是,在查詢時,Hibernate會從資料庫中,將資料讀取查詢,同時也會將查詢的值傳給Bean中的實體類,這些資料庫中的中文參數,又一次的被轉碼編碼為UTF-8,Hibernate在查詢完後,便會更新資料,這些被轉碼過的參數就會被存入資料庫,便成為亂碼;
本文出自 “獨垂淚” 部落格,請務必保留此出處http://xzb09.blog.51cto.com/7243998/1218673