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,可不用配置

  

posted @ 2022-01-07 14:37  danielzzz  阅读(1213)  评论(0编辑  收藏  举报