目录
一、关于静态资源你必须知道的前置知识?
首先,在以往SSM框架中,当我们把静态资源放到webApp目录下时,如果不做任何配置,我们默认是访问不了静态资源的,需要在springmvc中做一个静态资源放行.而在springboot框架中,当我们把静态资源放到
resources/META-INFO/resources,
resources/resourc,
resources/static,
resources/public,
/webapp(springboot项目中不需要webapp目录,但是也可以自己创建一个)
这些目录下时,不需要做任何配置,我们就可以访问静态资源,这是因为springboot已经帮我们配置好了.
另外这里的目录如果都存在的话,存在一个优先级问题,按照我写的,从上到下优先级依次降低.
我们在初学springboot时,常常听人说约定大于配置,初听不知含义,其实只要多看看springboot自动配置原理就能感悟一些.说白了,约定大于配置, 就是springboot本身已经配置好了一些东西,开发者不用自己再配置了,我们一起约定好就用这种配置,例如在这里的静态资源目录问题上,我springboot帮你配置好了,咱们约定好就用这里的配置,你就可以使用了,别的不劳您操心.
二、springboot项目中如何自定义静态资源位置
2.1 application配置文件中配置
spring: web: resources: static-locations: classpath:/dist2/
然后直接访问:http://127.0.0.1:8080/01.html 即可
2.2 实现WebMvcConfigurer接口
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/dist/");
}
}
然后直接访问:http://127.0.0.1:8080/01.html 即可
2.3 关于静态文件目录层级问题
在registry.addResourceHandler("/**").addResourceLocations("classpath:/dist/")这个配置中我们首先要明确这里的/**和classpath:/dist/的含义.
/:指的是你项目的根路径,
**:指定是你所访问的资源
classpath:指的是你项目的类路径
/dist/:指的是你项目类路径下的dist文件夹
注意点:
1.当我们进行访问http://127.0.0.1:8080/01.html时,springboot会根据你的配置,将**接到/dist/下,在我们这里就是将01.html接到/dist/后面,在内部真正访问的是http://127.0.0.1:8080/dist/01.html.
2.如果当我们在这里将配置改为registry.addResourceHandler("/test/**").addResourceLocations("classpath:/dist/");时,也同样是将**追加到/dist/后面,而这里test只是我们添加的访问时的路径,此时在浏览器中我们访问的路径应是
http://127.0.0.1:8080/test/01.html
3.在实际项目开发中,我们一般会给项目添加一个上下文,如添加配置
server: servlet: context-path: /Project
这样我们就给项目添加了一个系统上下文/Project,这里跟在ssm项目中我们在idea中将war包部署到本地的tomcat中,给tomcat取一个虚拟名称一样,也和将war包部署到外部tomcat,如测试环境中的tomcat中,tomcat默认的文件名一样.
此时我们的项目根路径为/Project,如果我们这时静态资源配置为registry.addResourceHandler("/**").addResourceLocations("classpath:/dist/")的话,那么这时的**代表是什么,按照前面所说,是代表Project/test/01.html吗?并不是,这时我们的/**中的 / 代表的是/Project/,此时我们的访问路径为 http://127.0.0.1:8080/Project/01.html,