Spring MVC静态资源映射

Spring MVC静态资源映射

    • 静态资源映射。
    • 使用容器的默认Servlet
    • location
    • mapping:
    • cache-period
    • order

Spring MVC需要对RESTful风格的URL提供支持,而真正的RESTful风格的URL不应该带有任何后缀,因此将Spring MVC拦截的URL改为“/”(正如前面在web.xml文件中配置的/),这意味着DispatcherServlet会拦截所有请求——包括所有对静态资源的请求。
Spring提供了强大的静态资源处理功能,Spring支持以下两种静态资源处理方法:

静态资源映射。

使用容器的默认Servlet

。当使用静态资源映射这种方式时,Spring MVC在配置文件中使用<mvc:resources…/>元素为静态资源映射一个虚拟路径,接下来其他资源(或浏览器)即可通过该虚拟路径来访问静态资源。
在使用<mvc:resources…/>时可指定如下属性。

location

:必需属性,指定被映射的静态资源的物理路径。

mapping:

必需属性,指定被映射的静态资源的虚拟路径,其他资源或浏览器可以通过该路径来访问静态资源。

cache-period

:可选属性,指定该静态资源的缓存时间,单位是秒。默认不发送任何缓存头,仅依赖last-modified时间戳进行缓存。

order

:可选属性,指定处理静态资源映射的Handler的order值。该值越小优先级越高。
例如,本示例打算为应用界面添加Bootstrap支持,这样就需要为应用添加Bootstrap的CSS库、JS库以及jQuery的JS库,这些CSS库和JS库都是静态资源,因此需要对它们进行映射。

本示例将Bootstrap的CSS库和JS库以及jQuery的JS库统一放在resources目录下,该目录下的静态资源和子目录如图
在这里插入图片描述
其中,resources目录下的bootstrap-4.3.5子目录用于存放Boostrap的CSS库和JS库;在resources目录下还保存了jquery-3.4.5.min.js库。
此外,在images目录下存放了该应用要使用的图片,因此也需要对images目录进行映射。
接下来在Spring MVC的配置文件中增加如下配置片段。
在这里插入图片描述

上面配置片段添加了两个最简单的
<mvc:resources…/>
元素,分别为/resources/和/images/两个目录下的资源提供映射。
上面的mapping属性值支持Ant风格的路径,也就是说,它允许使用?、、**等通配符,其中“?”代表单个任意字符,“”代表多个任意字符,“**”代表该目录及其任意深度所有子目录下的任何文件。

通过<mvc:resources…/>元素为静态资源映射了虚拟路径之后,接下来在页面中要通过虚拟路径来引用这些静态资源。例如,如下代码可用于添加CSS库和JS库。

在这里插入图片描述

上面粗体字代码引入CSS库和JS库时,都是从“/应用根路径/res/”开始的——代码中的${pageContext.request.contextPath}代表应用根路径,/res/就是前面<mvc:reresources…/>元素映射的虚拟路径。

如果要访问应用中的图片资源,同样需要使用<mvc:resources…/>元素映射的虚拟路径。例如如下代码片段:
在这里插入图片描述

上面的/imgs/也是<mvc:resources…/>元素映射的虚拟路径。浏览该页面,可以看到呈现如图所示的效果。
在这里插入图片描述

从图中可以看出,该页面是Bootstrap美化后的页面,这说明该页面已成功引入了Bootstrap的CSS库和JS库等静态资源。

如果希望显式控制浏览器对静态资源的缓存,则可为<mvc:resources…/>元素添加cache-period属性或<cache-control…/>子元素。其中,cache-period属性只能指定一个整数值代表缓存时间(单位是秒),而<cache-control…/>子元素则可控制更多的缓存选项。
不管是cache-period属性还是<cache-control…/>子元素,都可通过添加“Cache-Control”响应头来控制浏览器缓存;如果不指定cache-period属性和<cache-control…/>子元素,则只生成“Last-Modified”响应头。
假如希望控制浏览器对/resources/目录下的静态资源缓存一天,则可在Spring MVC的配置文件中增加如下配置片段:
在这里插入图片描述

也可通过<cache-control…/>子元素来控制缓存,该子元素可指定如下额外的属性,这些属性可为“Cache-Control”响应头生成更多额外的指令。
➢ must-revalidate:true或false,用于为“Cache-Control”响应头添加must-revalidate指令。当缓存的响应过期时,该指令控制是否重新验证缓存。
➢ no-cache:true或false,用于为“Cache-Control”响应头添加no-cache指令。该指令控制是否总是重新验证缓存的响应。
➢ no-store:true或false,用于为“Cache-Control”响应头添加no-store指令。该指令控制是否永不缓存响应。
➢ no-transform:true或false,用于为“Cache-Control”响应头添加no-transform指令。该指令控制缓存是否先对响应进行转换(例如压缩、优化以节省空间)。
➢ cache-public:true或false,用于为“Cache-Control”响应头添加public指令。该指令控制是否任何缓存都允许缓存服务器响应。
➢ cache-private:true或false,用于为“Cache-Control”响应头添加private指令。该指令控制是否使用私人缓存,而不是共享缓存来缓存服务器响应。
➢ proxy-revalidate:true或false,用于为“Cache-Control”响应头添加proxy-revalidate指令。该指令与must-revalidate指令的功能大致相同,区别是该指令仅对共享缓存有效。
➢ max-age:用于为“Cache-Control”响应头添加max-age指令,控制缓存服务器响应的时间(单位是秒)。该指令与<mvc:resources…/>元素的cache-period属性的功能基本相同。
➢ s-maxage:用于为“Cache-Control”响应头添加s-maxage指令,该指令与max-age指令的功能大致相同,区别是该指令仅对共享缓存有效。
➢ stale-while-revalidate:用于为“Cache-Control”响应头添加stale-while-revalidate指令,该指令控制缓存数据过期多少秒之内依然有效。

