默认情况下,也就是application.properties配置文件没有做任何配置,我们只需要将静态资源放在以下几个目录中,就可以直接通过url在浏览器中访问。
/META-INF/resources/
/resources/
/static/
/public/
注:请求地址中并不需要目录前缀,如果加上了反而多此一举会报 404 错误。因为 spring.mvc.static-path-pattern= ,默认值为 /**,且在路径映射(spring.resources.static-locations)中已经自动的添加上了目录前缀。
![](https://img2020.cnblogs.com/blog/2488455/202201/2488455-20220107112910743-1586508720.png)
如果这四个目录中存在相同名称的静态资源文件,那么优先访问哪个目录下面的资源啊?
静态资源的默认访问优先级:/META-INF/resources/
>/resources/
>/static/
>/public/
注:只能按优先级访问,无法指定访问某个目录下的重名文件。(在实际开发中,一般只会创建一个目录);文件名没有冲突的话,就会去挨个扫描目录去查找要访问的静态资源文件。
SpringBoot关于静态资源的访问涉及到了application.properties中的两个属性:
# 默认值为 /** spring.mvc.static-path-pattern= #这里设置静态资源匹配的url-pattern # 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ spring.resources.static-locations= #这里设置要指向的路径,多个使用英文逗号隔开,在前面的优先级高
/META-INF/resources/
、/resources/
、/static/
、/public/
这四个目录了,还有这四个目录访问的优先级是怎么来的了。- 我们可以修改这两个属性来改变静态资源的映射,比如我们的所有静态资源都在
mystatic
目录中,并且我们希望访问静态资源的的url都带有/mystatic/
这个目录前缀:
# 如设置为 /mystatic/* 的话只能匹配到第一层路径,是无法访问/mystatic/pages/目录下的资源;应改为 /mystatic/** 表示可以匹配任意层级的路径 spring.mvc.static-path-pattern=/mystatic/** spring.resources.static-locations= classpath:mystatic/
配置了指定的资源目录后,默认的资源目录则失效 (约定大于配置的思想,给他破坏掉)
实现WebMvcConfigurer接口
,并且重写addResourceHandlers
方法就行,该操作与上面的方法得到的效果是一样的
@Configuration public class WebMVCConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations("classpath:/aaa/"); } }
注:上述两种方法同时配置的话,配置类会覆盖配置文件的配置。
SpringBoot访问templates目录下的html静态页面:
实际开发中,html页面不建议放在static目录下,而是放在templates目录中。 一般使用spring boot默认为我们创建的static目录来放置css、图片、js等静态资源即可。但templates目录的资源默认是受保护的,没有开放访问权限。这是因为templates文件夹,是放置模板文件的,因此需要视图解析器来解析它。所以必须通过服务器内部进行访问,也就是要走控制器 → 服务 → 视图解析器这个流程才行。
要访问templates目录下的html页面,还需要引入下面这个模板引擎,然后才能通过Controller来进行访问。
<!--访问静态资源--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
注:在使用模板引擎的时候,控制器不要用@RestController,因为它返回的是json数据格式,而我们要的是html页面。
thymeleaf 模板配置:
spring: #thymeleaf模板配置 thymeleaf: cache: false # 这个开发配置为false,避免改了模板还要重启服务器 prefix: classpath:/templates/ #模板文件视图前缀,默认是classpath:/templates/,可不用配置 suffix: .html #模板文件视图后缀,默认是.html,可不用配置 check-template-location: true #检查模板位置,可不用配置 encoding: utf-8 #编码字符集,默认为utf-8,可不用配置 mode: HTML #模板的模式,默认为HTML,可不用配置 servlet: content-type: text/html #模板的内容类型,默认为text/html,可不用配置