首页 > 其他分享 >SpringBoot--静态资源映射处理

SpringBoot--静态资源映射处理

时间:2022-08-21 01:22:20浏览次数:76  
标签:SpringBoot 映射 -- classpath static 目录 resources

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,映射,--,classpath,static,目录,resources
From: https://www.cnblogs.com/cxy-lxl/p/16609208.html

相关文章

  • 框架-逻辑层()
    场景值场景值上一节中有提到过场景值,我们来了解一下什么是场景值。场景值可用于统计用户来源,根据不同的来源做不同的引流活动等。我们可以在App的onlaunch和onsho......
  • 解决测试代码时,产生的空指针错误
    错误类型如下:  在进行代码测试的时候,莫名其妙的空指针报错解决方法:具体问题具体分析,此时的测试代码,是测试路由反馈,我没有使用air打开网站服务,于是遇到如上所见的......
  • webgl丢失上下文
    webgl丢失上下文一、原理WebGL使用了计算机的图形硬件,而这部分资源是被操作系统管理,由包括浏览器在内的多个应用程序共享。如果一个程序接管了图形硬件,或者操作系统......
  • mysql 水平切割和垂直切割
    1,水平分割:例:QQ的登录表。假设QQ的用户有100亿,如果只有一张表,每个用户登录的时候数据库都要从这100亿中查找,会很慢很慢。如果将这一张表分成100份,每张表有1亿条,就小了很多,......
  • 日常学习(4)verilator、Makefile、bash
    Verilator使用https://blog.csdn.net/daturasee/article/details/124488821https://github.com/verilator/verilatorour.vmoduleour;initialbegin$display("He......
  • 在虚幻4中创建带有循环的 while loop蓝图
    最近在看VirtusCreativeHub的UE4蓝图教程,这个教程最大的特点是美式教程(Iguset)的简单和啰嗦,很多地方牺牲了软件工程的原则来让理解教程更加简单,fine,可以理解但在这期教......
  • 训练记录
    ------------恢复内容开始------------D-TogetherSquare这道题很有意思吧!打表去OEIS查查到一串天文最后还是想了一下性质平方数是不是分解质因数都是偶的那我们......
  • 关于 Knex update 语句的 where 子句出现 Undefined binding(s) detected when compil
    因为是第一次使用Knex操作数据库来开发接口,一个业务中用到了update语句,且有where子句。下图是详细的报错截图,这里保证前端一个不漏的把需要的字段都传递过来了,但还......
  • 【Java】环境配置以及快速切换环境的技巧和方法
    前言前几天想用burp抓包来着,发现burp突然不能用了,重装了burp发现还是不能用,意识到是java环境出了问题。在之前有段时间没玩CTF,去搞开发了,于是java环境糊里......
  • 2020泰国数学奥林匹克 第二天 第9题
    已知n,k为正整数,n>k. 有一块正方形的土地被划分为了n*n个小块,且每个小块都是同样大小的正方形.目前需要k个拖拉机来犁地.每个拖拉机都从左下角出发,向右上角移动.拖......