Spring MVC之mvc:resources如何處理靜態(tài)資源
Spring MVC之mvc:resources處理靜態(tài)資源
由于早期的 SpringMVC
不能很好地處理靜態(tài)資源,所以在 web.xml
中配置 DispatcherServlet
的請求映射時(shí),往往采用 \*.do、\*.xhtml
等方式,這就決定了請求 URL
必須是一個(gè)帶后綴的 URL
,而無法采用真正 REST
風(fēng)格的 URL
。
如果將DispatcherServlet
請求映射配置為“/”
,那么Spring MVC
將捕獲web
容器所有請求,包括靜態(tài)資源請求,Spring MVC
會將它們當(dāng)成一個(gè)普通請求處理,從而報(bào)錯(cuò)。
為什么要使用<mvc:resources/>?
首先,<mvc:resources/>
允許靜態(tài)資源放置在任何地方,如 WEB-INF
目錄下、類路徑下等,甚至可以將 JavaScript
等靜態(tài)文件打包到 JAR
包中,通過 location
屬性指定靜態(tài)資源的位置,由于 location
屬性是 Resource
類型,因此可以使用諸如 “classpath:”
等的資源前綴指定資源位置。傳統(tǒng)的 Web
容器的靜態(tài)資源只能放在 Web
容器的根路徑下,<mvc:resources/>
打破了這個(gè)限制。
其次,<mvc:resources/>
可以對靜態(tài)資源提供優(yōu)化,例如:通過 cacheSeconds
屬性指定靜態(tài)資源在瀏覽器端的緩存時(shí)間,充分利用瀏覽器端的緩存,在輸出靜態(tài)資源時(shí),會根據(jù)配置設(shè)置好響應(yīng)報(bào)文的 Expires
和 Cache-Control
值。在接受到靜態(tài)資源的獲取請求時(shí),會檢查請求頭的 Last_modified
值。如果靜態(tài)資源沒有發(fā)生變化,直接返回303
響應(yīng)狀態(tài)碼,指示客戶端使用瀏覽器緩存的數(shù)據(jù)。
簡單配置
<!-- 使用 maven 編譯好的結(jié)構(gòu)如下項(xiàng)目結(jié)構(gòu),可以看出 webapp 下的 html、images、jquery-2.1.1和 WEB-INF 都被編譯到了 target 下,唯一變得是 WEB-INF 下多出了 classes 的目錄,這個(gè) classes 就是 spring 中俗稱的 classpath location="/" 表示 target 下的 html、images、jquery-2.1.1 這三個(gè)文件夾及其子文件,mapping="/resources/**" 表示這三個(gè)文件夾的根目錄, 也就是說在瀏覽器輸入 http://localhost:8080/項(xiàng)目名/resources/html/goods.html 訪問 html 下的 goods.html 文件 --> <mvc:resources mapping="/resources/**" location="/" /> <!-- 映射 target 下的 WEB-INF 及其子文件的根目錄為 web,這樣在瀏覽器可以訪問 WEB-INF 下的所有文件 例如:http://localhost:8080/項(xiàng)目名/web/web.xml、http://localhost:8080/項(xiàng)目名/web/ftl/freemarker.html 注意:一般情況下,不要配置 WEB-INF --> <mvc:resources mapping="/web/**" location="/WEB-INF/" /> <!-- 配置 classes 下的文件 訪問:http://localhost:8080/項(xiàng)目名/config/conf.json --> <mvc:resources mapping="/config/**" location="classpath:config/json/" />
項(xiàng)目結(jié)構(gòu)
說明
1、 我們配置的 web
根路徑 “/”
下包含 html
、jquery-2.1.1
、images
和 WEB-INF
,除了 WEB-INF
外,其他三個(gè)文件夾都可以訪問,而 WEB-INF
不能被訪問。因?yàn)?SpringMVC
在處理映射的靜態(tài)資源時(shí),會檢查引用路徑是否包含 WEB-INF
或者 META-INF
,如果包括,則直接返回 null
。當(dāng)然我們也可以配置 location="/WEB-INF/"
。
<mvc:resources mapping="/resources/**" location="/" /> <mvc:resources mapping="/web/**" location="/WEB-INF/" />
2、如果我們設(shè)置了 cache-period
屬性,即設(shè)置靜態(tài)資源在客戶端瀏覽器中的緩存有效時(shí)間,那么當(dāng)發(fā)布了新版本應(yīng)用時(shí),由于客戶端瀏覽器緩存的緣故,需要使這些靜態(tài)資源成為“新的資源”,例如給靜態(tài)資源的路徑添加應(yīng)用發(fā)布的版本號
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺談Java實(shí)體對象的三種狀態(tài)以及轉(zhuǎn)換關(guān)系
這篇文章主要介紹了淺談Java實(shí)體對象的三種狀態(tài)以及轉(zhuǎn)換關(guān)系,具有一定參考價(jià)值,需要的朋友可以,看看。。2017-11-11Java Process與Runtime()的使用及調(diào)用cmd命令阻塞的解決方案
這篇文章主要介紹了Java Process與Runtime()的使用及調(diào)用cmd命令阻塞的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java使用反射和動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)View注解綁定庫
這篇文章主要介紹了Java使用反射和動(dòng)態(tài)代理實(shí)現(xiàn)一個(gè)View注解綁定庫,代碼簡潔,使用簡單,擴(kuò)展性強(qiáng),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05教你用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著如何使用MAT工具分析Java堆內(nèi)存泄漏問題的解決方法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06