今天用spring+hibernate+struts2寫了一個簡單的樣本程式,使用spring來管理hibernate處理資料,整合了 struts2,用了很長時間的webwork,使用struts2也還算是順手,顯示測試資料很順利,當開始測試錄入資料功能時,錄入漢字發生了問題, 錄入的漢字全部成了亂碼。
最開始認為是在tomcat中中文傳輸出現了問題,加入了中文過濾器,但問題沒有解決,忽然想到了在struts2的屬性檔案中已經設定了編碼為gbk:struts.properties
struts.i18n.encoding=GBK
struts.objectFactory=spring 應該不是在傳輸過程出的問題,在後台輸入傳入Action和Dao的資料,也全部能正常顯示。然後懷疑是mysql的設定問題,尋找設定mysql的資料庫編碼設定方法,在設定後仍沒有解決問題。直接在mysql中執行Insert into user ('nam') values('漢字'),mysql執行後資料顯示正常,說明資料庫的編碼也正確。鬱悶了,到底問題處在哪裡?在執行hibernateTemplate的save()方法之前,沒有出現中文亂碼問題,在資料庫這方面也測試沒有中文亂碼問題,只有在hibernate持久化層這裡的問題了。尋找持久化層傳輸資料到資料庫伺服器出現亂碼的問題,終於找到了問題:hibernate持久化層在傳輸過程中未設定編碼格式,這樣在傳輸資料到資料庫伺服器後已經是亂碼了,在oracle和sqlserver裡沒有出現傳輸亂碼問題,所以沒有想到會使這裡的問題。修改spring中關於資料來源的配置參數:資料庫連結方式:
jdbc:mysql://localhost:3306/springexample?characterEncoding=utf-8
在執行資料錄入後,終於中文顯示正常了。在應用hibernate管理mysql資料庫是不僅要注意web伺服器和資料庫的編碼問題,同樣要注意持久化層資料轉送的編碼問題。