springmvc + freemarker 解決表單提交、頁面顯示亂碼 的問題
其實,網上有很多的解決亂碼的,不過都只能在某些地方起作用,比如給spring增加一個編碼過濾器,能夠解決表單提交(所有以post方式提交的)的亂碼問題,比如給tomcat設定預設的url編碼,能夠解決get請求的亂碼問題,現在我將這兩者結合起來,能夠完美解決所有亂碼問題(至少我的沒問題),這樣就不用擔心編碼問題了,在所有的地方都不用編碼轉換。廢話不多說,方案如下:
一、給tomcat設定url過濾編碼
tomcat對url的編碼預設是iso-8859-1,我們要把它改為utf-8,編輯conf/下的server.xml,配置Connector項,加上屬性URIEncoding="UTF-8"即可,區域性內容如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
二、在web.xml增加spring的編碼過濾器
在配置檔案web.xml增加如下設定
<!-- 設定post方式提交的表單的過濾編碼 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<!-- 在這裡設定預設編碼格式,可以為gbk,gb2312,只要所有頁面編碼統一就行 -->
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value> <!-- 強制編碼 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三、給freemarker設定預設的頁面編碼格式
有兩種方案,一種是給freemarker.properties(預設放在classpath下) 增加如下屬性
default_encoding=utf-8 #頁面載入的字符集
output_encoding=urf-8 #輸出的字符集
locale=zh_CN # 中國
一種是配置freemarkerConfig,在spring的配置檔案配置(相信用過freemarker的都應該知道在哪裡)
為了方便,我把我在配置都貼出來
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/template/" /> <property name="freemarkerSettings"> <props> <prop key="template_update_delay">1</prop> <prop key="default_encoding">UTF-8</prop> <!-- <prop key="output_encoding">UTF-8</prop> --><!-- 輸出的字符集 --> <prop key="locale">zh_CN</prop> <prop key="number_format">0.##</prop> <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop> <prop key="template_exception_handler">dcrx.freemarker.user.MyTemplateExceptionHandler</prop> <!-- 自定義異常處理,沒有的可不管--> </props> </property> <property name="freemarkerVariables"> <map> </map> </property> </bean>
最後不要忘了,配置freeMarker檢視解析器,將頁面的contentType 的編碼設定為utf-8 這是一個很好的習慣,相信做開發或者介面設計的人都知道
為了方便,我把我的配置都貼出來
<!-- 配置freeMarker檢視解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
<!-- <property name="viewNames" value="*.ftl"/> -->
<property name="contentType" value="text/html; charset=utf-8"/>
<property name="cache" value="true" />
<property name="prefix" value="" />
<property name="suffix" value=".ftl" />
<property name="order" value="2"/>
</bean>
這樣,經過幾處的設定,就再也不用擔心編碼的問題了