SpringMVC——正常訪問靜態文件,不要找不到靜態文件報404的方法


方案一:激活Tomcat的defaultServlet來處理靜態文件

<span style="font-size:12px;">

<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></span>

注:在web.xml中要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截,這個就不會進入Spring了。

 


 

方案二: 在spring3.0.4以后版本提供了mvc:resources 的使用方法

<!-- 對靜態資源文件的訪問 -->
<mvc:resources mapping="/images/**" location="/images/" />

  /images/**映射到ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包里面,這樣可以把靜態資源壓縮到jar包中。

  cache-period 可以使得靜態資源進行web cache 如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。

  報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

  

  使用<mvc:resources/>元素,把mapping的URI注冊到SimpleUrlHandlerMapping的urlMap中,key為mapping的URI pattern值,而value為ResourceHttpRequestHandler,這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支持classpath目錄,jar包內靜態資源的訪問.另外需要注意的一點是,不要對SimpleUrlHandlerMapping設置defaultHandler。因為對static uri的defaultHandler就是ResourceHttpRequestHandler,否則無法處理static resources request。

 


 

方案三 :使用mvc:default-servlet-handler

 

<mvc:default-servlet-handler/>

 

會把"/**" url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler處理並返回DefaultServletHttpRequestHandler使用,就是各個Servlet容器自己的默認Servlet。

 


 

補充說明

多個HandlerMapping的執行順序問題:

DefaultAnnotationHandlerMapping的order屬性值是:0

<mvc:resources/ >自動注冊的SimpleUrlHandlerMapping的order屬性值是:2147483646

<mvc:default-servlet-handler/>自動注冊的SimpleUrlHandlerMapping的order屬性值是:2147483647

spring會先執行order值比較小的。當訪問一個a.jpg圖片文件時,先通過DefaultAnnotationHandlerMapping來找處理器,一定是找不到的,我們沒有叫a.jpg的Action。再按order值升序找,由於最后一個SimpleUrlHandlerMapping是匹配"/**"的,所以一定會匹配上,再響應圖片。

注:如果DispatcherServlet攔截 *.do這樣的URL,就不存上述問題了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM