SpringBoot静态资源的访问
SpringBoot静态资源
默认情况下,也就是application.properties配置文件没有做任何配置,我们只需要将静态资源放在以下几个目录中,就可以直接通过url在浏览器中访问。
/META-INF/resources/
/resources/
/static/
/public/
注:请求地址中并不需要目录前缀,如果加上了反而多此一举会报 404 错误。
因为在spring.resources.static-locations配置中已经自动对其做了路径映射。
如果这四个目录中存在相同名称的静态资源文件,那么优先访问哪个目录下面的资源啊?
静态资源的默认访问优先级:/META-INF/resources/
>/resources/
>/static/
>/public/
注:只能按优先级访问,无法指定访问某个目录下的重名文件。(在实际开发中,一般只会创建一个目录);文件名没有冲突的话,就会去挨个扫描目录去查找要访问的静态资源文件。
SpringBoot关于静态资源的访问涉及到了application.properties中的两个属性
查看源码可知:
# 默认值为 /**,表示匹配所有url-pattern
# 该配置是设置静态资源匹配的url-pattern
spring.mvc.static-path-pattern=/**
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
# 该配置是设置要指向的路径,多个使用英文逗号隔开,在前面的优先级高
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
/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,可不用配置