完美解決SpringMVC中靜態資源無法找到(No mapping found for HTTP request with URI)問題


https://blog.csdn.net/kingmax54212008/article/details/79330308

今天遇到一個比較新奇的問題,但是也應該是使用spring MVC框架時由於疏忽經常會遇到的一個,解決后寫出來和大家分享分享。

 

問題描述:項目正常啟動,可以訪問頁面,但是無法找到靜態資源文件,如css,js等文件資源。

瀏覽器控制台報錯信息:

idea后台報錯信息:

 

[java]  view plain  copy
 
  1. 二月 07, 2017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound  
  2. 警告: No mapping found for HTTP request with URI [/myboss-web/js/jquery-1.8.3.js] in DispatcherServlet with name 'mvc-dispatcher'  
  3. 二月 07, 2017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound  
  4. 警告: No mapping found for HTTP request with URI [/myboss-web/js/fun.base.js] in DispatcherServlet with name 'mvc-dispatcher'  

因為項目使用了spring security,之前我一度懷疑是不是沒有給靜態文件設置訪問權限,后來確認了已經設置了訪問靜態資源無需權限認證,也檢查了mvc攔截器的配置信息,沒發現什么明顯異常,之后就納悶了。去網上查閱了一些資料后發現,確實是mvc攔截器在作祟。

 

 

我之前的攔截器配置信息:

 

[html]  view plain  copy
 
  1. <!--配置攔截器-->  
  2. <servlet>  
  3.   <servlet-name>mvc-dispatcher</servlet-name>  
  4.   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.   <init-param>  
  6.     <param-name>contextConfigLocation</param-name>  
  7.     <param-value>classpath*:/spring/applicationContext-mvc.xml</param-value>  
  8.   </init-param>  
  9.   <load-on-startup>1</load-on-startup>  
  10. </servlet>  
  11. <servlet-mapping>  
  12.   <servlet-name>mvc-dispatcher</servlet-name>  
  13.   <url-pattern>/</url-pattern>  
  14. </servlet-mapping>  

 

從配置上分析,如此配置會把所有的請求都會進行攔截,交給spring去處理。而spring所有請求的URL都是在controller中使用注解@RequestMapping標明,所以這樣的情況下訪問靜態資源是訪問不到的。

以下給出三種解決方案,自行選擇使用

方法1:簡單粗暴地告訴服務器,這些資源不需要攔截!

直接在web.xml文件中進行配置,如下:

 

[html]  view plain  copy
 
  1. <servlet-mapping>  
  2.    <servlet-name>default</servlet-name>  
  3.    <url-pattern>*.css</url-pattern>  
  4.  </servlet-mapping>  
  5.  <servlet-mapping>  
  6.    <servlet-name>default</servlet-name>  
  7.    <url-pattern>*.xml</url-pattern>  
  8.  </servlet-mapping>  
  9.  <servlet-mapping>  
  10.    <servlet-name>default</servlet-name>  
  11.    <url-pattern>*.swf</url-pattern>  
  12.  </servlet-mapping>  
  13.  <servlet-mapping>  
  14.    <servlet-name>default</servlet-name>  
  15.    <url-pattern>*.zip</url-pattern>  
  16.  </servlet-mapping>  
  17.  <servlet-mapping>  
  18.    <servlet-name>default</servlet-name>  
  19.    <url-pattern>*.gif</url-pattern>  
  20.  </servlet-mapping>  
  21.   
  22.  <servlet-mapping>  
  23.    <servlet-name>default</servlet-name>  
  24.    <url-pattern>*.jpg</url-pattern>  
  25.  </servlet-mapping>  
  26.  <servlet-mapping>  
  27.    <servlet-name>default</servlet-name>  
  28.    <url-pattern>*.png</url-pattern>  
  29.  </servlet-mapping>  
  30.  <servlet-mapping>  
  31.    <servlet-name>default</servlet-name>  
  32.    <url-pattern>*.js</url-pattern>  
  33.  </servlet-mapping>  

如果你嫌這樣太麻煩,太low的話,請移步下面兩種方法!

 

方法2:直接告訴spring,這個你就得這么做!

在MVC配置文件中添加資源文件映射。

 

  <resources mapping="/resources/**" location="/resources/" />
  <resources mapping="/images/**" location="/images/" />
  <resources mapping="/js/**" location="/js/" />

 

 

注解: 
mapping:映射     
location:本地資源路徑,注意必須是webapp根目錄下的路徑。          
兩個*,它表示映射resources/下所有的URL,包括子路徑(即接多個/)
可能有筒子看完這個后會回來說:“博主寫的啥玩意,照着寫了還是沒用,我絕對沒敲錯字!我還是復制過去的!!!”
如果真的有這樣的哥們,別告訴我,否則我怕我會忍不住會拿出我的30米大刀!
請自行更換路徑!!!
當然這個還有一個需要注意的地方:
配置的location一定要是web-app根目錄下才行,如果你將資源目錄,放置到web-app/WEB-INF下面的話,恭喜你,訪問失敗!404 NOT FOUND


方法3:全部使用默認的,也別操啥心了

[html]  view plain  copy
 
  1. <mvc:default-servlet-handler/>  

比較懶得童鞋可以直接在MVC配置文件加上這么一句,這個確實方便,但是弊端就是他會把你發出的請求全部按照默認的處理了!
如果直接貼出這一句,我怕又有筒子會說怎么報錯了,mvc標簽報錯了!
哥們,你要是這種錯誤都解決不了,你也先別看這博文了,先去看看什么叫namespace吧!還來得及治療!

 

 

[html]  view plain  copy
 
  1. <pre code_snippet_id="2167768" snippet_file_name="blog_20170207_4_9118558" style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; line-height: 18px; font-family: 'Courier New' !important;"></pre>  
  2. <pre></pre>  
  3. <pre></pre>  


免責聲明!

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



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