SpringMVC中静态资源的处理

时间:2019-08-24
本文章向大家介绍SpringMVC中静态资源的处理,主要包括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_folder\java_studying\java_tools\apache-tomcat-9.0.12\conf\web.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所拦截。


如何处理静态资源被拦截

有三种方式:

  • 方式一:手动排除法

在我们的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去处理该请求。

当然不好的地方是,如果你需要拦截*.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中处理静态资源的三种方式

原文地址:https://www.cnblogs.com/heliusKing/p/11405986.html