Spring MVC静态资源映射

news2024/12/23 14:15:02

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.coloradmin.cn/o/868848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用蓝牙外设却不小心把台式机电脑蓝牙关了

起因 今天犯了一个贼SB的错误&#xff0c;起因是蓝牙键盘突然就不能输入了&#xff08;虽然是连接状态&#xff0c;但是按什么键都没有反应&#xff09; 原来我的解决方法就是重启一下电脑&#xff0c;但是那会电脑开了贼多的软件。我就想重启也太麻烦了&#xff0c;既然重启…

Java之继承

继承 继承为什么使用继承继承是什么继承的语法访问父类成员访问父类成员变量访问父类成员方法 super关键字子类构造方法super和this异同分别的使用方法 继承的方式final关键字 作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等…

【算法挨揍日记】day02——双指针算法_快乐数、盛最多水的容器

202. 快乐数 202. 快乐数https://leetcode.cn/problems/happy-number/ 题目&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个…

Python接口自动化之request请求封装

我们在做自动化测试的时候&#xff0c;大家都是希望自己写的代码越简洁越好&#xff0c;代码重复量越少越好。那么&#xff0c;我们可以考虑将request的请求类型&#xff08;如&#xff1a;Get、Post、Delect请求&#xff09;都封装起来。这样&#xff0c;我们在编写用例的时候…

OptaPlanner笔记2

1.5.3 使用maven 修改pom.xml 导入optaplanner-bom以避免为每一个依赖项重复添加版本号 <project>...<dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-bom</art…

使用 CycleGAN 进行图像到图像转换

介绍 在人工智能和计算机视觉领域,CycleGAN 是一项非凡的创新,它重新定义了我们感知和操作图像的方式。这种尖端技术彻底改变了图像到图像的转换,实现了领域之间的无缝转换,例如将马变成斑马或将夏日风景变成雪景。在本文中,我们将揭开 CycleGAN 的魔力,并探索其在各个领…

微信小程序开发价格

小程序开发费用 小程序的开发费用是很多企业和个人在规划项目时需要重点考虑的一个方面。本文将从微信认证费、域名、服务器、程序开发费用、微信支付费率以及维护费用等多个角度为大家分析小程序开发费用的组成。 1. 微信认证费&#xff1a;作为小程序的一种信任凭证&#xf…

对文件的读取和修改 JAVA

目录 1、try catch:2、hasNextLine():3、java读取某个文件夹信息&#xff1a;4、修改&#xff1a; 1、try catch: 1、try语句对你觉得可能会有问题的语句进行尝试 2、try内语句出现错误会被catch语句捕捉&#xff0c;且整个程序不会崩溃 3、try语句出错才会执行下方catch语句…

机器学习实战4-数据预处理

文章目录 数据无量纲化preprocessing.MinMaxScaler&#xff08;归一化&#xff09;导库归一化另一种写法将归一化的结果逆转 preprocessing.StandardScaler(标准化)导库实例化查看属性查看结果逆标准化 缺失值impute.SimpleImputer另一种填充写法 处理分类型特征&#xff1a;编…

C++ 学习系列3 -- 函数压栈与出栈

在C中&#xff0c;函数压栈&#xff08;函数调用&#xff09;和出栈&#xff08;函数返回&#xff09;是函数调用过程中的两个关键步骤。下面将逐步解释这两个过程&#xff1a; 一 函数压栈与出栈过程简介 函数压栈&#xff08;函数调用&#xff09;的过程如下&#xff1a; …

深入Python字典

在Python中&#xff0c;字典是通过哈希表实现的。也就是说&#xff0c;字典是一个数组&#xff0c;而数组的索引是键经过哈希函数处理后得到的。哈希函数的目的是使键均匀地分布在数组中。由于不同的键可能具有相同的哈希值&#xff0c;即可能出现冲突&#xff0c;高级的哈希函…

开封Geotrust单域名https证书推荐

Geotrust作为全球领先的数字证书颁发机构之一&#xff0c;拥有多年的数字证书颁发经验&#xff0c;其数字证书被广泛应用于电子商务、在线支付、企业通讯、云计算等领域&#xff0c;为用户提供了安全可靠的保障。而Geotrust旗下的单域名https证书是大多数客户创建网站时的选择之…

最容易理解的C51单片机4位密码锁示例代码(附proteus电路图)

说明&#xff1a;开机启动就是上图这样的&#xff0c;密码正确显示P&#xff08;pass&#xff09;,密码错误显示E&#xff08;error&#xff09; #include "reg51.h" #include "myheader.h" #define uchar unsigned char long int sleep_i0; int pwd[4]{0…

Linux 库文件——静态库和共享库

一、库文件的概念 库是一组预先编译好的方法&#xff08;.o文件&#xff09;的集合。Linux系统存储的库的位置一般在&#xff1a;/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在/usr/include 下或其子目录下。 库有两种&…

一个Demo搞定前后端大文件分片上传、断点续传、秒传

原文链接&#xff1a;https://juejin.cn/post/7266265543412351030 前言 文件上传在项目开发中再常见不过了&#xff0c;大多项目都会涉及到图片、音频、视频、文件的上传&#xff0c;通常简单的一个Form表单就可以上传小文件了&#xff0c;但是遇到大文件时比如1GB以上&…

Leetcode-每日一题【剑指 Offer 28. 对称的二叉树】

题目 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称…

利用三维内容编辑器制作VR交互课件,简单好用易上手

随着虚拟现实技术的不断发展&#xff0c;越来越多的教育机构开始尝试将其应用于教育教学中。然而&#xff0c;要实现这一目标并不容易&#xff0c;需要专业的技术支持和开发团队。 为了解决这一问题&#xff0c;广州华锐互动研发了三维内容编辑器&#xff0c;它是一种基于虚拟现…

13.3 目标检测和边界框

锚框的计算公式 假设原图的高为H,宽为W 详细公式推导 以同一个像素点为锚框&#xff0c;可以生成 (n个缩放 m个宽高比 -1 )个锚框 给训练集标注锚框 每个锚框包含的信息有&#xff1a;每个锚框的类别 和 偏移量。 偏移量指的是&#xff1a;真实边界相对于锚框的偏移量。 …

Android系统-ServiceManager1

目录 引言 概念 启动 流程图 main binder_open binder_become_context_manager binder_ioctl binder_ioctl_set_ctx_mgr binder_new_node binder_loop binder_write binder_ioctl binder_ioctl_write_read binder_thread_write binder_parse bio_init bio_in…

新鲜出炉的小工具,将Claude 100K转化为免费可用的OpenAI API

上个月转载了一篇文章&#xff0c;讲的就是刚刚发布的Claude 2.0&#xff0c;可以说是非常强大了&#xff1a;ChatGPT最强竞品Claude2来了&#xff1a;代码、GRE成绩超越GPT-4&#xff0c;免费可用 但是可惜的是&#xff0c;Claude虽然免费使用&#xff0c;但是不开放API给我们…