1. 程式人生 > >SpringMVC學習-DispatcherServlet中的對映路徑和編碼過濾器

SpringMVC學習-DispatcherServlet中的對映路徑和編碼過濾器

一.DispatcherServlet中的對映路徑
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

1)攔截所有請求
此處需要特別強調的是 <url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那麼請求時可以通過DispatcherServlet轉發到相應的Controller中,但是Controller返回的時候,如返回的jsp還會再次被攔截,這樣導致404錯誤,即訪問不到jsp。

2)自定義攔截請求
攔截*.do、*.html、*.action, 例如/user/add.do
這是最傳統的方式,最簡單也最實用。不會導致靜態檔案(jpg,js,css)被攔截。


攔截/,例如:/user/add
可以實現REST風格的訪問
弊端:會導致靜態檔案(jpg,js,css)被攔截後不能正常顯示。


攔截/*,這是一個錯誤的方式,請求可以走到Controller中,但跳轉到jsp時再次被攔截,不能訪問到jsp。




3)靜態資源的訪問,如jpg,js,css
如果DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。
  如果DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態檔案的訪問也就被攔截了。
例如:
<link href="css/hello.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="js/hello.js"></script>
<img alt="none" src="images/logo.png">


解決方式一:利用Tomcat的defaultServlet來處理靜態檔案
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>


<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>


<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>


特點:1.要配置多個,每種檔案配置一個。
    2.要寫在DispatcherServlet的前面(和tomcat版本有關),讓defaultServlet先攔截請求,這樣請求就不會進入Spring了
    3. 高效能。



解決方式二: 使用<mvc:resources>標籤,例如:
<mvc:resources mapping="/images/**" location="/images/"/>  
<mvc:resources mapping="/js/**" location="/js/"/>  
<mvc:resources mapping="/css/**" location="/css/"/> 

mapping: 對映
兩個*,表示對映指定路徑下所有的URL,包括子路徑
location:本地資源路徑


這樣如果有訪問/images或者/js或者/css路徑下面的資源的時候,spring就不會攔截了




解決方式三: 使用<mvc:default-servlet-handler/>標籤

在spring配置檔案中加入此標籤配置即可

二.spring提供的編碼過濾器
檢視這個過濾器類原始碼便可知這裡所傳的倆個引數的作用
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>