zoukankan      html  css  js  c++  java
  • 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>
    
    作者: 唐浩荣
    本文版权归作者和博客园共有,欢迎转载,但是转载需在博客的合适位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    java泛型
    跨域传递
    laravel的一些语法
    去重
    laravel的一些查询语句
    mysql把之前表单进行拆分
    Laravel5.1接收json数据
    thinkphp5 composer安装验证码
    关于地图经纬度的问题
    tp5分组查询
  • 原文地址:https://www.cnblogs.com/tanghaorong/p/14761081.html
Copyright © 2011-2022 走看看