基于SpringBoot启动类静态资源路径问题
作者:「已注销」 发布时间:2023-07-20 05:53:16
SpringBoot启动类静态资源路径
SpringBoot核心配置类
SpringBoot核心JAR包--》spring-boot-autoconfigure-2.2.6.RELEASE.jar
其下面有--》org.springframework.boot.autoconfigure.web
其中有类--》ResourceProperties
类中这样定义默认静态资源访问:
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
分别是一下四个静态资源路径
/META-INF/resources/
/resources/
/static/
/public/
静态资源都是再classpath中,那么问题来了,IDEA中的classpath在哪里呢 ?我们来看
点击进入项目的结构设计中--》首先在打开的项目窗口打开File->Project Structure...,得到如下图所示的项目结构:
Source Folders表示的都是代码源文件目录,生成的class文件会输出到target->classess文件夹中,但是里面的源文件不会复制到target->classes文件夹中,Test Source Folders表示的都是测试代码源文件目录,生成的class文件同样会输出到target->classess文件夹中,并且里面的源文件不会复制到target->classes文件夹中。
而Recource Folders表示的都是资源文件目录,这些目录里面的文件会在代码编译运行被直接复制到target->classess文件夹中。target->classes即为classpath,任何我们需要在classpath前缀中获取的资源都必须在target->classes文件夹中找到,否则将出现java.io.FileNotFoundException的错误信息。
如果想添加一些自己的目录到Source Folders、Resource Folders这样的目录分类里来实现编译过后正确地文件输出,则可以点击需要设置的文件夹,再在文件结构窗口上方的Make as:后面选择正确的目录类型即可。
所以我们的项目静态资源的文件夹访问就是以这里的Resource Folder为基准,举个例子:
classpath:/static/指的就是:src/main/resources/static
所以SpringBoot的默认index.xml可以放在路径为src/main/resources/static的文件夹下,这样项目一启动index.html就自动加载了。
我们将src设置成了Resource Folders,接下来我们在src下创建/META-INF/resources/路径:
我们启动项目(这个时候是没有建立任何类,启动类启动加载默认的index)
成功展示index.html的内容,没有问题。其他几个路径都是没有问题的,
这里有一个问题就是这几个路径的人顺序问题。我们封闭建立这样四个路径,分别设置不同的内容:
启动后输出的还是HelloWorld,现在我们删掉/META-INF/resources/的index.html再看看:
成功输出。其他的就不再试了,明确的是它的默认加载顺序是按照源码里的顺序来的。分别是:
/META-INF/resources/
/resources/
/static/
/public/
private String[] appendSlashIfNecessary(String[] staticLocations) {
String[] normalized = new String[staticLocations.length];
for (int i = 0; i < staticLocations.length; i++) {
String location = staticLocations[i];
normalized[i] = location.endsWith("/") ? location : location + "/";
}
return normalized;
}
//循环遍历存放这几个路径,按照顺序加载。
静态文件存放位置设置
默认配置
SpringBoot把类路径下的/static,/public,/resources和META-INF/resources文件下的静态文件映射为/,可以通过http://localhost:8080/访问
SpringBoot默认了静态文件的位置src/main/resources下的static目录,如下:
static目录需要自己创建。HTML也可以放在里面
src/main/resources
|_static
|_js
|_img
|_demo.png
|_css
在html代码中使用一下代码即可访问图片
<img src="img/demo.png">
自定义位置
添加一个目录位置
src/main/resources
|_myImg
|_demo.png
|_static
|_js
|_img
|_css
添加一个@Configuration注解的配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 自定义的图片路径
* @author pzr
*
*/
@Configuration
public class MyImageAddr extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler中的是访问路径,可以修改为其他的字符串
//addResourceLocations中的是实际路径
registry.addResourceHandler("/myImg/**").addResourceLocations("classpath:/myImg/");
super.addResourceHandlers(registry);
}
}
在html代码中使用一下代码即可访问图片
<img src="/myImg/demo.png">
来源:https://blog.csdn.net/ww1130212073cf/article/details/105309450
猜你喜欢
- 最近正式入坑Flutter,首先从环境搭建开始,看了网上好多关于Windows环境搭建的资料,基本都是按官方文档写的,看完的感受是,还不如直
- 1.饿汉模式饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader
- 问题描述Feign 在请求时是不会将 request 的请求头带着请求的,导致假如 Feign 调用的接口需要请求头的信息,比如当前用户的
- 定义在类里面的类就叫做内部类。内部类的特点:在内部类中可以直接访问外部类的成员,包括私有的成员在外部类中不能直接访问内部类的成员,必须通过创
- 前言自从用了SpringBoot,个人最喜欢的就是SpringBoot的配置文件了,和Spring比起SpringBoot更加灵活,修改的某
- 使用对象访问类中的成员:对象名.成员变量;对象名.成员方法();成员变量的默认值:具体实例代码:public class StudentTe
- 本文实例讲述了Java基于余弦方法实现的计算相似度算法。分享给大家供大家参考,具体如下:(1)余弦相似性通过测量两个向量之间的角的余弦值来度
- 一、java方法重写方法的重写是子类根据需求对父类继承的方法进行重新的编写,在重写时,可以使用super方法的方式来保留父类中的方法,注意:
- 笔者语录: 我发现我喜欢捣鼓一些小玩意儿,虽然官网(见文末)写得很明白了,但是咱们对感兴趣的部分来敲一遍代码好吧。过滤器简介:简介logba
- 题目要求思路:模拟解题的核心思想在于逆向思维,不考虑每个子数组中的唯一字符个数,转而考虑每个字符可以作为多少个子数组的唯一字符;所以在计算答
- 匿名内部类:先举个例子吧,给大家看一下什么是匿名内部类,Endeavor刚刚接触的时候,觉得哇哦,好奇怪的样子,这也太别扭了吧,不知道大家是
- Web Services 可以将应用程序转换为网络应用程序。通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项
- MyBatis-plus模糊查询在使用MyBatis-plus的时候,一些基础的增删改查可以不用再自己写sql了:public interf
- 本文实例讲述了java取两个字符串的最大交集的实现方法,分享给大家供大家参考。具体实现方法如下:package com.itheima.ne
- 前言C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性,这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的
- 由于springboot常用war包部署,改为cloud开发模式多端口情况下,部署反而不习惯毕竟,war包要不要项目名访问都必须放在tomc
- Spring读取配置文件Document在XmlBeanDefinitionReader.doLoadBeanDefinitions(Inp
- 1. mapper.xml设置resultTyperesultType="com.alibaba.fastjson.JSONObj
- 前言前阵子有同学反馈Flutter中的http请求无法通过fiddler抓包,作者喜欢使用Charles抓包工具,于是抽时间写了个小demo
- 本文主要介绍了SpringBoot配置文件中的明文密码如何加密保存,读取以及对于自定义的加密算法加密的参数如何保存和读取。背景为了安全的需要