程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> sping mvc訪問.js,.css,.img等靜態文件,spingmvc

sping mvc訪問.js,.css,.img等靜態文件,spingmvc

編輯:JAVA綜合教程

sping mvc訪問.js,.css,.img等靜態文件,spingmvc


<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,就不存上述問題了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved