摘要: 三個方案:
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>
要寫在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/" />
如果沒有<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 是匹 "/**"的,所以一定會匹配上,再響應圖片。