Java教程

SpringBoot--静态资源映射处理

本文主要是介绍SpringBoot--静态资源映射处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

web开发中,静态资源的访问是必不可少的,如图片、js、css等资源的访问

SpringBoot对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求

(嵌入式servlet容器)先决知识

  1. request.getSession().getServletContext().getRealPath("/"),这个很重要,将其称为 docBase,即 “文档基目录”
  2. 在单模块项目中,如果不存在src/main/webapp目录,则 docBase 被设置为C盘下临时的随机目录,例如 C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
  3. 在多模块项目中,要留意jvm启动路径。无论该启动路径是位于父模块的路径下还是子模块的,如果jvm启动路径下不存在 src/main/webapp 目录,则docBase被设置为C盘下临时的随机目录

综上,如果想要依照传统方式通过“文档基目录”去定位文档资源(htmlcssjs),则要确保存在 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对静态资源映射提供了默认配置

  1. SpringBoot @EnableAutoConfiguration 会启用自动配置类 WebMvcAutoConfiguration,该类配置了一些默认的静态资源映射

    • SpringBoot默认将localhost:8080/**所有访问依次映射到以下目录:

      目录 优先级
      classpath:/META-INF/resources/ 最高
      classpath:/resources/ 其次
      classpath:/static/ 第三
      classpath:/public/ 最低
    • 自动映射 localhost:8080/webjars/** 为以下路径

      • classpath:/META-INF/resources/webjars/
  2. 此时,我们不需要多做什么,只要将静态资源放入 src/main/resources 目录下的 resourcesstaticpublic 文件夹下,即可通过 url 定位相关资源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html

  3. 注意:如果编写了以下的自定义配置,则以上默认配置将被取消。更确切的说,一旦自定义的配置不为空,则默认配置将不被采用。

如:在resources目录下新建publicresourcesstatic三个目录,并分别放入a.jpgb.jpgc.jpg图片

浏览器分别访问:

http://localhost:8080/a.jpg
http://localhost:8080/b.jpg
http://localhost:8080/c.jpg

均能正常访问相应的图片资源。那么说明,SpringBoot默认会挨个从publicresourcesstatic里面找是否存在相应的资源,如果有则直接返回

二、自定义静态资源映射(存在 @EnableWebMVC)

在实际开发中,可能需要自定义静态资源访问路径,那么可以继承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

这篇关于SpringBoot--静态资源映射处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!