SpringBoot静态资源配置详解(上)

静态文件

基本概念

静态资源:一般是网页端的:HTML文件、JavaScript文件和图片。尤其是设置图片的静态资源,尤其重要。
静态资源路径:是指系统可以直接访问的路径,且路径下的所有文件均可被用户直接读取。
通俗来讲classpath对应的项目中:web-practice\src\main\resources 文件目录。如:“classpath: templates/” 即是将resources目录下的templates文件夹设置为静态文件目录。更深一步讲classpath路径为:文件编译后在target/classes目录下的文件。
静态资源过滤:是说不做请求处理,直接能够打开访问!
静态文件目录:通俗理解为存放包括 :.html;.jsp;CSS;js;图片;文本文件等类型文件的目录。这些文件都可以通过浏览器url进行访问。同时controller中转发的文件目录也必须被设置为静态文件目录,这就是增加了该参数以后就可以正常访问的原因。

在这里插入图片描述
在这里插入图片描述

Springboot内设置静态资源,或者说静态资源文件夹,主要有两种方法(均为SpringMVC实现):

  • 在application.yml/application.properties内配置。
  • 设置Configuration配置类。

以上两种方法,均可实现用户访问网址,不走Controller层的拦截,直接进行静态文件访问。
在这里插入图片描述

application设置方法

