1. 程式人生 > >springmvc + freemarker 解決表單提交、頁面顯示亂碼 的問題

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>

這樣,經過幾處的設定,就再也不用擔心編碼的問題了