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

@


1. 基本介绍

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

  1. 只要将静态资源放在类路径下: /static, /public, /resources, /META-INF/resources 就可以被直接访问-对应文件(这是 Spring Boot 的默认设置好的 )。关于这一点,我们从 WebProperties.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>

编写启动程序:

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 个,我们这里就测试这四个路径是否可以直接访问

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 默认的四个目录。如下图:

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

启动程序运行测试:

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

注意:

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 类路径是不属于这四个当中的。
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页面

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 这个类的源码上可以找到,对应的配置属性。
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. 最后:

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

八,SpringBoot Web 开发访问静态资源(附+详细源码剖析)的更多相关文章

  1. SpringBoot——Web开发(静态资源映射)

    静态资源映射 SpringBoot对于SpringMVC的自动化配置都在WebMVCAutoConfiguration类中. 其中一个静态内部类WebMvcAutoConfigurationAdapt ...

  2. 十二、springboot之web开发之静态资源处理

    springboot静态资源处理 Spring Boot 默认为我们提供了静态资源处理,使用 WebMvcAutoConfiguration 中的配置各种属性. 建议大家使用Spring Boot的默 ...

  3. SpringBoot: 5.访问静态资源(转)

    springboot默认从项目的resources里面的static目录下或者webapp目录下访问静态资源 方式一:在resources下新建static文件(文件名必须是static) 在浏览器中 ...

  4. springboot+themeleaf+bootstrap访问静态资源/无法访问静态资源/图片

    在网页HTML上访问静态资源的正确写法例: 1.<img src="../../static/bootstarp/img/2.jpg"     th:src="@{ ...

  5. Springboot 系列(五)Spring Boot web 开发之静态资源和模版引擎

    前言 Spring Boot 天生的适合 web 应用开发,它可以快速的嵌入 Tomcat, Jetty 或 Netty 用于包含一个 HTTP 服务器.且开发十分简单,只需要引入 web 开发所需的 ...

  6. springboot程序无法访问静态资源

    今天开发遇到了一个很奇葩的错误,再spngboot程序成功运行后发现无法访问再resouces/static下的静态资源,通过rul访问总是404,原因最终锁定在某配置类的一个标签上: @Enable ...

  7. JUC.Lock(锁机制)学习笔记[附详细源码解析]

    锁机制学习笔记 目录: CAS的意义 锁的一些基本原理 ReentrantLock的相关代码结构 两个重要的状态 I.AQS的state(int类型,32位) II.Node的waitStatus 获 ...

  8. SpringBoot之Web开发——webjars&静态资源映射规则

    在webjars中找到需要引入的Maven依赖,添加到pom.xml中,即可自动导入相关依赖.

  9. JUC.Condition学习笔记[附详细源码解析]

    目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Condition的数据结构 线程何时阻塞和释放 await()方法 ...

  10. SpringBoot:关于默认连接池Hikari的源码剖析

    1.起因 因为这两天在给公司的一个项目升级SpringBoot版本,遇到了一些坑,升级项目版本:SpringBoot1.5.x到SpringBoot2.0.x 今天早上双库操作遇到一个问题:jdbcU ...

随机推荐

  1. 为什么springboot推荐使用Thymeleaf?

    前端那么多好的框架 为什么springboot推荐使用Thymeleaf? 前端框架和模板引擎不是一种东西: 模板引擎:Thymeleaf.freemarker.JSP. 前端框架:vue.angul ...

  2. Web1.0、Web2.0 和 Web3.0 的区别

    Web1.0.Web2.0 和 Web3.0 的区别主要体现在以下几个关键方面: 内容创作与交互: Web1.0:内容主要由网站所有者或少数专业人员创建,用户大多只是被动接收信息.例如,早期的雅虎.新 ...

  3. js 异步 任务 题目解析(chatgpt bug了?)

    最近遇到一道题如下,求输出结果 感觉还是蛮有意思的,找chatgpt做了一下 我是题 async function async1(){ console.log('1'); await async2() ...

  4. 深入解读RabbitMQ工作原理

    RabbitMQ简介 在介绍RabbitMQ之前首先要介绍一下MQ,MQ是什么?MQ全称是Message Queue,可以理解为消息队列的意思. RabbitMQ是一个实现了AMQP(Advanced ...

  5. [oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键

    转义字符 回忆上次内容 最近玩的是\n.\r 之外的转义序列 \a是 ␇ (bell) \t是 水平制表符 \v是 换行不回车 通过 16 进制数值转义 \xhh 把(hh)16 进制对应的 asci ...

  6. 机器学习:详解什么是端到端的深度学习?(What is end-to-end deep learning?)

    什么是端到端的深度学习? 深度学习中最令人振奋的最新动态之一就是端到端深度学习的兴起,那么端到端学习到底是什么呢?简而言之,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理.那么端到端深度学 ...

  7. 【Java】CompletableFuture 异步任务编排

    参考视频资料: https://www.bilibili.com/video/BV1nA411g7d2 https://www.bilibili.com/video/BV1S54y1u79K 一.启动 ...

  8. 【DataBase】MySQL 10 SQL函数 单行函数其四 其他函数

    其他函数 -- 其他函数 -- MySQL版本查看 SELECT VERSION(); -- DATABASE 当前所属的数据库查看 SELECT DATABASE(); -- USER 当前用户 S ...

  9. 【C】Re04

    一.类型限定符 extern 声明一个变量,extern声明的变量没有存储空间 const 定义一个常量,该常量必须赋值,之后且不允许更改 volatile 防止编译器优化代码??? register ...

  10. 构建人工智能的工具 —— VXscan-R:数字孪生环境软件模块

    地址: https://www.creaform3d.com.cn/zh/ji-liang-jie-jue-fang/vxscan-rshu-zi-luan-sheng-huan-jing-ruan- ...