配置详解
设置application方法很简单,主要涉及两个配置项:

  • spring.mvc.static-path-pattern:根据官网的描述和实际效果,可以理解为静态文件URL匹配头,也就是静态文件的URL地址开头。Springboot默认为:/**。
    spring.mvc.static-path-pattern代表的含义是我们应该以什么样的路径来访问静态资源,换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求,以官方配置为例:
#   这表示只有静态资源的访问路径为/root/**时,才会处理请求
spring.mvc.static-path-pattern=/root/**,

假定采用默认的配置端口,那么只有请求地址类似于“http://localhost:8080/resources/jquery.js”时,Spring Boot才会处理此请求,处理方式是将根据模式匹配后的文件名查找本地文件,那么应该在什么地方查找本地文件呢?这就是“spring.resources.static-locations”的作用了。

  • spring.web.resources.static-locations:根据官网的描述和实际效果,可以理解为实际静态文件地址,也就是静态文件URL后,匹配的实际静态文件。Springboot默认为:
  classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

spring.resources.static-locations=classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

继续以上面的请求地址为例,“http://localhost:8080/resources/jquery.js”就会在上述的四个路径中依次查找是否存在“jquery.js”文件,如果找到了,则返回此文件,否则返回404错误。

如何运作的?,这里我画个简单的图:
在这里插入图片描述

需要注意:

  • spring.web.resources.static-locations是后续配置,旧版Springboot的配置项为:spring-resources-static-locations;在2.2.5版本之后,旧版本配置已经失效。
  • spring.web.resources.static-locations有多个配置项,在Springboot编译后,会合并为一个文件。多个配置文件,使用逗号进行分割。
  • spring.web.resources.static-locations可以使用classpath、file进行匹配。如果使用file,这个时候的相对路径为项目地址(打包为.jar后,相对路径就是.jar运行地址)。
  • spring.mvc.static-path-pattern 仅仅允许一个配置,无法使用逗号进行分割,如果需要多个静态资源文件,可以使用下文的配置类方法。

编写配置

现在,官方描述,我们已经知道了配置项的含义。现在我们就来配置。

默认静态资源访问

Spring Boot的默认静态资源的路径为:
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
优先级从从高到低。

优先级顺序为:META-INF/resources > resources > static > public

默认情况不配置静态资源访问路径时
在这里插入图片描述
我们将静态资源放到以上路径(classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)或放到者我们把静态文件直接放到webapp下
在这里插入图片描述
但是需要我们注意的是:如果你的应用将被打包成jar,那就不要使用src/main/webapp文件夹。尽管该文件夹是一个共同的标准,但它仅在打包成war的情况下起作用,如果产生一个jar,多数构建工具都会静悄悄的忽略它!所以根据需要进行配置
在这里插入图片描述

默认情况配置静态资源访问路径时
当我们在application.properties/yml中配置默认访问路径时,只能够访问到我们配置的访问路径。
在webapp下的目录中的静态文件就不能够进行访问

自定义静态资源路径的配置

一般情况下,默认的静态资源访问路径就能满足我们的需求,当然我们也可以自定义静态资源的路径:具体如下详解。

我使用的是YML格式的application配置,如果你是使用XML格式的application.properties,记得进行更改。

最终效果很简单,我想要的效果:
浏览器输入:
http://localhost:8080/SystemData/touxiang.png
可以直接访问项目文件下的:/SystemData/touxiang.png
在这里插入图片描述
为了实现这样的效果,我们编写配置文件:

spring:
  mvc:
  	# URL响应地址(Springboot默认为/**)
    static-path-pattern: /SystemData/**
  web:
    resources:
      # 静态文件地址,保留官方内容后,进行追加
      static-locations: classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources,file:SystemData

其中,file:SystemData就是映射本地文件了。addResourceHandler()方法参数为请求的访问路径,addResourceLocations()方法参数为文件路径。表示所有的访问都经过静态资源路径;

这样的配置,类似于Nginx的正则匹配:

location ^~/SystemData{
    
    
	alias /www/myWeb/SystemData;
}

这样,我们运行项目,就可以直接访问静态资源了:
在这里插入图片描述
当然,这样有一些缺点……

优缺点

这样的配置,可以说最简单且粗暴,但是灵活性差一点点:
URL响应地址只能为一项,也就是spring.mvc.static-path-pattern配置只能写一项。这意味着,按我上文设置了/SystemData/**为URL匹配,就不能设置第二个/resources/**这样的配置为第二静态目录。

如果需要设置多个地址为静态资源访问地址,可以参考下文的设置配置类的方法。

小结

(1)、我们既可以直接通过application.properties的配置文件进行配置,也可以通过自己写静态资源的Bean配置文件。

(2)、spring.mvc.static-path-pattern用于阐述HTTP请求地址,而spring.resources.static-locations则用于描述静态资源的存放位置。

(3)、自定义静态资源访问路径,可以指定多个,之间用逗号隔开,其中使用这种方式特别要注意:自定义静态资源后,SpringBoot默认的静态资源路径将不再起作用!
————————————————

设置配置类方法

配置详解

写一个配置类,实现静态资源的文件夹方法很多。比如:

  • 继承于WebMvcConfigurationSupport父类,并实现addResourceHandlers方法。
  • 引用WebMvcConfigurer接口,并实现addInterceptors方法。

一些文章可能会让你继承于WebMvcConfigurerAdapter方法,但是实际上WebMvcConfigurerAdapter方法在Spring5.0和Springboot2.0之后,已经弃用。

这里,我处于习惯,就使用WebMvcConfigurationSupport进行实现addResourceHandlers:

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    
}

这里的registry使用链式编程,方法为:

  • addResourceHandler:添加URL响应地址目录。
  • addResourceLocations:添加实际资源目录。

和application.yml里设置一样,支持classpath和file等关键词。接下来,我们就看看实际编写配置。

编写配置

现在我们就来配置。
最终效果很简单,我想要的效果(两组同时):

  • 浏览器输入:http://localhost:8088/SystemData/UserData/Avatar/Mintimate.jpeg
    可以直接访问项目文件下的:/SystemData/UserData/Avatar/Mintimate.jpeg,
    浏览器输入:http://localhost:8088/SystemDataTest/UserData/Avatar/Mintimate.jpg
    可以直接访问项目文件下的:/Test/UserData/Avatar/Demo.jpeg,

在这里插入图片描述
添加一个配置类,并继承WebMvcConfigurationSupport,实现addResourceHandlers方法,并打上@Configuration注解,使其成为配置类:
在这里插入图片描述
之后,重写内容:
在这里插入图片描述
主要是:

// 静态资源映射
registry.addResourceHandler("/SystemData/**")
        .addResourceLocations("file:"+IMG_PATH);
registry.addResourceHandler("/SystemDataTest/**")
        .addResourceLocations("file:"+IMG_PATH_TWO);

之后,浏览器就可以访问了:
在这里插入图片描述
在这里插入图片描述
这样的配置,其实还是和Nginx配置类是……:
这样的配置,类似于Nginx的正则匹配:

location ^~/SystemData{
    
    
	alias /www/myWeb/SystemData;
}

当然,这样的优缺点……

优缺点

相比前文的配置,这样优缺点很明显:

相比配置文件的方式,这样的代码配置稍微更麻烦。
但是相比,这样的可塑性更高:可以添加更多的映射、不会对默认配置造成覆盖等。

webjars使用

SpringBoot也支持以webjars的形式访问静态资源。

什么是webjars

顾名思义,webjars就是将web资源打成一个jar包以供项目使用。因为在实际的开发中,由于一个公司对UI以及静态资源版本的控制有着更高的要求,使用webjars首先也可让我们的静态资源得到共享;其次,由于独立了静态资源,所以可以提升项目的编译速度和打包速度;最后,我们可以使用maven将静态资源jar包上传至公司私服,方便了版本的控制和资源的共享。这样看来,使用webjars确实非常方便,关于静态资源如何打成一个webjars,网上教程很多,也比较简单,这里就不赘述了。
tips:在maven中央仓库中,已经提供了一些常用的依赖:

<!-- jquery webjars -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.1.0</version>
</dependency>
<!-- bootstrap webjars -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>3.4.1</version>
</dependency>

以上是比较常用的两个前端框架的webjars,如需其他的webjars,可以去webjars官网或者maven中央仓库去查找。

访问webjars

默认情况下,当我们在项目中引入指定的webjars依赖后,就可以直接通过如下的方式访问其中的静态资源:

/webjars/jquery/x.y.z/jquery.min.js

其中w.y.z为webjars的版本号。当然也可以不带版本号直接访问静态资源,不过有一个前提条件,就是你的项目中必须引入一个依赖:

<dependency>
     <groupId>org.webjars</groupId>
     <artifactId>webjars-locator-core</artifactId>
</dependency>

加入这个依赖后,我们就可以使用如下两种方式访问webjars中的资源了:

方式一:/webjars/jquery/x.y.z/jquery.min.js
方式二:/webjars/jquery/jquery.min.js

webjars如何使用?

我们之前在web项目中有个webapp的目录中存放静态资源,虽然springboot中没有这个文件路径但是springboot还是有它自己的规则,从上面的代码可以看出所有的/webjars/** ,都会去classpath:/META-INF/resources/webjars/中找资源。那么什么是webjars呢?webjars就是以jar包的方式引入静态资源;
在这里插入图片描述
把上面的依赖拷进maven项目的依赖中即可,如下

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.4.1</version>
</dependency>

之后所有的/webjars/** 都会去classpath:/META-INF/resources/webjars/中找资源,这个路径则在下面这个目录中
在这里插入图片描述
在这里插入图片描述
去掉勾之后右边的小框框就是我们对应的classpath:/META-INF/resources/webjars/中的路径。

以上步骤完成之后比如我们开始访问一下jQuery中的jquery.js这个资源直接运行项目,然后在地址栏输入http://localhost:8080/webjars/jquery/3.4.1/jquery.js就可以访问对应路径下的jquery.js文件,页面效果如下:
在这里插入图片描述
说明访问静态资源成功了。是的上面的这种方式是导入jar包的方式,如果我们要用自己的一些JS、CSS、jQuery文件可不可以呢?答案是可以的,所以就有了我们下面的第二种方式出现。

/** 详解

访问当前项目的任何资源

如果是自己的静态资源文件,比如自己的一些JS、CSS、jQuery文件,SpringBoot默认是从以下这些路径中读取的

"classpath:/META‐INF/resources/", 
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/":当前项目的根路径

http://localhost:8080/jquery.js如果没有任何代码处理,就相当于直接 去静态资源文件夹里面访问jquery.js,如下
在这里插入图片描述

首页index.html,被" /** "映射

在SpringBoot默认静态资源访问路径下添加名为index.html文件,那么访问localhost:8080,会自动跳转到这个index.html。也就是说SpringBoot默认首页面为index.html,被" /** "映射。如下:
在这里插入图片描述

自定义图标 **/ favicon.ico

在SpringBoot中,可以把ico格式的图标放在默认静态资源文件路径下,并以favicon.ico命名,应用图标会自动变成指定的图标。所有的 **/favicon.ico 都会在静态资源文件下找; 如下:
在这里插入图片描述

总结

综上所述,就是Springboot的静态资源目录添加方法啦。是不是和Nginx很像?

虽然现在Nginx和对象存储都很方便,但是直接用Springboot进行静态资源的划分,也不为一种方法。

鸣谢

https://blog.csdn.net/weixin_43890033/article/details/120928070
https://blog.csdn.net/plei_yue/article/details/79360645
https://www.cnblogs.com/yichunguo/p/12115550.html

猜你喜欢

转载自blog.csdn.net/CNCDXX_88/article/details/129924912