Java SpringMVC 集成静态资源的方式你了解吗

 更新时间:2021年10月26日 15:32:22   作者:路人甲Java  
本篇文章主要介绍了SpringMVC集成静态资源的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、本文内容

  • 静态资源 & jsp 是被谁处理的?
  • 如何让 springmvc 处理所有请求?
  • springmvc 如何处理静态资源?
  • springmvc 处理静态资源的 2 种方案、区别、原理详解

2、静态资源 & jsp 是被谁处理的?

不知大家是否注意了一个问题,我们将 web 项目发布到 tomcat 后,可以直接访问 jsp 后缀的文件,或者直接访问项目中的静态资源(js/css/图片之类的文件),只要路径写的没有问题,都可以正常在浏览器中显示,大家是否思考过,是谁在处理这个请求呢?

tomcat 是一个 servlet 容器,servlet 容器中通常有 servlet 来处理各种请求,那么当我们访问静态资源或者 jsp 的时候,当然也是由 servlet 来处理这些请求的,但是我们并没有在 web.xml 中配置由哪个 servlet 来处理这些请求啊,这是因为 tomcat 中自动帮我们配置了一些默认的 servlet 来处理这类的请求。

tomcat 的安装目录中有个 web.xml 文件,位于(apache-tomcat-9.0.46\conf\web.xml),这个文件相当于对发布到 tomcat 中的所有 web 项目的默认配置,我们来看一下这个文件,有几个重要的 servlet 配置信息,这些 servlet 可以用来处理 jsp 后置的文件或者静态资源,抽取部分配置如下

<servlet>
 <servlet-name>defaultservlet-name>
 <servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
 <load-on-startup>1load-on-startup>
servlet>
<servlet>
 <servlet-name>jspservlet-name>
 <servlet-class>org.apache.jasper.servlet.JspServletservlet-class>
 <load-on-startup>3load-on-startup>
servlet>
<servlet-mapping>
 <servlet-name>defaultservlet-name>
 <url-pattern>/url-pattern>
servlet-mapping>
<servlet-mapping>
 <servlet-name>jspservlet-name>
 <url-pattern>*.jspurl-pattern>
 <url-pattern>*.jspxurl-pattern>
servlet-mapping>

配置中主要定义了 2 个 servlet

JspServlet 用来处理 jsp 文件

DefaultServlet 会处理/开头的请求,这里重点说下这个 servlet 的处理逻辑,它会处理所有其他 servlet 不匹配的请求,当一个请求过来之后,会先去匹配其他的 servlet,当找不到匹配的 servlet 的时候,才会走 DefaultServlet

我们可以在项目中的 web.xml 中对 tomcat/config/web.xml 中的配置进行覆盖,即项目中的 web.xml 相对于 tomcat 中的 web.xml 有更高的优先级。

3、如何让 springmvc 处理所有请求?

如果我们想让 springmvc 来处理所有的请求,怎么做呢?只需修改 web.xml 中的配置,将 springmvc 这个 servlet 的 url-pattern 的值设置为/就可以了,此时所有的请求都会被 springmvc 处理,即所有的请求都会被DispatcherServlet处理。

4、问题来了:静态资源 404 了

当我们将上面 springmvc 的 url-pattern 改为/时,大家可以自己去试试,此时再访问静态资源的时候,如下图,会报 404,这个请求被 DispatcherServlet 接收了,但是这个 servlet 默认情况下并没有处理静态资源的能力,即找不到请求的资源,所以才会报 404

springmvc 提供了 2 种解决方案,来看下。

5、方案 1:使用

在 springmvc 的配置文件中添加下面配置

<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

这里说一下原理

1、加入配置后,框架会创建DefaultServletHttpRequestHandler对象,这个对象会将请转发给 tomcat 的 default 这个 servlet 处理,所以静态资源就可以正常访问了

2、注意:配置中的第 1 行也必须加上,如果不加上,@RequestMapping 的请求就无法处理了

3、这种用法有个前提是,web 容器中需要有 default 这个 servlet,且这个 servlet 可以处理静态资源

6、方案 2:使用

从 spring3.0 版本后,spring 定义了专门处理静态资源访问请求的处理器ResourceHttpRequestHandler,并且添加了标签,用来处理静态资源无法访问的问题。

