SpringBoot 静态资源映射

文章目录

  • 一、静态资源映射
    • 1.1 什么是静态资源映射
    • 1.2 常见的静态资源映射方式
  • 二、SpringBooot默认配置
    • 2.1 resources 目录
    • 2.2 SpringBoot 默认配置
  • 三、SpringBoot手动配置
    • 3.1 配置属性
    • 3.2 自定义配置类
  • 参考资料

一、静态资源映射

1.1 什么是静态资源映射

资源映射指的是将应用程序中的资源(如静态文件、模板、图片等)与对这些资源的访问路径进行关联的过程。在Web应用程序中,资源映射是指将特定路径映射到项目中的特定资源文件或处理逻辑上

在Web开发中,常见的资源包括静态文件(如HTML、CSS、JavaScript)、模板文件(如JSP、Thymeleaf、FreeMarker等)、图片、音频等。这些资源通过映射规则可以在Web应用程序中被访问。

资源映射的目的是方便客户端通过HTTP请求来获取这些资源。

1.2 常见的静态资源映射方式

Spring Boot提供了灵活的资源映射机制,允许开发者根据需求配置静态资源的访问路径和位置。默认情况下,Spring Boot会将一些特定目录(如/static/public/resources/META-INF/resources)中的静态资源映射到根路径。这意味着这些目录下的资源文件可以通过根路径直接访问。

对于一些小的静态资源,直接 SpringBoot 规划静态资源,也是个不错的选择。

但是,在真实项目里,图片可以直接存储在对象存储的存储桶内或者直接用 Nginx 进行反代

二、SpringBooot默认配置

2.1 resources 目录

由于 src/main/resources 默认位于类路径 classpath 上,因此可以将静态资源放置在这个目录下。在编写项目时,通常会将静态资源放置在 /resources 目录下。而这个 resources 目录可以根据具体的使用途径分为 publicstatictemplates 等目录。不同目录的区别主要为:

  • public 目录:存放公共的静态资源文件,例如 CSS、JavaScript 等。这些文件会被直接映射到根路径,可以通过根路径直接访问
  • static 目录: 用于存放静态资源文件,如CSS、JavaScript、图片等。这些文件同样会被直接映射到根路径,可以通过根路径直接访问。在Spring Boot中,默认的静态资源目录。
  • templates 目录: 存放模板文件,例如Thymeleaf或FreeMarker模板文件。这些文件通常用于生成动态内容的视图。这个目录下的文件不会直接被访问,而是通过Controller生成的模型数据渲染生成HTML页面。

这些目录的区别在于它们的用途和映射规则。publicstatic 目录中的静态资源可以直接通过根路径访问,而 templates 目录下的文件需要由Controller生成的模型数据进行渲染后才能生成最终的HTML页面。选择使用哪个目录取决于你的项目需求和使用的模板引擎。

2.2 SpringBoot 默认配置

Spring Boot带有预先配置的 ResourceHttpRequestHandler 实现,以方便服务静态资源。

默认情况下,ResourceHttpRequestHandler处理器会处理 类路径 classpath 上的/static/public/resources/META-INF/resources这些目录里面的静态资源。 这意味着在这些目录下放置的静态资源可以通过根路径访问。例如,如果我们在类路径的 /static 目录中放置一个 about. html 文件,那么我们可以通过 http://localhost:8080/about.html 访问该文件。同样,我们可以通过在其他提到的目录中添加该文件来获得相同的结果。

但是,SpringBoot默认配置方式存在较大的缺点:将SpringBoot项目打包为 war 包时,将会把图片等项目中所有的静态资源全都打包进去,这显然对于发布维护是非常不方便的,因此我么可以将静态资源放置在服务器的某些磁盘中,并通过 SpringBoot 进行访问

三、SpringBoot手动配置

