zoukankan      html  css  js  c++  java
  • SpringMVC中静态资源的处理

    web项目中web.xml配置

    在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet

    <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <url-pattern>/</url-pattern> <!--注意这里-->
    </servlet-mapping>
    

    这里的url-pattern有两种配置方式

    1. .扩展名,比如.do,古老的方式,不会导致静态资源文件被拦截的问题,但 是不支持RESTful编码风格
    2. /,支持RESTful风格,但是会导致静态资源文件被拦截

    还有一种错误的配置方式

    /*,错误的方式,可以请求到Controller方法,但是跳转到JSP时会被拦截,JSP不能正常显示 XX

    一般来说,企业中更多的是采用第二种配置方式,但这导致了静态资源被拦截


    静态资源为什么会被拦截??

    我们知道,我们的web项目最终要部署到服务器上,以我们熟悉的Tomcat服务器为例进行说明。

    当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:work_folderjava_studyingjava_toolsapache-tomcat-9.0.12confweb.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成 <url-pattern>/</url-pattern>

    会覆盖掉全局web.xml中对于静态资源的处理,具体可以参考全局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/img.png,显然是Controller里面是没有这个映射路径的。


    如何处理静态资源被拦截

    有三种方式:

    • 方式一:手动排除法

    在我们的web.xml添加如下配置

    <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.jpg</url-pattern>
        </servlet-mapping>
    

    其他地方保持不变,这个粒度显然是比<url-pattern>/</url-pattern>更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。

    当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用

    • 方式二:在springmvc的配置文件中加入<mvc:default-servlet-handler/>
    <mvc:default-servlet-handler/>
    
    • 方式三:在springmvc配置文件中手动指定静态资源路径
        <!-- 设置静态资源不过滤 -->
        <mvc:resources location="/css/" mapping="/css/**" />
        <mvc:resources location="/img/" mapping="/img/**" />
        <mvc:resources location="/js/" mapping="/js/**" />
        <mvc:resources location="/plugins/" mapping="/plugins/**" />
    

    ,这种方式更灵活,功能更丰富,也是可以的


    注意 springmvc配置文件中这个配置<mvc:annotation-driven />推荐每次都加
    以上就上springmvc中处理静态资源的三种方式

    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11405986.html
Copyright © 2011-2022 走看看