Spring MVC 處理靜態資源文件


摘要: 三個方案:

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

2.方案二: 在spring3.0.4以后版本提供了mvc:resources (需要配置annotation-driven)

3.方案三 ,使用<mvc:default-servlet-handler/>(需要配置annotation-driven)

 

一、問題:Spring MVC 處理靜態資源文件 

以下情況需要先了解 

1.1  如果你的DispatcherServlet攔截 *.do這樣的URL,就不存在訪問不到靜態資源的問題。如果你DispatcherServlet攔截“/”,攔截了所有的請求,同時對*.js,*.jpg的訪問也就被攔截了。目的:可以正常訪問靜態文件,不要找不到靜態文件報404

1.2  如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。 
      WARNING: No mapping found for HTTP request with URI [/xxx/xxx/xxx/] in DispatcherServlet with name 'springMVC'

 

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

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
View Code

要寫在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" 

方案二: 在spring3.0.4以后版本提供了mvc:resources (需要配置annotation-driven)

<!-- Spring MVC設置不攔截靜態資源 -->
<mvc:annotation-driven/>  
<mvc:resources mapping="/images/**" location="/images/" />
View Code

 如果沒有<mvc:annotation-driven/> 這句話,本來可以正常請求的URL,會報404的。

使用<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/>(需要配置annotation-driven)

<mvc:default-servlet-handler/>
完整的使用方法參見:http://jtuts.com/2014/09/05/serving-static-resources-spring/

會把"/**" 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 是匹 "/**"的,所以一定會匹配上,再響應圖片。 


免責聲明!

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



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