八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)

news/2024/9/16 11:44:01/ 标签: spring boot, 前端, 后端, java, spring, web
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)

文章目录

  • 八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)
  • 1. 基本介绍
  • 2. 快速入门
    • 2.1 准备工作
  • 3. 改变静态资源访问前缀,定义为我们自己想要的
  • 4. 改变Spring Boot当中的默认的静态资源路径(实现自定义静态资源路径)
  • 5. 静态资源访问注意事项和细节
  • 6. 总结:
  • 7. 最后:


1. 基本介绍

SpringBoot 中对于静态资源的访问:

  1. 只要将静态资源放在类路径下: /static, /public, /resources, /META-INF/resources 就可以被直接访问-对应文件(这是 Spring Boot 的默认设置好的 )。关于这一点,我们从 WebProperties.java 这个类的源码上可以找到,对应的配置属性。

在这里插入图片描述

java">private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
注意:classpath:/resources/ 表示服务器就会在 resources 路径下找,你在浏览器当中输入的url地址的时候,不可以输入 resources 目录,因为服务器就是会在 classpath:/resources/ 找的,而如果你写了resources在浏览器上的话,你想表达的就是:让浏览器从resources/resouces的路径下找,这是找不到的报404错误

注意:classpath:/resources/ 表示服务器就会在 resources路径下找,你在浏览器当中输入的url地址的时候,不可以输入 resources 目录,因为服务器就是会在 classpath:/resources/ 找的,而如果你写了resources 在浏览器上的话,你想表达的就是:让浏览器从resources/resouces的路径下找,这是找不到的报404错误

  1. 常见静态资源: js,css,图片(.jpg,.png,.gif,.bmp,.svg) ,字体文件(Fonts)等
  2. 访问方式: 默认:项目根路径/+静态资源名 比如: http://localhost:8080/hi.html 。关于这一点,我们可以从 WebMvcProperties.java 类当中找到答案。

在这里插入图片描述

2. 快速入门

2.1 准备工作

在 pom .xml 文件中导入相关的 jar 依赖。如下

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.rainbowsea</groupId><artifactId>springboot_static_configuration</artifactId><version>1.0-SNAPSHOT</version><!--    导入SpringBoot 父工程-规定写法--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><!--    导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】--><!--    后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖--><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>

编写启动程序:

在这里插入图片描述

java">package com.rainbowsea.springboot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication  // 标志启动场景
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);}
}

从上面的基本介绍 当中,我们知道了,Spring Boot 默认静态资源的访问路径有4 个,我们这里就测试这四个路径是否可以直接访问

java">private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

注意:classpath 表示的是类路径,就是如图下面的: resources 目录,简单的说就是 classpath ===(等同于)resources

在这里插入图片描述

下面:我们分别在 resources 类路径下,创建对应的Spring Boot 默认的四个目录。如下图:
在这里插入图片描述

同时我们在这四个目录下,放入几张图片,用于访问测试。

在这里插入图片描述

启动程序运行测试:

在这里插入图片描述

打开浏览器进行直接访问静态资源文件:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:

java">private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
注意:classpath:/resources/ 表示服务器就会在 resources 路径下找,你在浏览器当中输入的url地址的时候,不可以输入 resources 目录,因为服务器就是会在 classpath:/resources/ 找的,而如果你写了resources在浏览器上的话,你想表达的就是:让浏览器从resources/resouces的路径下找,这是找不到的报404错误

在这里插入图片描述

resources/static 是Spring Bopt的默认静态路径,默认就是以“resources/static” 作为根路径访问的,所以,不需要再额外的加上 static 在浏览器上,如果你加了,那么你实际访问的是:resources/static/static这个路径,这个路径是不存在资源的,所以报错无法找到。

3. 改变静态资源访问前缀,定义为我们自己想要的

改变静态资源访问前缀,比如我们希望 http://locahost:8080/rainbowsea/* 下的请求路径,去请求静态资源,应用场景:静态资源访问前缀和控制器请求路径冲突。

