歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Spring MVC訪問.js,.css,.img等靜態文件

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

Copyright © Linux教程網 All Rights Reserved