需要在 springmvc 配置文件中添加如下配置

<mvc:annotation-driven/>
<mvc:resources mapping="/imgs/**" location="/static/imgs/"/>
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>

mvc:resource 标签用来指定请求的静态资源的 url 和本地地址的映射关系

mapping:用来指定请求的地址的,比如/imgs/**:可以匹配任何以 imgs 开头的 url,如:/imgs/1.jpg、/imgs/2.jpg、/imgs/order/3.jpg

location:用来指定静态资源所在项目中的目录

注意:配置中的第 1 行也必须加上,如果不加上,@RequestMapping 的请求就无法处理了

这种用法不依赖于 web 容器,所以比第一种方案要好一些,也建议大家用这种方案。

上面代码中配置了 3 行 mvc:resources,可以优化下,如下

<mvc:resources mapping="/static/**" location="/static/"/>
</mvc:resources mapping=

7、总结

tomcat 默认能够处理 jsp 和静态资源,是因为 tomcat 中默认有 2 个 servlet:default jsp

到此我们已经知道如何让 springmvc 来处理所有请求了,只需要在 web.xml 中调整一下 url-pattern 的值为/就可以了

默认情况下,springmvc 无法处理静态资源,本文介绍了 2 种方式,大家可以回头在再去看看,第一种需要依赖于 web 容器中的 default 这个 servlet,使用上面对 web 容器有依赖作用;而第 2 种方式是 springmvc 推荐的方式,更好一些,对 web 容器没有依赖

不管用那种方式,都不要忘记了这个注解,否则咱们自定义的 controller 中的@RequestMapping 就无效了

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • springboot如何重定向携带数据 RedirectAttributes

    springboot如何重定向携带数据 RedirectAttributes

    这篇文章主要介绍了springboot如何重定向携带数据 RedirectAttributes,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 详解如何将Spring Boot应用跑在Docker容器中

    详解如何将Spring Boot应用跑在Docker容器中

    这篇文章主要介绍了详解如何将Spring Boot应用跑在Docker容器中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Java中Final关键字的使用技巧及其性能优势详解

    Java中Final关键字的使用技巧及其性能优势详解

    这篇文章主要介绍了Java中Final关键字的使用技巧及其性能优势详解,Java中的final关键字用于修饰变量、方法和类,可以让它们在定义后不可更改,从而提高程序的稳定性和可靠性,此外,final关键字还有一些使用技巧和性能优势,需要的朋友可以参考下
    2023-10-10
  • JFreeChart插件实现的折线图效果实例

    JFreeChart插件实现的折线图效果实例

    这篇文章主要介绍了JFreeChart插件实现的折线图效果,结合实例形式分析了基于JFreeChart绘制折线图的相关实现技巧,需要的朋友可以参考下
    2016-08-08
  • 浅谈Java 并发的底层实现

    浅谈Java 并发的底层实现

    这篇文章主要介绍了浅谈Java 并发的底层实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Window搭建部署RocketMQ步骤详解

    Window搭建部署RocketMQ步骤详解

    这篇文章主要介绍了Window搭建部署RocketMQ步骤详解,RocketMq是一个由阿里巴巴开源的消息中间件,脱胎去阿里每部使用的MetaQ,在设计上借鉴了Kafka。,需要的朋友可以参考下
    2019-06-06
  • 关于java自定义线程池的原理与实现

    关于java自定义线程池的原理与实现

    本文介绍了如何自定义线程池和阻塞队列,包括阻塞队列的实现方法,线程池的构建以及拒绝策略的应用,详细阐述了线程池中任务的提交和执行流程,以及如何处理任务超出队列容量的情况
    2022-04-04
  • Eclipse引用XSD实现XML配置文件提示标签的方法

    Eclipse引用XSD实现XML配置文件提示标签的方法

    今天小编就为大家分享一篇关于Eclipse引用XSD实现XML配置文件提示标签的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Struts1简介和入门_动力节点Java学院整理

    Struts1简介和入门_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Struts1简介和入门的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • Java9垃圾回收方法finalize() 原理解析

    Java9垃圾回收方法finalize() 原理解析

    这篇文章主要介绍了Java9垃圾回收方法finalize() 原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论