完美解决SpringMVC中静态资源⽆法到
(NomappingfoundforHTTPr。。。
今天遇到⼀个⽐较新奇的问题,但是也应该是使⽤spring MVC框架时由于疏忽经常会遇到的⼀个,解决后写出来和⼤家分享分享。
问题描述:项⽬正常启动,可以访问页⾯,但是⽆法到静态资源⽂件,如css,js等⽂件资源。
浏览器控制台报错信息
idea后台报错信息:
⼆⽉ 07, 2017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound
警告: No mapping found for HTTP request with URI [/myboss-web/js/jquery-1.8.3.js] in DispatcherServlet with name 'mvc-dispatcher'
⼆⽉ 07, 2017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound
警告: No mapping found for HTTP request with URI [/myboss-web/js/fun.base.js] in DispatcherServlet with name 'mvc-dispatcher'
因为项⽬使⽤了spring security,之前我⼀度怀疑是不是没有给静态⽂件设置访问权限,后来确认了已经设置了访问静态资源⽆需权限认证,也检查了mvc的配置信息,没发现什么明显异常,之后就纳闷了。去⽹上查阅了⼀些资料后发现,确实是mvc在作祟。
我之前的配置信息:
<!--配置-->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/l</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
从配置上分析,如此配置会把所有的请求都会进⾏拦截,交给spring去处理。⽽spring所有请求的URL都是在controller中使⽤注解@RequestMapping标明,所以这样的情况下访问静态资源是访问不到的。
以下给出三种解决⽅案,⾃⾏选择使⽤
⽅法1:简单粗暴地告诉服务器,这些资源不需要拦截!
直接在l⽂件中进⾏配置,如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
david sylvian<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.zip</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
李易峰杨幂<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
张小斐男朋友
玉置浩二李香兰<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</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:全部使⽤默认的,也别操啥⼼了
<mvc:default-servlet-handler/>
⽐较懒得童鞋可以直接在MVC配置⽂件加上这么⼀句,这个确实⽅便,但是弊端就是他会把你发出的请求全部按照默认的处理了!
如果直接贴出这⼀句,我怕⼜有筒⼦会说怎么报错了,mvc标签报错了!
哥们,你要是这种错误都解决不了,你也先别看这博⽂了,先去看看什么叫namespace吧!还来得及!人体模特冰漪
>你不是我的月亮我不是你的云