解決ssm專案表單資料提交到資料庫亂碼問題
問題:在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方式提交。