SpringMVC入门学习(八)----SpringMVC访问静态资源

1、静态资源访问问题

我们平时在开发Web项目时,不可避免的需要使用到静态资源,例如要用到项目中的图片文件、HTML文件、CSS文件、JavaScript文件等等凡是浏览器直接可以使用且不需要Tomcat解析的资源都是静态资源。但是我们在配置SpringMVC核心控制器dispatcherServlet时,配置的<url-pattern>/</url-pattern>表示拦截除jsp以外的所有请求,对于前台页面来说想要使用静态资源比如图片、引入js、css等,就必须向服务器发送请求才能获取,而此时我们是将dispatcherServlet设置为拦截了除jsp以外所有请求,所以对于这些静态资源就会获取不到,导致页面出现404错误!

下面就是对静态资源访问的一些解决方案。


补充:<url-pattern>/</url-pattern>表示拦截除jsp以外的所有请求。JSP为什么不拦截呢?因为tomcat容器定义了一个名称为Jsp的Servlet,在这里并没有重写

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

2、解决方法一

方法一:使用<mvc:default-servlet-handler/>

只需在springmvc的xml配置文件中配置这个标签即可:

<!-- 开启默认的servlet  -->
<mvc:default-servlet-handler/>
<!-- 配置MVC注解驱动 -->
<mvc:annotation-driven/>

<mvc:default-servlet-handler /> 表示开启默认的servlet,在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它暂时会取代DispatcherServlet处理请求的功能,所以这个时候会出现一个新的问题,就是后台Handler方法中映射的请求会失效,所以还必须配合<mvc:annotation-driven />使用,设置<mvc:annotation-driven />是将默认servlet无法处理的请求交给dispatcherServlet处理。

这样配合使用之后,当浏览器输入请求时,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。

一般Web应用服务器默认的Servlet名称是”default”,因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是”default” 或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则需要通过default-servlet-name属性显示指定:

<mvc:default-servlet-handler default-servlet-name="xxx" />

3、解决方法二

方法二:使用<mvc:resources />

<!-- 配置静态资源的路径和映射 -->
<mvc:resources mapping="/static/**" location="/static/"/>
<!-- 配置MVC注解驱动 -->
<mvc:annotation-driven/>

location:表示静态资源的位置,就是指定不要拦截的目录,这里指在根目录static文件下的所有文件。注意:这些文件必须是在webapp根目录下的路径

mapping:表示静态资源的映射请求路径,/**表示匹配任意深度的路径。上面表示以resources开头的请求路径,例如:/resources/a,/resources/a/b

在映射路径的定义中,最后是两个 *,这是一种 Ant 风格的路径匹配符号,一共有三个通配符:

通配符
含义
** 匹配多层路径
* 匹配一层路径
? 匹配任意单个字符

注意:本地资源路径,必须是webapp根目录下的路径

4、解决方法三

方法三:在web.xml中配置defaultServlet的mapping

配置要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.html</url-pattern>
    <url-pattern>*.htm</url-pattern>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.gif</url-pattern>
    <url-pattern>*.ico</url-pattern>
</servlet-mapping>
作者: 唐浩荣
本文版权归作者和博客园共有,欢迎转载,但是转载需在博客的合适位置给出原文链接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/tanghaorong/p/14761081.html