一.靜態資源使用web容器默認的servlet進行處理
早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求映射,往往在映射路徑中以 *.do 、 *.xhtml等方式結尾,從而防止攔截靜態資源請求。這種請求的URL必須是一個帶後綴的URL,無法採用真正的REST風格的URL。優雅的REST風格的資源URL不希望帶 .html 或 .do 等後綴。
如果將DispatcherServlet請求映射配置爲"/",則Spring MVC將捕獲Web容器所有的請求,包括靜態資源的請求,Spring MVC會將它們當成一個普通請求處理,因此找不到對應的處理器將導致錯誤。
如何讓Spring框架能夠捕獲所有URL的請求,同時又將靜態資源的請求轉由Web容器處理。有以下幾種方式:
1.使用Tomcat的defaultServlet來處理靜態資源請求
在web.xml文件中配置使用default servlet處理靜態資源,如
<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>
Tomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"
2.使用<mvc:default-servlet-handler/>
在springmvc配置文件中添加<mvc:default-servlet-handler/>
<!-- 配置mvc註解驅動 -->
<!-- 例如@resquestmapping這類的 -->
<mvc:annotation-driven />
<!-- -->
<mvc:default-servlet-handler/>
這個標籤起作用的前提就是需要我們把靜態資源放在webapp下,而非WEB-INF下,否則還是會無效。
3.在spring3.0.4以後版本提供了<mvc:resources />
<mvc:default-servlet-handler />將靜態資源的處理由Spring MVC框架交給Web容器的默認servlet處理。
而<mvc:resources />更進一步,由Spring MVC框架自己處理靜態資源,並添加一些有用的附加值功能。
首先,<mvc:resources />允許靜態資源放在任何地方,如WEB-INF目錄下、類路徑下等,你甚至可以將JavaScript等靜態文件打到JAR包中。通過location屬性指定靜態資源的位置,由於location屬性是Resources類型,因此可以使用諸如"classpath:"等的資源前綴指定資源位置。
傳統Web容器的靜態資源只能放在Web容器的根路徑下,<mvc:resources />完全打破了這個限制。
其次,<mvc:resources />依據當前著名的Page Speed、YSlow等瀏覽器優化原則對靜態資源提供優化。
你可以通過cacheSeconds屬性指定靜態資源在瀏覽器端的緩存時間,一般可將該時間設置爲一年,以充分利用瀏覽器端的緩存。在輸出靜態資源時,會根據配置設置好響應報文頭的Expires 和 Cache-Control值。
接收到靜態資源的獲取請求時,會檢查請求頭的Last-Modified值,如果靜態資源沒有發生變化,則直接返回303相應狀態碼,提示客戶端使用瀏覽器緩存的數據,而非將靜態資源的內容輸出到客戶端,以充分節省帶寬,提高程序性能。
在springMVC-servlet中添加如下配置:
<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>
以上配置將Web根路徑"/"及類路徑下 /META-INF/publicResources/ 的目錄映射爲/resources路徑。
假設Web根路徑下擁有images、js這兩個資源目錄,在images下面有bg.gif圖片,在js下面有test.js文件,
則可以通過 /resources/images/bg.gif 和 /resources/js/test.js 訪問這二個靜態資源。