10 SpringBoot 静态资源访问

我们在开发Web项目的时候,往往会有很多静态资源,如html、图片、css等。那如何向前端返回静态资源呢?

以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要把静态资源放在该目录下就可以直接访问。

但是,基于Spring boot的工程并没有这个目录,那我们应该怎么处理?

我们通过最原始的方法和springboot中的方法分别进行说明

1、原始方式

​ 我们首先来分享一种最笨的办法,就是将静态资源通过流的方式直接返回给前端,步骤如下:

01、我们在maven工程的resources的根目录下建立一个html的目录,然后我们把html文件放在该目录下

image-20221012160440854

2、/static/ 方式

并且规定任何访问路径以 /static/ 开头的才能访问 /html 目录下的静态资源,其实现如下:

前端访问的 Url 是:http://localhost:8080/static/login.html

前端访问的 Url 中的 uri 是:/static/login.html

实际访问的是类路径下:newUrl = /xxxxxx/webapps/ROOT/WEB-INF/classes/html/login.html

使用流的方式写出到客户端:

FileReader reader = new FileReader(new File(newUrl));
response.getOutputStream().write(sb.toString().getBytes()); 
@Controller
public class StaticResourceController {@RequestMapping("/static/**")public void getHtml(HttpServletRequest request, HttpServletResponse response) {String uri = request.getRequestURI(); // static/login.htmlString[] arr = uri.split("static/"); String resourceName = "index.html";  // 默认值是访问index.htmlif (arr.length > 1) {resourceName = arr[1]; // login.html}//类路径下:/xxxxxx/webapps/ROOT/WEB-INF/classes/html/login.htmlString url = StaticResourceController.class.getResource("/").getPath() + "html/" + resourceName;try {// 读取类路径下的静态资源文件FileReader reader = new FileReader(new File(url));BufferedReader br = new BufferedReader(reader);StringBuilder sb = new StringBuilder();String line = br.readLine();while (line != null) {sb.append(line);line = br.readLine();}//使用流的方式写出到客户端response.getOutputStream().write(sb.toString().getBytes());response.flushBuffer();} catch (IOException e) {e.printStackTrace();}}
}

其实现过程很简单,就是先从路径中分离出来资源uri,然后从static目录下读取文件,并输出到前端。

因为只做简单演示,所以这里只处理了文本类型的文件,图片文件可以做类似的处理。当然,我们在实际中肯定不会这么做,Spring Boot 也肯定有更好的解决办法。

不过这个办法虽然有点笨,但确是最本质的东西,无论框架如何方便的帮我们处理了这类问题,但是抛开框架,我们依然要能够熟练的写出一个web项目,只有知道其实现原理,你才会在遇到问题时能得心应手。

现在我们再来看看Spring boot对静态资源的支持。

3、Spring boot默认静态资源访问方式

​ Spring boot默认访问的就是 /** ,所以Spring boot访问:当前项目根路径/ + 静态资源文件名就会自动的找到对应的文件。对应的文件在 类路径下默认的四个静态资源文件目录下,因此

Spring boot默认对/**的访问 是可以直接访问类路径下的四个静态资源目录下的文件:

  • classpath:/public/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/META-INFO/resouces/

我们现在就在资源文件resources目录下建立如下四个目录:
image-20221012151542126

​ 注意蓝色条下的资源文件夹resources与类路径下的文件夹classpath:/resources是不同的,蓝色条下的resources代表的是该目录下的文件为资源文件(即类路径),在打包的时候会将该目录下的文件全部打包的类路径下,这个名称是可以改的,在pom.xml指定资源目录即可:

image-20221012152839194

<resources><resource><directory>src/main/resources</directory></resource>
</resources>

​ 而类路径下的resources是spring boot默认的静态资源文件夹之一,和public、static以及MEAT-INFO/resources的功能相同。现在我们重启Spring boot就可以通过:

http://localhost:8080/1.html

http://localhost:8080/2.html

http://localhost:8080/3.html

http://localhost:8080/4.html

都可以访问。

4、Spring boot指定静态资源访问前缀

​ 前面我们讲过,如果使用springboot默认访问/** 的方式,默认访问的是类路径下的resourcespublicstaticMEAT-INFO/resources四个默认的静态资源目录下的文件,访问方式是:当前项目根路径/+静态资源名,如:http://localhost:8080/login.html。但如果在Controller中映射的请求也是 /login.html 则如何处理?

image-20221012151723629

以代码方式说明,代码如下:

01、controller代码

@RestController
public class HelloController {@RequestMapping("/login.html")public String login(Model model){return "request mapping login.html";}
}

2 login.html 代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1> This is login.html page content </h1>
</body>
</html>

3 主启动类代码

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

4 启动Springboot主启动类,访问 http://localhost:8080/login.html 测试结果如下:

image-20221012151912277

我们发现,请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源可以找到,则返回静态资源文件,如果静态资源也找到返回404。原因是默认访问的是/**,springboot的一些拦截器会对 类路径下的所有资源进行拦截,从而导致直接访问controller。

那么Springboot中是如何解决上述问题呢?

​ 可以在springboot配置文件中进行指定访问静态资源的前缀例如:/res代表前缀,从而可以跟根据前缀映射到对应的静态资源,底层实现的原理和之前的原始方式相同。因此 在指定访问静态资源的前缀后,访问静态资源是:当前项目+/res/ +静态资源文件名 = 在静态资源文件夹下查找静态资源文件。

04.在application.properties/yml配置文件中使用 spring.mvc.static-path-pattern=/res/**

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

05、启动主启动类,分别访问

  • http://localhost:8080/res/login.html
  • http://localhost:8080/login.html

06、运行结果分别如下:

image-20221012152045092

5、自定义静态资源目录

​ springboot除了可以指定静态资源访问路径的前缀情况下,还可以不使用springboot的默认静态资源目录resources、public、static及MEAT-INFO/resources,可以使用spring.web.resources.static-locations自定义指定类路径下资源访问目录,但是指定后类路径下的默认的静态资源路径则失效。因为这个配置会覆盖Spring boot默认的静态资源目录,例如如果按示例中配置,则无法再访问static、public、resources等目录下的资源了。

image-20221012155258879

以代码方式说明:

01、在application.properties/yml配置文件中添加配置spring.web.resources.static-locations

spring.mvc.static-path-pattern=/res/**
spring.web.resources.static-locations= classpath:/demodir/

02、启动主启动类,分别访问:

http://localhost:8080/res/demo.html
http://localhost:8080/res/login.html
image-20221012155924923

image-20221012155939992

03、除了在配置文件中配置外,也可以通过代码配置(了解)

​ 我们现在就来自定义一个静态资源目录,我们定义一个images的目录来存放图片,所有/image/**的路径都会访问images目录下的资源:

@Configuration
public class PublicMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/public/**").addResourceLocations("classpath:/public/");}
}

WebMvcConfigurerAdapter是Spring提供的一个配置mvc的适配器,里面有很多配置的方法,addResourceHandlers就是专门处理静态资源的方法

6、Springboot静态资源访问总结。

​ 本文主要给大家分享了Spring boot 对静态资源的处理方式,Spring boot 默认可以访问:

classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

四个目录下的静态资源,我们也可以根据自己的需要进行个性化配置。

   最后,需要说明一点的是,如果这四个目录中存在相同名称的资源,那会优先返回哪个目录下的资源呢?大家通过static-locations的默认值顺序应该能猜到,默认情况下,Spring boot会优先返回/META-INF/resources下的资源。当然,因为我们可以自定义static-locations的值,所以这个优先顺序也是可以调整的。

7、注意:访问JS、JQ等静态资源需方式。

01、方式一:直接加载static下的文件

将所引用的版本下载好
引入jar包

//使用thymeleaf
<script type="text/javascript" th:src="@{/js/jquery-3.3.1.min.js}"></script>//一起放在static下
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>

02、方式二:.引入pom,自动映射 /webjars/**

<dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.5.1</version>
</dependency>

image-20221012160139493

<!--	引入jQuery--><script type="text/javascript" th:src="@{/webjars/jquery/3.5.1/jquery.min.js}"></script>

03、方式三:在线引入

<script th:src="@{https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js}"></script>

8、静态资源原理

​ 找到springmvc的自动配置类webmvcAutoConfiguration自动配置类

image-20221012160215331

image-20221012160229414

资源处理的默认规则:

image-20221012160246455

读取静态资源目录的顺序:

image-20221012160301924

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

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

相关文章

信号与系统实验MATLAB-实验2-连续时间系统的时域分析

实验二 连续时间系统的时域分析 一、实验目的 1、掌握连续时间信号卷积及其MATLAB实现方法&#xff1b; 2、掌握连续系统的冲激响应、阶跃响应及其MATLAB实现方法&#xff1b; 3、掌握利用MATLAB求LTI系统响应的方法&#xff1b; 4、掌握利用MATLAB求函数卷积和解微分方程…

学习grdecl文件格式之后的事情

学习了grdecl文件格式&#xff0c;搞地质的专业人士都知道&#xff0c;这是专门用在地质上的油藏软件&#xff08;个人感觉就是斯伦贝谢的Petrel的&#xff09;的一种文件格式&#xff0c;正好自己也在学习三维的开发&#xff0c;顺手写了一个简单的读取grdecl算法&#xff0c;…

Vue3【十九】自定义Hooks钩子 将数据和方法分组

Vue3【十九】自定义Hooks钩子 将数据和方法分组 Vue3【十九】自定义Hooks钩子 将数据和方法分组 每个分组都可以放置 各种生命周期钩子 分组和可以使用计算属性等 案例截图 目录结构 代码 person.vue <template><div class"person"><h2>Vue3自定…

Linux指令学习(4)

目录 0.普通用户和root用户之间的切换 1.head/tail指令 2.管道 3.date命令 4.三个查找相关的指令 5.文件过滤grep 6.打包和压缩 5.zip/unzip指令 0.普通用户和root用户之间的切换 &#xff08;1&#xff09;这个我们之前不是经常使用这个root用户吗&#xff0c;现在随着…

数据结构笔记39-48

碎碎念&#xff1a;想了很久&#xff0c;不知道数据结构这个科目最终该以什么笔记方式呈现出来&#xff0c;是纸质版还是电子版&#xff1f;后来想了又想&#xff0c;还是电子版吧&#xff1f;毕竟和计算机有关~&#xff08;啊哈哈哈哈哈哈哈&#xff09; 概率论已经更新完了&…

【Python入门与进阶】Jupyter Notebook配置与优化

目录 1.Jupyter Notebook简介 2.Jupyter Notebook的安装 2.1 命令行安装 2.2 可视化界面安装 3.Jupyter Notebook的使用 3.1 启动 Jupyter Notebook 3.2 Jupyter Notebook 界面介绍 3.3 创建新的 Notebook 3.4 编写和运行代码单元 3.5 使用 Markdown 编写文档 3.6 保…

快慢指针在字符串中的应用-443. 压缩字符串

题目链接及描述 443. 压缩字符串 - 力扣&#xff08;LeetCode&#xff09; 题目分析 这个题目总体不算太难&#xff0c;如果之前接触过双指针&#xff08;快慢指针&#xff09;的话&#xff0c;比较好做。题目可以理解为计算数组中对应各个连续字符出现的次数&#xff0c;并将…

SAPUI5基础知识5 - 控件(control)的使用

1. 背景 在SAPUI5中&#xff0c;控件&#xff08;Control&#xff09;是构建用户界面的基本元素。控件是一个可重用的组件&#xff0c;它可以与用户进行交互或显示信息。 每个控件都有自己的特性&#xff0c;例如属性&#xff08;Properties&#xff09;、聚合&#xff08;Agg…

btrace:binder_transaction+eBPF+Golang实现通用的Android APP动态行为追踪工具

一、简介&#xff1a; 在进行Android恶意APP检测时&#xff0c;需要进行自动化的行为分析&#xff0c;一般至少包括行为采集和行为分析两个模块。其中&#xff0c;行为分析有基于规则、基于机器学习、基于深度学习甚至基于大模型的方案&#xff0c;各有各的优缺点&#xff0c;不…

kettle实时增量同步mysql数据

** 本文主要介绍运用kettle实时增量同步mysql数据 ** Debezium介绍 官网地址&#xff1a;https://debezium.io/documentation/ Debezium是一个开源项目&#xff0c;为捕获数据更改(Capture Data Change,CDC)提供了一个低延迟的流式处理平台&#xff0c;通过安装配置Debeziu…

Aigtek高压功率放大器在超声电机中的应用

超声电机是一种先进的电机技术&#xff0c;常用于各种应用&#xff0c;如医疗成像、工业自动化和汽车技术。这些电机在高速、高精度和低噪音要求的领域中表现出色。在驱动这些超声电机时&#xff0c;高压功率放大器发挥着关键作用。本文将介绍高压功率放大器如何驱动超声电机&a…

【kyuubi-spark】从0-1部署kyuubi集成spark执行spark sql到k8s读取iceberg的minio数据

一、背景 团队在升级大数据架构 前端使用trino查询&#xff0c;对trino也进行了很多优化&#xff0c;目前测试来看&#xff0c;运行还算稳定&#xff0c;但是不可避免的trino的任务总会出现失败的情况。原来的架构是trino失败后去跑hive&#xff0c;而hive是跑mapreduce依赖于…

c->c++(一):部分KeyWord

本文主要探讨c相关关键字的使用。 char char默认是unsigned/signed取决平台,wchar_t宽字符:用于Unicode编码(超过一个字节),用wcin和wcout输入输出,字符串为wstring char8_t(20),char16_t(11起),char32_t(11):指定占用字节数且是无符号,字符串类u8string,u16s…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

Python 中国象棋游戏【含Python源码 MX_011期】

简介&#xff1a; 中国象棋是一种古老而深受喜爱的策略棋类游戏&#xff0c;也被称为中国的国粹之一。它在中国有着悠久的历史&#xff0c;起源可以追溯到几个世纪以前。Python 中国象棋游戏是一个用Python编程语言编写的软件程序&#xff0c;旨在模拟和提供中国象棋的游戏体验…

CVE-2024-23692:Rejetto HFS 2.x 远程代码执行漏洞[附POC]

文章目录 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 CVE-2024-23692&#xff1a;Rejetto HFS 2.x 远程代码执行漏洞[附POC] 0x01 前言 …

Elasticsearch:简化数据流的数据生命周期管理

作者&#xff1a;来自 Elastic Andrei Dan 今天&#xff0c;我们将探索 Elasticsearch 针对数据流的新数据管理系统&#xff1a;数据流生命周期&#xff0c;从版本 8.14 开始提供。凭借其简单而强大的执行模型&#xff0c;数据流生命周期可让n 你专注于数据生命周期的业务相关方…

干货!电脑如何录屏?6款win10录屏大师软件深度测评

电脑如何录屏&#xff1f;在2024年&#xff0c;截图或屏幕录制可以说是一种无价的工具。它是捕捉重要信息、与朋友和同事分享说明&#xff0c;或者只是存储您最喜爱的游戏和应用程序中的记忆的好方法。在 Windows 上录制屏幕非常简单。在本篇文章中&#xff0c;我们将讨论在win…

113.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-结构体数据更新思路分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

绘唐科技官网

绘唐科技AI工具是一系列经过训练的人工智能工具&#xff0c;旨在提供各种智能化的解决方案。这些工具可以应用于多个领域&#xff0c;包括自然语言处理、图像识别、语音识别、机器学习等。 其中&#xff0c;自然语言处理工具可以帮助用户处理和理解文本数据。它可以实现文本分类…