Spring MVC訪問.js,.css,.img等靜態文件
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
當配置如上DispatcherServlet攔截“/”,攔截了所有的請求,那麼將導致訪問靜態文件時也會被攔截(404 Not Found)
解決方案一(在spring3.0.4版本之前):
web.xml文件中在DispatcherServlet之前配置defaultServlet
<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之前先攔截,就不會進入Spring。
解決方案二(在spring3.0.4版本之後):
提供了mvc:resources的使用方法:
xml代碼:
<!--訪問靜態文件-->
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"/>
/css/**映射到ResourceHttpRequestHandler進行處理,location指定靜態文件的位置,cache-period可以使得靜態資進行web cache。
如果出現:WARNING:No mapping found for HTTP request with URL[] in DispatcherServlet with name 'springMVC'
原因:可能沒有配置<mvc:annotation-driven/>
使用<mvc:resources/>元素,把mapping的URI注冊到SimpleUrlHandlerMapping中,key為mapping的URI pattern值,value為ResourceHttpRequestHandler,這樣就把對靜態資源的訪問由HandlerMapping轉到ResourceHttpReauestHandler處理並返回。
另外需要注意的一點是,不要對SimpleUrlHandlerMapping設置defaultHandler。因為對static uri的defaultHandler就是ResourceHttpRequestHandler,否則無法處理static resources request.
解決方案三:
使用<mvc:default-servlet-handler/>
xml代碼:
<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值比較小的。
比如當訪問一個.jpg圖片文件時,先通過DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,我們沒有叫.jpg的Action。再按order值升序找,由於最後一個SimpleUrlHandlerMapping 是匹配"/**"的,所以一定會匹配上,再響應圖片。
最後再說明一下,如何你的DispatcherServlet攔截 *.do這樣的URL,就不存上述問題了。
Spring學習之第一個Spring MVC程序(IDEA開發環境) http://www.linuxidc.com/Linux/2016-06/132658.htm
SpringMVC總結篇 http://www.linuxidc.com/Linux/2016-06/132659.htm
Spring+SpringMVC企業快速開發架構搭建 http://www.linuxidc.com/Linux/2015-09/122942.htm
SpringMVC的亂碼處理 http://www.linuxidc.com/Linux/2015-07/120542.htm
Spring MVC+Spring3+Hibernate4開發環境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htm
Spring MVC整合Freemarker基於注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm
基於注解的Spring MVC簡單介紹 http://www.linuxidc.com/Linux/2012-02/54896.htm
SpringMVC詳細示例實戰教程 http://www.linuxidc.com/Linux/2015-06/118461.htm
Spring MVC 框架搭建及詳解 http://www.linuxidc.com/Linux/2012-01/52740.htm
SpringMVC 異常處理 http://www.linuxidc.com/Linux/2015-06/119049.htm