jsp頁面傳值給strut2,Hibernate與資料庫亂碼解決根本

來源:互聯網
上載者:User

一、亂碼分析與解決:

 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&amp;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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.