今天用spring+hibernate+struts2寫了一個簡單的示例程序,使用spring來管理hibernate處理數據,整合了 struts2,用了很長時間的webwork,使用struts2也還算是順手,顯示測試數據很順利,當開始測試錄入數據功能時,錄入漢字發生了問題, 錄入的漢字全部成了亂碼。
最開始認為是在tomcat中中文傳輸出現了問題,加入了中文過濾器,但問題沒有解決,忽然想到了在struts2的屬性文件中已經設置了編碼為gbk:
struts.properties
struts.i18n.encoding=GBK
struts.objectFactory=spring
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
jdbc:mysql://localhost:3306/springexample?characterEncoding=utf-8
在執行數據錄入后,終於中文顯示正常了。
在應用hibernate管理mysql數據庫是不僅要注意web服務器和數據庫的編碼問題,同樣要注意持久化層數據傳輸的編碼問題。