問題:在ssm整合的項目里,從前台頁面獲取表單數據存到數據庫中亂碼
先說解決辦法然后分析:問題出在form表單的提交方式上,我的web.xml配置過濾器都已經指定了編碼集,為什么沒有生效?原因是,對於在web.xml中配置的過濾器指定編碼集只是對表單的post提交方式有效,而我的jsp頁面form表單沒有指定method,而對於表單沒有指定提交方式,默認是get方式,也就是在瀏覽器的地址欄可以看到你提交的表單數據,指定form表單的提交方式為post就好了,不會出現亂碼。不過在這之前要保證數據庫編碼集和連接數據庫的url后面加上指定的編碼集。
之前沒有遇到這個問題,正常的在jsp頁面的表單中添加數據,點擊提交,ssm項目中form表單的action配置的是controller中的mapping路徑,ssm項目的流程是用戶提交數據會根據用戶的action中的路徑找到controller中的mapping配置對應的方法,注意,這時候controller中的方法中的形參(一般是一個對象)就已經有值了,這里是spring mvc強大之處了,只要你的表單中的name屬性和對象中的屬性名一致,spring mvc就會將這些數據自動裝入對象中,也就是在controller中方法的形參(一個對象)在從jsp頁面跳轉過來的時候就已經有值了。說了這么多看下圖,當你從jsp頁面過來的時候,在方法中輸出對象的信息,是可以輸出對象的屬性值的。

在web.xml中都已經配置了過濾器用來指定編碼集,jsp頁面也指定了編碼集。
問題就出現在了這里,在逐步的排查中,根據瀏覽器的調試頁面查看表單傳過來的數據發現沒有亂碼,懷疑是數據庫那里亂碼,但是所有的字段包括數據庫都是utf-8的編碼集,不可能有錯,懷疑是在controller的addUser方法中調用了service中的方法的時候,在spring注入的時候亂碼,但是當我寫下上圖中的代碼(在方法的第一句輸出對象的屬性值)的時候,控制台輸出的信息就是亂碼的(一堆問號),問題的位置確定了,也就是在spring mvc裝入屬性值的時候就已經亂碼,導致后來存入數據庫的數據亂碼。
在我們配置的web.xml文件中的過濾器只對post方式提交有效,如果是get方式是不起作用的,如果想用get方式就需要到Tomcat根目錄下找到conf中的server.xml文件,在Connector標簽中加入URIEncoding="UTF-8",如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
其實在表單提交上還是用post提交好些,像表單參數沒有展示出來,還有就是沒有url長度的限制,在以前看到的get請求的長度限制是255個字節,其實遠遠比這個長,不同的瀏覽器還有不同的長度限制,所以還不如指定post方式提交。