➢ stale-if-error:用于为“Cache-Control”响应头添加stale-if-error指令。当错误发生时,该属性指定的数值控制缓存的过期响应还可使用多少秒。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/64024.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tidevice+appium在windows系统实施iOS自动化

之前使用iOS手机做UI自动化都是在Mac电脑上进行的&#xff0c;但是比较麻烦&#xff0c;后来看到由阿里开源的tidevice工具可以实现在windows上启动WDA&#xff0c;就准备试一下&#xff0c;记录一下过程。 tidevice的具体介绍可以参考一下这篇文章&#xff1a;tidevice 开源&…

【单片机毕业设计】【hj-001】温度控制 | 恒温箱 | 保温箱 | 恒温孵化器 | 环境检测 | 温度检测

一、基本介绍 项目名&#xff1a; 基于单片机的温度控制系统设计 基于单片机的恒温箱系统设计 基于单片机的保温箱系统设计 基于单片机的恒温孵化器系统设计 基于单片机的环境检测系统设计 基于单片机的温度检测系统设计 项目编号&#xff1a;mcuclub-hj-001 单片机类型&…

2023年新手如何学剪辑视频 想学视频剪辑如何入门

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。接下来&#xff0c;一起来看看新手如何学剪…

Android高通8.1 Selinux问题

1、最近客户提了一个需求&#xff0c;说要在user版本上面切分辨率&#xff0c;默认屏幕分辨率是2.5 k 执行adb shell指令之后变成 4k 然后adb shell wm size可以查看 2、一开始我能想到就是在文件节点添加权限&#xff0c;这里不管是mtk还是qcom&#xff08;高通平台&#xff…

gitblit-使用

1.登入GitBlit服务器 默认用户和密码: admin/admin 2.创建一个新的版本库 点击图中的“版本库”&#xff0c;然后点击图中“创建版本库” 填写名称和描述&#xff0c;注意名称最后一定要加 .git选择限制查看、克隆和推送勾选“加入README”和“加入.gitignore文件”在图中的1处…

MyBatis源码解析手写持久层框架

1. 手写持久层框架 1.1 JDBC操作数据库_问题分析 JDBC API 允许应用程序访问任何形式的表格数据&#xff0c;特别是存储在关系数据库中的数据 代码示例&#xff1a; public static void main(String[] args) { Connection connection null;PreparedStatement preparedState…

【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

正如标题所说&#xff0c;本文会图文详细解析三道单链表OJ题&#xff0c;分别为&#xff1a; 反转链表 &#xff08;简单&#xff09; 链表的中间节点 &#xff08;简单&#xff09; 链表的回文结构 &#xff08;较难&#xff09; 把他们放在一起讲的原因是&#xff1a; 反转链…

PHP Mysql查询全部全部返回字符串类型

设置pdo属性 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);

JAVA初体验 (HelloWorld)

1.编写代码 文件名字HelloWorld.java public class HelloWorld{public static void main(String [] args){System.out.printf("hello world!");} } 2.编译&#xff08;cmd&#xff09; javac HelloWorld.java 运行完之后 会出现一个 HelloWorld.class 3.运行 j…

0基础学习VR全景平台篇 第83篇:智慧眼-怎么理解分类?

一、功能说明 分类可以理解为&#xff0c;为了方便城市运营工作的管理所实行的行政区划&#xff0c;如XXX乡镇、XXX街道等等。 二、后台编辑界面 1、点击【新增】&#xff0c;填写分类的名称&#xff0c;若有上一级分类&#xff0c;那么还需选择父级分类&#xff0c;建议从最…

WordPress 子主题(child theme)介绍

经常开发WordPress主题的朋友往往会遇到一个困惑&#xff0c;虽然主题提供了默认设置&#xff0c;也自带了不少自定义功能&#xff0c;可以满足大部分的场景使用&#xff0c;但毕竟众口难调&#xff0c;一些个性化的需求难免无法满足&#xff0c;这时就必须得修改主题文件来实现…

解决MySQL与Redis缓存一致性的问题

背景 考试系统中&#xff0c;教师会在后台发布一场考试&#xff0c;考试会存储在MySQL和Redis里面&#xff0c;考试有时候是会出错的&#xff0c;我们需要后台修改&#xff0c;如果多个教师在后台并发修改&#xff08;概率不大&#xff09;&#xff0c;可能会出现数据库缓存不…