在web
开发中,静态资源的访问是必不可少的,如图片、js、css等资源的访问
SpringBoot
对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求
(嵌入式
servlet
容器)先决知识
request.getSession().getServletContext().getRealPath("/")
,这个很重要,将其称为docBase
,即 “文档基目录”- 在单模块项目中,如果不存在
src/main/webapp
目录,则docBase
被设置为C盘下临时的随机目录,例如C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
- 在多模块项目中,要留意
jvm
启动路径。无论该启动路径是位于父模块的路径下还是子模块的,如果jvm
启动路径下不存在src/main/webapp
目录,则docBase
被设置为C盘下临时的随机目录
综上,如果想要依照传统方式通过“文档基目录”去定位文档资源(
html
、css
、js
),则要确保存在src/main/webapp
目录,即docBase
不会被设置为随机目录;否则,建议直接设置SpringBoot
将其定位至classpath
下的资源(即src/main/resource
目录下的资源):
SpringBoot
项目中classpath
指向:1、用
maven
构建(build
)项目时,默认的classpath
指向target/classes/
2、用
maven
打包(package
)项目时,默认的classpath
指向war
内部的WEB-INF/classes/
获取
SpringBoot
项目默认的classpath
:
String classpath = ResourceUtils.getURL("classpath:").getPath();
具体配置如下:
@EnableWebMVC
)
SpringBoot
对静态资源映射提供了默认配置
SpringBoot
的 @EnableAutoConfiguration
会启用自动配置类 WebMvcAutoConfiguration
,该类配置了一些默认的静态资源映射
SpringBoot
默认将localhost:8080/**
所有访问依次映射到以下目录:
目录 | 优先级 |
---|---|
classpath:/META-INF/resources/ |
最高 |
classpath:/resources/ |
其次 |
classpath:/static/ |
第三 |
classpath:/public/ |
最低 |
自动映射 localhost:8080/webjars/**
为以下路径
classpath:/META-INF/resources/webjars/
此时,我们不需要多做什么,只要将静态资源放入 src/main/resources
目录下的 resources
、static
或 public
文件夹下,即可通过 url
定位相关资源,例如 localhost:8080/index.html
可定位至 src/main/resources/static/index.html
注意:如果编写了以下的自定义配置,则以上默认配置将被取消。更确切的说,一旦自定义的配置不为空,则默认配置将不被采用。
如:在resources
目录下新建public
、resources
、static
三个目录,并分别放入a.jpg
、b.jpg
、c.jpg
图片
浏览器分别访问:
http://localhost:8080/a.jpg http://localhost:8080/b.jpg http://localhost:8080/c.jpg
均能正常访问相应的图片资源。那么说明,SpringBoot
默认会挨个从public
、resources
、static
里面找是否存在相应的资源,如果有则直接返回
在实际开发中,可能需要自定义静态资源访问路径,那么可以继承
WebMvcConfigurerAdapter
来实现
如果使用了 @EnableWebMvc
,则自动配置类 WebMvcAutoConfiguration
会失效,因此默认映射路径 /static
, /public
, META-INF/resources
, /resources
都将失效
第一种方式:自定义静态资源配置类
无任何前缀 -> “文档根目录”(一般指代 src/main/webapp
目录), 例如 localhost:8080/index.html
定位至 src/main/webapp/static/index.html
存在前缀 classpath
-> 类路径(一般指代 src/main/resources
目录)
存在前缀 file://
-> 文件系统路径(“绝对路径”)
@Configuration public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { //配置静态资源处理 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 将所有的访问路径都映射到真实路径目录下 // addResourceHandler()添加的是访问路径 registry.addResourceHandler("/**") // addResourceLocations()添加的是映射后的真实路径,映射的真实路径末尾必须加"/" ,否则映射不到 .addResourceLocations("resources/", "static/", "public/", "META-INF/resources/") .addResourceLocations("classpath:resources/", "classpath:static/", "classpath:public/", "classpath:META-INF/resources/") .addResourceLocations("file:///tmp/webapps/"); } }
重启项目,访问:http://localhost:8080/static/c.jpg
能正常访问static
目录下的c.jpg
图片资源
application.properties
配置在application.properties
中添加配置:
spring.mvc.static-path-pattern=/static/**
重启项目,访问:http://localhost:8080/static/c.jpg
同样能正常访问static
目录下的c.jpg
图片资源
注意:通过
spring.mvc.static-path-pattern
这种方式配置,会使SpringBoot
的默认配置失效,也就是说,/public/resources
等默认配置不能使用
配置中配置了静态模式为
/static/
,就只能通过/static/
来访问
参考博客:https://www.cnblogs.com/magicalSam/p/7189476.html