我们这里需要用到 yaml 语法的内容,关于 yaml 语法想要了解的,大家可以移步至:✏️✏️✏️ 七,Spring Boot 当中的 yaml 语法使用-CSDN博客

首先,我们在 resources 类路径下创建一个名为 application.yaml 的文件。

在这里插入图片描述

编写如下内容:

在这里插入图片描述

spring:mvc:static-path-pattern: /rainbowsea/**

运行测试:

在这里插入图片描述

被我们改为了我们自己的 /rainbowsea/** 注意:后面的 /** 不可以省略 。不然无法访问的。

在这里插入图片描述


4. 改变Spring Boot当中的默认的静态资源路径(实现自定义静态资源路径)

Spring Boot 也是支持我们自定义静态资源路径,提高了灵活性。

改变默认的静态资源路径,比如:我们自己在类路径下增加 test 目录,作为静态资源路径,并完成测试。

同样要想改变 Spring Boot 当中的默认静态资源,这里我们还是使用 yaml 语法进行。在 resources 类路径下创建一个名为 application.yaml 的文件。

yaml 编写如下:

在这里插入图片描述

spring:web:resources:# 修改/指定 静态资源的访问路径/位置static-locations: ["classpath:/test/"] # 仿写
# 注意:尽量在最左边开始写,才有更多的提示

在这里插入图片描述

在 resources 类路径下,创建一个 test目录,同时在该目录下,放入一个名为 5.jpg 的图片,访问测试。

在这里插入图片描述

打开浏览器访问测试:

在这里插入图片描述

本质上: static-locations修改的是 WebProperties类当中staticlocations属性的值(也就是 springboot

的默认静态路径)。

所以这里我们修改了 Spring Boot 的默认静态资源路径,之前的放置在Spring Boot 默认的静态路径下的资源就无法被访问到了。

在这里插入图片描述

想要:保留原来Spring Boot 的默认静态资源路径,只需要把原来的Spring Boot 默认的路径添加上就可以了。

在这里插入图片描述

运行测试:

在这里插入图片描述

5. 静态资源访问注意事项和细节

  1. 注意:直接放在 resources 类的根路径下,是访问不到的。因为我们从 WebProperties 类源码上,就知道了,Spring Boot的默认静态资源路径,就只有四个,而 resources 类路径是不属于这四个当中的。
java">private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

运行测试:我们在 resources 类路径下,放入 6.jpg 图片,试试,可不可以被直接访问。

在这里插入图片描述

打开浏览器访问测试:

在这里插入图片描述

  1. 当默认请求的路径的资源的名字和 Controller 控制器请求处理的路径一样,冲突的时候。**优先看Controller能不能处理;不能,处理的请求交给静态资源处理,如果静态资源也找不到则相应点资源,则报:404找不到的,页面。

静态资源被访问原理:静态映射是 /** , 也就是对所有请求拦截,请求进来,先看Controller能不能处理,不能处理的请求交给静态资源处理,如果静态资源找不到则相应 404页面

在这里插入图片描述

在这里插入图片描述

java">package com.rainbowsea.springboot.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController // @Controller + @ResponseBody
public class HiController {@RequestMapping("1.jpg")  // Controller 控制处理的请求的路径和静态资源的名字冲突public String hi(){return "hi";}
}

在这里插入图片描述


6. 总结:

  1. 理解Spring Boot 静态资源放在类路径下: /static, /public, /resources, /META-INF/resources 就可以被直接访问-对应文件(这是 Spring Boot 的默认设置好的 )。关于这一点,我们从 WebProperties.java 这个类的源码上可以找到,对应的配置属性。
java">private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
注意:classpath:/resources/ 表示服务器就会在 resources 路径下找,你在浏览器当中输入的url地址的时候,不可以输入 resources 目录,因为服务器就是会在 classpath:/resources/ 找的,而如果你写了resources在浏览器上的话,你想表达的就是:让浏览器从resources/resouces的路径下找,这是找不到的报404错误
  1. 访问方式: 默认:项目根路径/+静态资源名 比如: http://localhost:8080/hi.html 。关于这一点,我们可以从 WebMvcProperties.java 类当中找到答案。
  2. 改变静态资源访问前缀,比如我们希望 http://locahost:8080/rainbowsea/* 下的请求路径,去请求静态资源,应用场景:静态资源访问前缀和控制器请求路径冲突。

在这里插入图片描述

  1. 改变Spring Boot当中的默认的静态资源路径(实现自定义静态资源路径)。

在这里插入图片描述

  1. 注意:直接放在 resources 类的根路径下,是访问不到的。因为我们从 WebProperties 类源码上,就知道了,Spring Boot的默认静态资源路径,就只有四个,而 resources 类路径是不属于这四个当中的。

7. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述


http://www.ppmy.cn/news/1522653.html

相关文章

为何iPhone 16系列的发布对苹果至关重要?

即将发布的iPhone 16系列对苹果来说将是至关重要的时刻&#xff0c;特别是在快速发展的AI智能手机市场背景下。随着Android制造商在集成先进AI功能方面领先一步&#xff0c;苹果正处于一个关键的转折点——赶上竞争对手不仅仅是选择&#xff0c;而是必须完成的任务。 AI竞赛&am…

【深度学习详解】Task3 实践方法论-分类任务实践 Datawhale X 李宏毅苹果书 AI夏令营

前言 综合之前的学习内容&#xff0c; 本篇将探究机器学习实践方法论 出现的问题及其原因 &#x1f34e; &#x1f34e; &#x1f34e; 系列文章导航 【深度学习详解】Task1 机器学习基础-线性模型 Datawhale X 李宏毅苹果书 AI夏令营 【深度学习详解】Task2 分段线性模型-引入…

正则表达式--python

正则表达式 1、简介 概述 正确的, 符合特定规则的 字符串. 英文名叫: Regular Expression, 简称叫: re, RegExp 作用 主要是校验数据 细节 学正则, 主要是学正则的规则. 即: 哪个符号表示什么含义. 关于正则, 要求很简单, 只要能用规则, 看懂别人写的式子, 且能简单修改即可,…

springboot、flowable 生成图片发布到Docker乱码问题

flowable自带的方法生成图片时&#xff0c;如设置字体为宋体&#xff0c;则本地测试没有问题&#xff0c;因为windows自带宋体字体库&#xff0c;但是如果发布到Docker&#xff0c;则会出现乱码问题&#xff0c;因为大部分Docker并不包含宋体字体库&#xff1b; 通过Java代码&a…

VitePress 路由重写:自定义目录结构与页面生成

在使用VitePress构建文档网站时&#xff0c;你可能会遇到项目结构复杂的情况&#xff0c;特别是当你的项目是一个包含多个包的monorepo时。为了更好地组织和管理文档&#xff0c;你可能希望将文档文件放置在源代码旁边。然而&#xff0c;VitePress默认会按照特定的目录结构生成…

springboot+mybatis+vue2分页功能开发

前端框架代码 <div class"block"><span class"demonstration">完整功能</span><el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"currentPage4":page-s…

Linux多线程——日志任务的线程池实现

文章目录 线程池日志系统完善线程池的实现线程数据线程池的实现完整代码 线程池 线程池可以说是把之前所有的内容全部串联起来的一个项目 我们这里实现一个简单的版本&#xff0c;可以对其进行扩展 线程池也是一种生产者消费者模型 生产者布置任务而消费者处理任务 主要运…

Android 存储之 SharedPreferences 编码模板(工具类编码)

一、SharedPreferences 1、基本介绍 SharedPreferences 是 Android 的一个轻量级存储工具&#xff0c;它采用 key - value 的键值对方式进行存储 它允许保存和读取应用中的基本数据类型&#xff0c;例如&#xff0c;String、int、float、boolean 等 保存共享参数键值对信息的…

html记账本改写:保存数据 localStorage。

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>记账本改写</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid…

Hive服务部署及Datagrip工具使用

目录 Hive服务部署 Hiveserver2服务 1&#xff09;用户说明 2&#xff09;Hiveserver2部署 &#xff08;1&#xff09;Hadoop端配置 &#xff08;2&#xff09;Hive端配置 3&#xff09;测试 &#xff08;1&#xff09;启动Hiveserver2 &#xff08;2&#xff09;使用命…

tio websocket 客户端 java 代码 工具类

为了更好地组织代码并提高可复用性&#xff0c;我们可以将WebSocket客户端封装成一个工具类。这样可以在多个地方方便地使用WebSocket客户端功能。以下是使用tio库实现的一个WebSocket客户端工具类。 1. 添加依赖 确保项目中添加了tio的依赖。如果使用的是Maven&#xff0c;可以…

第四章 类和对象(2)

4.2 类 类是封装对象的属性和行为的载体&#xff0c;Java中定义类使用class关键字&#xff0c;其语法如下&#xff1a; class 类名称{// 成员变量// 成员方法()} 在Java语言中对象的属性以成员变量的形式存在&#xff0c;对象的方法以成员方法的形式存在。本节将对类与对象进行…

WordPress的安装与简单开发教程

WordPress是目前世界上最受欢迎的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;它以简便易用、扩展性强和庞大的生态系统著称。通过它&#xff0c;你可以轻松构建博客、企业网站、电子商务平台等多种类型的网站。本文将为你介绍WordPress的安装过程&#xff0c;以及…

如何规避SQL注入漏洞

1 引言 对于很多初学者而言&#xff0c;SQL注入攻击是一种很容易被忽略的安全漏洞&#xff0c;其原理很简单&#xff0c;在日常编码中需要注意规避&#xff0c;养成良好的系统安全意识。 2 原理 SQL注入漏洞产生的根本原因&#xff0c;就是在编码过程中手动拼接sql参数造成的…

IOS 18 发现界面(UITableView)Banner轮播图实现

发现界面完整效果 本文实现Banner轮播图效果 文章基于IOS 17 基于UITabBarController实现首页TabBar继续实现发现界面 实现逻辑 从发现界面的效果图可以看出&#xff0c;发现界面是一个列表&#xff0c;列表包含了不同的Item&#xff0c;我们可以将 banner部分看成是列表的一…

分享基于PDF.JS的移动端PDF阅读器代码

一、前言 在之前的文章《分享基于PDF.js的pdf阅读器代码》里提到了PC端基于PDF.js的阅读器&#xff0c;本文将提供针对移动端的版本。 二、pdfViewer 为了能够直接使用&#xff0c;这里分享一下经过简单修改后能直接使用的pdfViewer代码&#xff1a; pdfViewer代码目录&…

webpack - 五大核心概念和基本配置(打包一个简单HTML页面)

// 五大核心概念 1. entry&#xff08;入口&#xff09; 指示Webpack从哪个文件开始打包2. output&#xff08;输出&#xff09; 指示Webpack打包完的文件输出到哪里去&#xff0c;如何命名等3. loader&#xff08;加载器&#xff09; webpack本身只能处理js&#xff0c;json等…

如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?

在当今的互联网世界中&#xff0c;网络请求是数据交换的基础。无论是在开发Web应用程序、自动化测试还是进行数据抓取&#xff0c;掌握如何发送网络请求是一项基本技能。Lua&#xff0c;作为一种轻量级、高性能的脚本语言&#xff0c;经常被用于这些场景。本文将详细介绍如何使…

C++11新增特性:列表初始化(std::initializer_list) decltype、auto、nullptr、范围for

C11新增特性&#xff1a;列表初始化&#xff08;std::initializer_list&#xff09;& decltype、auto、nullptr、范围for 一、C11新增统一初始化方式1.1 新增方式1.2 初始化容器底层原理&#xff08;std::initializer_list&#xff09; 二、新增声明2.1 decltype2.3 auto &…

uniapp设置微信小程序的交互反馈

链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗&#xff1a; title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon&#xff1a;error是设置我们失败的logo 设置的文字上…