經過上面url-pattern的配置,全部URL請求都將被Spring MVC的DispatcherServlet截獲。這樣的配置,會形成js文件、css文件、圖片文件等靜態資源沒法訪問。
好比,你的jsp頁面引用了一個圖片和juqery:
那麼,很抱歉,運行會提示404錯誤,找不到圖片資源,由於SpringMVC把「image/1.jpg」也當作了一個請求鏈接,但這個請求鏈接咱們並無。
解決方法:
一、spring.3.0.4之後版本提供的<mvc:resources />(推薦使用此方式)web
a)首先,<mvc:resources />容許靜態資源放在任何地方,如WEB-INF目錄下、類路徑下等,你甚至能夠將JavaScript等靜態文件打到JAR包中。經過location屬性指定靜態資源的位置,因爲location屬性是Resources類型,所以可使用諸如"classpath:"等的資源前綴指定資源位置。傳統Web容器的靜態資源只能放在Web容器的根路徑下,<mvc:resources />徹底打破了這個限制。
b)其次,<mvc:resources />依據當前著名的Page Speed、YSlow等瀏覽器優化原則對靜態資源提供優化。你能夠經過cacheSeconds屬性指定靜態資源在瀏覽器端的緩存時間,通常可將該時間設置爲一年,以充分利用瀏覽器端的緩存。在輸出靜態資源時,會根據配置設置好響應報文頭的Expires 和 Cache-Control值。
在接收到靜態資源的獲取請求時,會檢查請求頭的Last-Modified值,若是靜態資源沒有發生變化,則直接返回303相應狀態碼,提示客戶端使用瀏覽器緩存的數據,而非將靜態資源的內容輸出到客戶端,以充分節省帶寬,提升程序性能。
在spring-servlet.xml中添加以下配置:
<mvc:resources location="/image/" mapping="/image/**"/> |
或者:
<mvc:resources location="/,classpath:/META-INF/image/" mapping="/image/**"/> |
以上配置將Web根路徑"/"及類路徑下 /META-INF/image/ 的目錄映射爲/image路徑。假設Web根路徑下擁有images、js這兩個資源目錄,在images下面有bg.gif圖片,在js下面有test.js文件,則能夠經過 /images/1.jpg這個靜態資源。
假設WebRoot還擁有images/bg1.gif 及 js/test1.js,則也能夠在網頁中經過 /resources/images/bg1.gif 及 /resources/js/test1.js 進行引用。
也能夠簡單配置WEB-INF/spring-servlet.xml以下:
<!-- 靜態資源訪問 -->
<mvc:resources location="/image/" mapping="/image/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/> |
須要也別注意的是:使用此方式須要導入 org.springframework.web.servlet-3.1.4.RELEASE.jar包到WEB/lib目錄下,並且版本要大於3.0.4,不然,在開發環境下會產生對resources元素沒找到狀況:
cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'mvc:resources'。
必須在運行環境下就沒有這個問題,這是3.0.4版的一個bug,會在3.0.5中更新spring-mvc-3.0.4.xsd。
<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>
要配置多個,每種文件配置一個
要寫在DispatcherServlet的前面, 讓defaultServlet先攔截,這個就不會進入Spring了,我想性能是最好的吧。
Tomcat, Jetty, JBoss, and GlassFish 默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字 -- "FileServlet"
WebSphere 默認 Servlet的名字 -- "SimpleFileServlet"