初学SpringMVC难免会遇到很多问题,令人费解,就比如静态资源被拦截导致报错:
显示jQuery资源不存在的404错误。网上查找一番后,知道了原因以及处理方法整理如下:
静态资源为什么会被拦截
在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet
当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:\apache-tomcat-8.5.50\conf\web.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成<url-pattern>/</url-pattern>
这样时,会覆盖掉全局web.xml中对于静态资源的处理,
这是tomcat的全局web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
这就是默认的servlet,其中<url_pattern>
和我们的一样,导致静态资源也被我们自定义的dispatcherServlet所拦截,那这个类就会去找controller里面的映射了,比如我们访问http://localhost:8080/springmvc/js/jQuery-1.8.3.js,显然我们的Controller里面是没有这个映射路径的。这就导致出现404错误。
我们项目的web.xml
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springMVC-config2.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern> <!-- 注意这里--!>
</servlet-mapping>
其中url-pattern:
url-pattern有5种配置模式:
(1)/xxx :完全匹配/xxx的路径
(2)/xxx/* :匹配以/xxx开头的路径,请求中必须包含xxx。
(3)/* :匹配/下的所有路径,请求可以进入到action或controller,但是转发jsp时再次被拦截,不能访问jsp界面。
(4).xx :匹配以xx结尾的路径,所有请求必须以.xx结尾,但不会影响访问静态文件。
(5) / :默认模式,未被匹配的路径都将映射到servlet,对jpg,js,css等静态文件也将被拦截,不能访问。
解决方法
如果我们用了 / 的方式,那么就需要补上以下配置让静态资源可被访问:
方式一: 在web.xml中添加如下
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</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>*.jpg</url-pattern>
</servlet-mapping>
...
...
等等。。。。
其他地方保持不变,这个粒度显然是比/更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。
当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用。
方式二:在我们的spring-mvc.xml中配置如下
先需要开启mvc的配置
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="...
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"
然后添加如下
<mvc:default-servlet-handler />
<!--使用默认的servlet处理静态资源,类似方法一 --!>
方法三:在我们的spring-mvc.xml中配置如下
<!-- 设置静态资源不过滤 -->
<!-- /css/** 两个*是表示这个文件及里面的子文件夹,如果一个*就不包含这个目录里面的子文件夹。-->
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/img/" mapping="/img/**" />
<mvc:resources location="/js/" mapping="/js/**" />
这种方式更灵活,功能更丰富。
注意 spring-mvc.xml中这个配置<mvc:annotation-driven />推荐每次都加
功能为开启mvc注解驱动,即开启mvc组件
以上就是我整理的SpringMVC静态资源被拦截的解决方法,作为一名初学者,我会一直认真学习,虚心求教,也会把我所遇到的问题和解决方法整理出来和大家分享,如有不足之处欢迎指教。让我们一起努力!!!