Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 738|回复: 0

完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-5 13:26:29 | 显示全部楼层 |阅读模式

    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>  
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 12:50 , Processed in 0.061338 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表