spring的配置文件以下:html
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- 讓spring隨web啓動而建立的監聽器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置spring配置文件位置參數 application.xml :對應的是系統級別的配置,做用範圍是系統上下文--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- spring-servlet.xml:對應的是 controller 級別的配置,做用範圍是控制層上下文--> <servlet> <servlet-name>mybatis</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:mybatis-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup><!--大於0 表示容器在啓動的時候就加載這個servlet--> </servlet> <servlet-mapping> <servlet-name>mybatis</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--防止亂碼 過濾器 CharacterEncodingFilter繼承GenericFilterBean和OncePerRequestFilter,也就是說,這個過濾器就是針對於每次瀏覽器請求進行過濾的,而後再其之上添加了父類沒有的功能即處理字符編碼。 其中encoding用來設置編碼格式,forceEncoding用來設置是否理會 request.getCharacterEncoding()方法,設置爲true則強制覆蓋以前的編碼格式。--> <filter> <filter-name>SpringEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <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>SpringEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
在項目中有不少讓人頭疼的問題,其中,編碼問題位列其一,那麼在Spring框架中是如何解決從頁面傳來的字符串的編碼問題的呢?下面咱們來看看Spring框架給咱們提供過濾器CharacterEncodingFilterjava
1.看清結構:web
能夠看到其繼承GenericFilterBean和OncePerRequestFilter,也就是說,這個過濾器就是針對於每次瀏覽器請求進行過濾的,而後再其之上添加了父類沒有的功能即處理字符編碼。spring
2.官方解釋:api
Servlet 2.3/2.4 Filter that allows one to specify a character encoding for requests. This is useful because current browsers typically do not set a character encoding even if specified in the HTML page or form. (這句話就說你在html頁面或表單中設置編碼是沒有用的)瀏覽器
This filter can either apply its encoding if the request does not already specify an encoding, or enforce this filter's encoding in any case ("forceEncoding"="true").(只要你設置了foreEncoding=true,則在代碼中設置編碼格式沒用,)In the latter case, the encoding will also be applied as default response encoding on Servlet 2.4+ containers (although this will usually be overridden by a full content type set in the view).mybatis
3.如何使用app
下面來看看如何在web.xml中配置:框架
其中encoding用來設置編碼格式,forceEncoding用來設置是否理會 request.getCharacterEncoding()方法,設置爲true則強制覆蓋以前的編碼格式。this
4.源碼賞析
當Servlet容器啓動的時候,會讀取web.xml中對於過濾器的配置信息, 讀取到<init-param>中的子標籤<param-name>encoding和forceEncoding所對應的<param-value>的值,再經過調用該類setEncoding(String encoding)和setForceEncoding(boolean forceEncoding) 將值注入到這連個字段中。
在這裏就能看到爲何設置foreEncoding爲true會覆蓋掉request.getCharacterEncoding()中的方法了吧,呵呵,源碼以前了無祕密,只有深刻到源代碼之中才能看清本質。