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,將會出現以下頁面:
(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頁面:
(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。
我們要做的就是直接使用它即可,即直接在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約束。
(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。