基于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在哪里呢 ?我们来看

基于SpringBoot启动类静态资源路径问题

点击进入项目的结构设计中--》首先在打开的项目窗口打开File->Project Structure...,得到如下图所示的项目结构:

基于SpringBoot启动类静态资源路径问题

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就自动加载了。

基于SpringBoot启动类静态资源路径问题

我们将src设置成了Resource Folders,接下来我们在src下创建/META-INF/resources/路径:

基于SpringBoot启动类静态资源路径问题

我们启动项目(这个时候是没有建立任何类,启动类启动加载默认的index)

基于SpringBoot启动类静态资源路径问题

成功展示index.html的内容,没有问题。其他几个路径都是没有问题的,

这里有一个问题就是这几个路径的人顺序问题。我们封闭建立这样四个路径,分别设置不同的内容:

基于SpringBoot启动类静态资源路径问题

启动后输出的还是HelloWorld,现在我们删掉/META-INF/resources/的index.html再看看:

基于SpringBoot启动类静态资源路径问题

成功输出。其他的就不再试了,明确的是它的默认加载顺序是按照源码里的顺序来的。分别是:

  • /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

标签:SpringBoot,启动类,静态资源,路径
0
投稿

猜你喜欢

  • FFmpeg 音频可视化解码流程详解

    2023-04-03 00:41:54
  • Android中的设计模式

    2022-09-13 06:33:21
  • Java设计模式之java备忘录模式详解

    2023-08-22 19:31:07
  • SpringMVC 参数绑定之视图传参到控制器的实现代码

    2021-12-29 11:54:17
  • springcloud微服务之Eureka配置详解

    2021-06-15 14:35:28
  • spring AOP的After增强实现方法实例分析

    2023-06-10 13:52:06
  • Android轻松画出触摸轨迹

    2022-05-07 11:02:03
  • 详解java爬虫jsoup解析多空格class数据

    2021-12-30 14:47:41
  • C#编程实现获取文件夹中所有文件的文件名

    2022-11-16 07:53:10
  • MyBatis批量添加、修改和删除

    2023-12-07 05:13:31
  • 基于Java Socket实现一个简易在线聊天功能(一)

    2023-09-23 17:18:35
  • java使用Jdom实现xml文件写入操作实例

    2022-09-30 02:38:23
  • 基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

    2023-09-24 23:51:17
  • 一篇文章弄懂JVM类加载机制过程以及原理

    2022-01-19 10:32:57
  • 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    2021-09-04 05:48:21
  • Android自定义实现BaseAdapter的优化布局

    2022-10-29 14:56:59
  • C#如何自定义multipart/form-data的解析器

    2023-12-04 18:59:03
  • Spring集成Redis详解代码示例

    2023-05-04 00:58:25
  • Android仿微信语音聊天功能

    2022-11-24 03:36:12
  • Android数据持久化之File机制分析

    2021-05-29 19:24:56
  • asp之家 软件编程 m.aspxhome.com