SpringBoot对静态资源的映射规则

目录

什么是SpringBoot静态资源映射?

如何实现SpringBoot静态资源映射?

[1. webjars:以jar包的方式引入静态资源](#1. webjars:以jar包的方式引入静态资源)

示例:

[2. /** 访问当前项目的任何资源](#2. /** 访问当前项目的任何资源)

示例一:

示例二:

[3. 静态首页(欢迎页)映射](#3. 静态首页(欢迎页)映射)

示例:


什么是SpringBoot静态资源映射?

在 Web 应用中会涉及到大量的静态资源,例如 JS、CSS 和 HTML 等。我们知道,Spring MVC 导入静态资源文件时,需要配置静态资源的映射;但在 SpringBoot 中则不再需要进行此项配置,因为 SpringBoot 已经默认完成了这一工作。

Spring Boot 默认为我们提供了 3 种静态资源映射规则:

  • WebJars 映射
  • 默认资源映射
  • 静态首页(欢迎页)映射

如何实现SpringBoot静态资源映射?

1. webjars:以jar包的方式引入静态资源

在传统的Web应用开发中,我们经常需要使用众多的JavaScript和CSS库,例如jQuery.js和Bootstrap.css。这些Web资源通常被复制到Java Web项目的`webapp`目录下进行管理。然而,在Spring Boot项目中,应用是以JAR包的形式部署的,不存在`webapp`目录。为了解决这个问题,我们可以通过Webjars将Web资源封装成JAR包的形式提供。具体来说,就是将Web资源(如JavaScript和CSS文件)打包成一个JAR文件,并上传到Maven中央仓库进行集中管理。当Spring Boot项目需要引入这些前端资源时,可以在Maven Central页面查找所需资源的Maven依赖项,并将它们添加到项目中。这样,Spring Boot项目就可以方便地引入和管理前端资源了。

示例:

将web资源Jquery.js 引入进Spring Boot 项目中

(1)首先Maven Central搜索Jquery依赖

(2)复制Maven版的依赖代码

(3)引入该依赖

Spring Boot通过其MVC自动配置类`WebMvcAutoConfiguration`为Webjars前端资源设置了默认的映射规则。根据源码分析,Webjars资源的访问路径 被定义为`/webjars/**`。这意味着,任何以`/webjars/**`开头的请求,Spring Boot都会在`classpath:/META-INF/resources/webjars/`路径下搜索对应的Webjars资源。

(4)启动Spring Boot 项目,浏览器器输入 http://localhost:8080/webjars/jquery/3.7.1/jquery.js 访问 jquery.js 静态资源

说明访问静态资源成功了。上面的这种方式是导入jar包的方式,如果我们要用自己的一些JS、CSS、jQuery文件可不可以呢?答案是可以的,所以就有了我们下面的第二种方式出现。

2. /** 访问当前项目的任何资源

默认情况下,springboot会将特定目录中(如/static/public/resources/META-INF/resources)的静态资源映射到根路径。

在项目中双击shiftctrl+N搜索WebMvcAutoConfiguration.class文件,文件中的addResourceHandlers方法如下:

java 复制代码
public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }

                });
            }
}

随后进入到getStaticLocations()方法可以发现变量 staticLocations 的取值如下,当访问项目中任意资源(即"/**")时,Spring Boot 会默认从以下路径中查找资源文件(优先级依次降低)

"classpath:/META-INF/resources/",

"classpath:/resources/",

"classpath:/static/",

"classpath:/public/"

这些路径又被称之为静态资源路径,当我们请求某个静态资源(例如:.html文件)时,Spring Boot 会先查找优先级高的文件夹,然后在查找优先级低的文件夹,直到找到指定的静态资源为止。

示例一:

在项目/src/main/resources/static 目录中创建一个 hello.html文件,代码如下

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>hello world!</h1>
</body>
</html>

然后启动Spring Boot 项目,浏览器访问: http://localhost:8080/hello.html ,结果如下图所示:

示例二:

在项目/src/main/resources/static 目录中存放一张照片,然后启动Spring Boot 项目,浏览器访问:http://localhost:8080/test.png

即项目运行时会到上述路径下寻找静态资源,也可以自定义静态资源路径,需在 application.properties 中配置:

XML 复制代码
spring.resources.static-locations=classpath:/folder1/,classpath:/folder2/

注:一旦自定义了静态文件夹的路径,则默认的静态资源路径就会失效。

3. 静态首页(欢迎页)映射

静态资源文件夹下的所有index.html 被称之为静态首页或者欢迎页,它们会被 /** 映射,也就是当我们访问 "/" 或者 "/index.html" 时,都会跳转到静态首页(欢迎页)

注意:访问静态首页或者欢迎页面时,其查找顺序也遵循默认静态资源的查找顺序,即先查找优先级高的目录,在查找优先级低的目录,直到找到 index.html 为止。

示例:

1、在项目/src/main/resources/public 目录下创建一个 index.html 文件,代码如下:

html 复制代码
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>首页</title>
</head>
  <h1>欢迎访问首页!</h1>
</html>

然后启动Spring Boot项目, 浏览器访问 http://localhost:8080/或者 http://localhost:8080/index.html 结果如下图所示:

相关推荐
考虑考虑18 分钟前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干26 分钟前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying1 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·1 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
martinzh2 小时前
Spring AI 项目介绍
后端
Bug退退退1232 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
小皮侠2 小时前
nginx的使用
java·运维·服务器·前端·git·nginx·github
前端付豪2 小时前
20、用 Python + API 打造终端天气预报工具(支持城市查询、天气图标、美化输出🧊
后端·python
爱学习的小学渣2 小时前
关系型数据库
后端
武子康2 小时前
大数据-33 HBase 整体架构 HMaster HRegion
大数据·后端·hbase