默认情况下,Spring Boot在请求的根部分下提供所有静态内容, /**。 即使它看起来是一个很好的默认配置,我们在一些情况下任需要修改。

SpringBoot内设置静态资源,或者说静态资源文件夹,主要有两种方法(均为SpringMVC实现):

  • application.yml/application.properties内配置属性。
  • 设置Configuration配置类

详细内容参考Spring官方文档:https://www.baeldung.com/spring-mvc-static-resources

3.1 配置属性

在Spring Boot中,可以通过在 application.ymlapplication.properties 文件中配置一些属性来定制应用程序的行为。以下是关于静态资源路径配置的两个属性的介绍:

(1)spring.mvc.static-path-pattern

spring.mvc.static-path-pattern :配置 Spring MVC 静态资源映射的路径模式。 这个配置项 指定了URL路径中用于访问静态资源的模式。例如,如果设置为 /myresources/**,那么类路径下的 /myresources/ 目录中的静态资源可以通过 /myresources/ 路径访问。这个配置项主要影响URL路径的结构,决定了客户端如何请求静态资源

举例来说,假设你有以下目录结构:

src
|-- main|-- resources|-- static|-- about.html

如果我们想通过 http://localhost:8080/content/about.html 访问同一个文件,我们可以在 application.properties 文件里面这样设置:

spring.mvc.static-path-pattern=/content/**

这个配置将使得所有以 /content/ 开头的URL路径都会去寻找静态资源,而这些静态资源默认情况下存放在 src/main/resources/static 目录中。

(2)spring.web.resources.static-locations

spring.web.resources.static-locations: 配置静态资源的位置。可以指定一个或多个路径,Spring Boot将在这些路径中查找静态资源。这对于将静态资源存储在项目外部,并通过相对路径访问它们非常有用。

举个例子,假设你有以下目录结构

src
|-- main|-- resources|-- myresources|-- about.html

设置 spring.web.resources.static-locations,具体代码如下:

spring.web.resources.static-locations=classpath:/myresources/, file:/path/to/external/resources/

在这个例子中,classpath:/myresources/ 表示在类路径下的 /myresources/ 目录中查找静态资源,file:/path/to/external/resources/ 表示在外部指定目录中查找静态资源。我们可以通过 http://localhost:8080/about.html 访问 about.html 这个文件

3.2 自定义配置类

在 SpringBoot 框架中,我们可以通过实现 WebMvcConfigrer 接口,来进行一些配置

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {// Implement configuration methods...
}

Spring 3.1引入了配置 ResourceHttpRequestHandlers 的 ResourceHandlerRegistry ,用于从类路径、WAR或文件系统提供静态资源。我们可以 在Web上下文配置类中以编程方式配置 ResourceHandlerRegistry

(1)ResourceHandlerRegistry 提供的函数

ResourceHandlerRegistry 提供了多个函数用于配置

  • addResourceHandler: 添加一个静态资源处理器,指定了URL路径模式。
  • addResourceLocations: 指定静态资源的位置,可以是类路径下的目录(使用 classpath: 前缀)或外部文件系统的路径(使用 file: 前缀)

这样的配置允许你同时映射不同路径的静态资源到不同的位置,包括类路径和外部文件系统。

(2)创建配置类

src/main/java/config 目录里,创建了一个配置类 WebConfig,并实现了 WebMvcConfigurer 接口,通过重写 addResourceHandlers 方法来自定义静态资源的映射规则。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {// 1. 映射 /myresources/** 到类路径下的 /myresources/ 目录registry.addResourceHandler("/myresources/**").addResourceLocations("classpath:/myresources/");// 2. 映射 /externalresources/** 到外部文件系统的指定目录//    注意:需要替换成实际的外部文件系统路径registry.addResourceHandler("/externalresources/**").addResourceLocations("file:/path/to/external/resources/");// 3. 映射 /custompath/** 到外部文件系统的另一个指定目录//    注意:需要替换成实际的外部文件系统路径registry.addResourceHandler("/custompath/**").addResourceLocations("file:/path/to/another/directory/");}
}

参考资料

Serve Static Resources with Spring | Baeldung (推荐阅读资料)

Static Resources :: Spring Framework (SpringBoot 官方教程)

SpringBoot多种方法处理静态资源:设置并访问静态资源目录_SpringBoot 静态资源-CSDN博客

SpringBoot 自定义静态资源映射目录(配置addResourceHandler和addResourceLocations映射静态资源地址)-CSDN博客

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

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

相关文章

客服系统即时通讯Nginx配置支持WebSocket

如果遇到搭建好客服系统后,发消息不能即时通知推送,那就是webscoket部分没有配置正确 在反向代理的配置块里 增加以下两句 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";proxy_set_header Upgrade $http…

jenkins设置Jenkinsfile的pipeline脚本 nohup运行

问题 默认情况下,jenkins pipiline 会kill 掉衍生后台的子进程,比如nohup 命令等。 解决 设置环境变量即可。withEnv([‘JENKINS_NODE_COOKIEdontKillMe’]) stage(上传到阿里云OSS) {steps{script {withEnv([JENKINS_NODE_COOKIEdontKillMe]){sh so…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具,用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体,能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

用RASP五步轻松保护云端无服务器架构

近年来无服务器架构发展势头正猛,预计未来十年将增长近25%。据称,2022年无服务器架构市场的规模超过了90亿美元,年复合增长率预计将增加。到2032年,市场规模可能超过900亿美元。 这表明,在组织日益采用DevOps的影响下&…

Python从入门到网络爬虫(日期和时间详解)

Python 日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜(历元&…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

Avalonia学习点征集

你对什么内容感兴趣? 你需要集成哪些功能控件? 你需要研究哪些第三方库? 你需要实现什么功能? 我自己写的自己感兴趣的,没有体系。 我自己写太单薄,无法及时更新最新的。 向大家征集学习点。也希望大…

OCS2 入门教程(四)- 机器人示例

系列文章目录 前言 OCS2 包含多个机器人示例。我们在此简要讨论每个示例的主要特点。 System State Dim. Input Dim. Constrained Caching Double Integrator 2 1 No No Cartpole 4 1 Yes No Ballbot 10 3 No No Quadrotor 12 4 No No Mobile Manipul…

问答:攻击面发现及管理

Q1: 长亭云图极速版(Cloud Atlas)是什么? A1: 它是长亭科技推出的一款攻击面管理运营平台,目的是将企业的网络安全从被动防御转变为主动出击,提前于攻击者采取措施。 Q2: 长亭云图极速版的主要功能包括哪些&#xff…

vue中的防抖和节流

在Vue中,防抖和节流是两种常用的优化技术,用于限制事件的触发频率,以提高页面性能。 防抖(Debounce)是指在事件被触发后,等待一段时间后再执行回调函数。如果在这段等待时间内,事件又被触发&am…

逻辑回归(Logistic Regression)

什么是机器学习 逻辑回归(Logistic Regression)虽然名字中包含"回归"一词,但实际上是一种用于解决分类问题的统计学习方法,而不是回归问题。它是一种线性模型,常用于二分类问题,也可以扩展到多分…

【亲测】申请腾讯云免费服务器流程,2024新版教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云百科txybk.com分享2024年最新腾讯云免费服务器…

vue3 修饰符大全(近万字长文)

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、事件修饰符(Event Modifiers)1、.stop(阻止事件冒泡)2、.prevent(阻止事件的默认行为)3、.capture(使用事件捕获模式…

Istio 专栏目录

Istio 知识学习 1. Istio 限流:本地限流全局限流 2. istio envoy 理解 3. istio 灰度发布相关概念(蓝绿发布、A/B 测试、金丝雀发布) 4. istio 认证:对等身份认证服务请求认证 5. istio 熔断器 trafficPolicy 学习 Istio 配置定…

如何优雅的搭建一个轻量化的网站

本地网页 这里我找到了一个带有简单的悬停变色效果的个人博客网站模板。用来演示这次的轻量化网站搭建。你可以复制这段代码到一个txt文件中,修改文件后缀名为html即可得到一个最简单的静态网页文件。在没有搭建网站服务器时,本机可以通过直接双击该文件…

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失。 一、首先会对这几种损失进行介绍: 1、背景 由于EIOU是在CIOU的基础上改进的,为方便理解,此处贴出CIOU的计算公式,其他GIOU、DIOU不作介绍。 CIOU公式如下所示: b ,…

C++ 中的指针和引用有什么区别?

C 中的指针和引用有什么区别? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!&#…

alibabacloud学习笔记02(小滴课堂)

什么是注册中心和常见的注册中心有哪些 介绍什么是Nacos和搭建实战 启动Nacos 使用前要先安装jdk。 linux学习专栏笔记中有,大家可以去看。 关闭nacos: 这样我们就登录了nacos。 项目集成Nacos实现服务直接的调用 每个子模块都去添加。 给每个子模块配置nacos配…

C++力扣题目--94,144,145二叉树非递归(迭代)遍历

为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢? 我们在栈与队列:匹配问题都是栈的强项 (opens new window)中提到了,递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地…

面试真经:一个程序员的深度心路历程

前言 在求职的海洋中,我们都像一叶孤舟,迷失方向。但经过无数次的面试探索,我们终将找到了属于自己的航道。 面试前的精心筹备 面对即将到来的面试,准备阶段是非常重要的。必须投入一定的时间和精力,了解目标岗位的…