1. 程式人生 > >SpringMVC之再解url-pattern

SpringMVC之再解url-pattern

配置詳解

關於SpringMVC的配置檔案web.xml中<url -pattern>應該怎麼寫的問題,相信許多初學的小夥伴會有疑惑,特此總結一下。

<!-- 註冊中央排程器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定springmvc配置檔案的位置及檔名 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!-- 在Tomcat啟動時直接建立當前servlet,此處值越小,優先順序越高(大於0的整數) -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

(1)建議寫為*.do形式

在沒有特殊要求的情況下,SpringMVC的中央排程器DispatcherServlet的<url -pattern>常使用字尾匹配方式,如寫成*.do。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

(2)不能寫為/*

這裡的url-pattern不能寫成/*,因為DispatcherServlet會將向動態頁面的跳轉請求,即向JSP頁面的跳轉請求也當做是一個普通的Controller請求。中央排程器會呼叫處理器對映器為其查詢相應的處理器。當然是找不到的,所以在這種情況下,所有的JSP頁面跳轉均會報404錯誤。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

如此時訪問index.jsp,將會出現以下頁面:
enter image description here

(3)最好也不要寫成/

最好也不要寫成/,因為DispatcherServlet會將靜態資源的獲取請求,例如.css,.js,.jpg,.png等資源的獲取請求,當做是一個普通的Controller請求。中央排程器會呼叫處理器對映器為其查詢相應的處理器。當然也是找不到的,所以在這種情況下,所有的靜態資源請求也均會報404錯誤。

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

如在index.jsp中新增如下程式碼:

<img alt="pics" src="images/1.jpg">

也將會出現404頁面:
enter image description here

(4)總結

.do大法好,建議都寫成.do的形式

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <!-- 此處絕對不能寫成/*,因為/*會攔截動態資源獲取請求 -->
    <!-- <url-pattern>/*</url-pattern> -->
    <!-- 此處最好不要寫成/,因為/會攔截靜態資源獲取請求 -->
    <!-- <url-pattern>/</url-pattern> -->
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

靜態資源訪問

<url -pattern>的值並不是說寫成/後,靜態資源就無法訪問了。經過一些配置後,該問題也是可以解決的。

(1)使用Tomcat中名為default的Servlet

在Tomcat中,有一個專門用於處理靜態資源訪問的Servlet-DefaultServlet。其<servlet -name>為default。可以處理各種靜態資源訪問請求。該Servlet註冊在Tomcat伺服器的web.xml中。在Tomcat安裝目錄/conf/web.xml。
enter image description here
我們要做的就是直接使用它即可,即直接在web.xml中註冊<servlet -mapping>即可。

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

此時如果再訪問

<img alt="pics" src="images/1.jpg">

將會正常顯示圖片

(2)使用<mvc:default-servlet-handler/>

只需在springmvc.xml中新增<mvc:default -servlet-handler>標籤即可。

<mvc:default-servlet-handler/>

<mvc:default -servlet-handler>會將對靜態資源的訪問請求新增到SimpleUrlHandlerMapping的urlMap中,key就是請求的URI,而value則為預設servlet請求處理器DefaultServletHttpRequestHandler物件。而該處理器呼叫了Tomcat的DefaultServlet來處理靜態資源的訪問請求 當然了,要想使用<mvc:.../>標籤,需要引入mvc約束。
enter image description here

(3)使用<mvc:resources/>

在Spring3.04版本後,Spring中專門定義了用於處理靜態資源訪問請求的處理器ResourceHttpRequestHandler。並且添加了標籤,專門用於解決靜態資源無法訪問問題。需要在springmvc中新增如下形式的配置:

<mvc:resources location="/images/" mapping="/images/**"/>

location表示靜態資源所在目錄。當然,這裡的目錄包含/WEB-INF/目錄及其子目錄。 mapping表示對該靜態資源的請求。注意,後面的兩個**。 該配置會把對該靜態資源的訪問請求新增到SimpleUrlHandlerMapping的urlMap中,key就是真正與mapping的URI匹配的URI,而value則為靜態資源處理器物件ResourceHttpRequestHandler。