過濾的必要性
一般來說,HTTP 請求都會被映射到 DispatcherServlet,進而由具體的類來承接處理,但對於類似 js 或者 css 這樣的靜態資源則沒必要這樣,因為對資源的獲取只需返回資源本身即可,無需做其他處理,那么這時就需要對一系列的資源文件做過濾處理。
首先來看 web.xml 中針對 Spring MVC 的一個必要配置,即讓 HTTP 請求映射到 DispatcherServlet:
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置策略
過濾配置要在 springmvc-config.xml 中進行,為了讓資源文件不經過 DispatcherServlet,參見如下配置:
<mvc:annotation-driven />
<mvc:resources mapping="/resources/css/**" location="/resources/css/project1/" />
<mvc:resources mapping="/resources/js/**" location="/resources/js/project1/" />
<mvc:resources mapping="/*.html" location="/" />
以上代碼針對 css 和 js 分別做了配置,且看如下四點說明:
- 靜態資源文件實際所在物理路徑為:“/resources/css/project1/”。
- 在 jsp 頁面中的超鏈接路徑(href、src)對應着配置節里的 mapping。實際的路徑定義在配置節的 location 中,它可能很長,也許由於歷史原因其命名也不優雅,這時通過 mapping 就可以很優雅的重新表達,讓 jsp 頁面的代碼更簡潔明快。
<link href="<c:url value="/resources/css/input.css" />" rel="stylesheet" />
<script src="<c:url value="/resources/js/input.js" />" ></script>
- location 屬性的末尾必須帶上“/”,否則報錯。
- 只要有任何一項針對資源的映射配置(<mvc:resources />),就必須要帶上 annotation-driven,反之,則不需要它。
<mvc:annotation-driven />