点击上方“朱小厮的博客”,选择“设为星标”

后台回复”加群“加入公众号专属技术群

来源:rrd.me/faAmu

做web开发的时候,我们往往会有很多静态资源,如html、图片、css等。那如何向前端返回静态资源呢?

以前做过web开发的同学应该知道,我们以前创建的web工程下面会有一个webapp的目录,我们只要把静态资源放在该目录下就可以直接访问。

但是,基于Spring boot的工程并没有这个目录,那我们应该怎么处理?

一、最笨的方式

我们首先来分享一种最笨的办法,就是将静态资源通过流直接返回给前端,我们在maven工程的resources的根目录下建立一个html的目录,然后我们把html文件放在该目录下,并且规定任何访问路径以/static/开头的即访问该目录下的静态资源,其实现如下:

@Controllerpublic class StaticResourceController {

    @RequestMapping("/static/**")    public void getHtml(HttpServletRequest request, HttpServletResponse response) {        String uri = request.getRequestURI();        String[] arr = uri.split("static/");        String resourceName = "index.html";        if (arr.length > 1) {            resourceName = arr[1];        }        String url = StaticResourceController.class.getResource("/").getPath() +            "html/" + resourceName;        try {            FileReader reader = new FileReader(new File(url));            BufferedReader br = new BufferedReader(reader);            StringBuilder sb = new StringBuilder();            String line = br.readLine();            while (line != null) {                sb.append(line);                line = br.readLine();            }            response.getOutputStream().write(sb.toString().getBytes());            response.flushBuffer();        } catch (IOException e) {            e.printStackTrace();        }    }

}

其实现过程很简单,就是先从路径中分离出来资源uri,然后从static目录下读取文件,并输出到前端。

因为只做简单演示,所以这里只处理了文本类型的文件,图片文件可以做类似的处理。当然,我们在实际中肯定不会这么做,Spring Boot 也肯定有更好的解决办法。

不过这个办法虽然有点笨,但确是最本质的东西,无论框架如何方便的帮我们处理了这类问题,但是抛开框架,我们依然要能够熟练的写出一个web项目,只有知道其实现原理,你才会在遇到问题时能得心应手。

现在我们再来看看Spring boot对静态资源的支持。

二、Spring boot默认静态资源访问方式

Spring boot默认对/**的访问可以直接访问四个目录下的文件:

  • classpath:/public/

  • classpath:/resources/

  • classpath:/static/

  • classpath:/META-INFO/resouces/

我们现在就在资源文件resources目录下建立如下四个目录:

注意蓝色条下的资源文件夹resources与类路径下的文件夹classpath:/resources是不同的,蓝色条下的resources代表的是该目录下的文件为资源文件,在打包的时候会将该目录下的文件全部打包的类路径下,这个名称是可以改的,在pom.xml指定资源目录即可:

<resources>    <resource>        <directory>src/main/resources</directory>    </resource></resources>

而类路径下的resources是spring boot默认的静态资源文件夹之一,和public、static以及MEAT-INFO/resources的功能相同。现在我们重启Spring boot就可以通过:

  • http://localhost:8080/1.html

  • http://localhost:8080/2.html

  • http://localhost:8080/3.html

  • http://localhost:8080/4.html

四个URL访问到四个目录下的静态资源了。

三、自定义静态资源目录

通过第二节内容我们已经知道了Spring boot默认可以访问的静态资源的目录,但是大家肯定会想,这个目录是固定的吗?我们可不可以自己定义静态资源目录?

答案是肯定的,我们现在就来自定义一个静态资源目录,我们定义一个images的目录来存放图片,所有/image/**的路径都会访问images目录下的资源:

@Configurationpublic class ImageMvcConfig extends WebMvcConfigurerAdapter {    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/image/**")                .addResourceLocations("classpath:/images/");    }}

这段代码应该比较简单,@Configuration 标识一个配置类,这个在前面的文章中提到过多次。

WebMvcConfigurerAdapter是Spring提供的一个配置mvc的适配器,里面有很多配置的方法,addResourceHandlers就是专门处理静态资源的方法,其他方法后续我们还会讲到。

现在我们在验证上面的配置是否有效。我在images目录下放了一张spring.jpg的图片,现在我们通过http://localhost:8080/image/spring.jpg来访问图片:

其实除了上面的办法还有一种更简单的办法,就是直接在application.yml中配置即可:

spring:  mvc:    static-path-pattern: /image/**  resources:    static-locations: classpath:/images/

static-path-pattern:访问模式,默认为/**,多个可以逗号分隔

static-locations:资源目录,多个目录逗号分隔,默认资源目录为classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

注意,这个配置会覆盖Spring boot默认的静态资源目录,例如如果按示例中配置,则无法再访问static、public、resources等目录下的资源了。

四、总结

本文主要给大家分享了Spring boot 对静态资源的处理方式,Spring boot 默认可以访问

classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

四个目录下的静态资源,我们也可以根据自己的需要进行个性化配置。

最后,需要说明一点的是,如果这四个目录中存在相同名称的资源,那会优先返回哪个目录下的资源呢?

大家通过static-locations的默认值顺序应该能猜到,默认情况下,Spring boot会优先返回/META-INF/resources下的资源。

当然,因为我们可以自定义static-locations的值,所以这个优先顺序也是可以调整的。

想知道更多?描下面的二维码关注我

怎么加群?:>>>Learn More<<

朕已阅 

Spring Boot 静态资源处理,原来如此!相关推荐

  1. Spring Boot 静态资源处理,妙!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:cnblogs.com/paddix/p/8301331.h ...

  2. Spring Boot静态资源访问和配置全解析

    在web开发中,静态资源的访问时必不可少的,比如image.css.js等.SpringBoot对静态资源访问提供了很好的支持,使用其提供的基本默认配置基本可以满足开发需求,同时,又支持开发人员进行自 ...

  3. Spring Boot 静态资源映射与上传文件路由配置

    默认静态资源映射目录 默认映射路径 在平常的 web 开发中,避免不了需要访问静态资源,如常规的样式,JS,图片,上传文件等;Spring Boot 默认配置对静态资源映射提供了如下路径的映射 /st ...

  4. Spring Boot 静态资源访问原理解析

    一.前言 springboot配置静态资源方式是多种多样,接下来我会介绍其中几种方式,并解析一下其中的原理. 二.使用properties属性进行配置 应该说 spring.mvc.static-pa ...

  5. Spring Boot静态资源映射规则

    目录 理论 演示 理论 使用Spring Boot: 1. 创建Spring Boot应用,选中需要的模块: 2. Spring Boot已默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运 ...

  6. spring boot静态资源文件的访问以及自定义

    上一节出现的页面是不是很丑?我才不告诉你,我把背景都处理了, 相关的项目结构,如下 好吧.来看看最终的页面源码 <!DOCTYPE HTML> <html><head&g ...

  7. Spring Boot 静态资源修改立即生效

    前两天在玩spring boot的时候,发现修改静态资源时总是不能立即生效,弄了好长时间,今天将解决方案分享给大家,希望对大家有所帮助,废话少说,直接上教程 第一步:项目maven中需要的maven包 ...

  8. Spring Boot静态资源映射

    在 Web 应用中会涉及到大量的静态资源,例如 JS.CSS 和 HTML 等.我们知道,Spring MVC 导入静态资源文件时,需要配置静态资源的映射:但在 SpringBoot 中则不再需要进行 ...

  9. springboot的jsp应该放在哪_web项目jsp放在哪里 Spring Boot 静态资源处理(4)

    Spring Boot 默认将 /webjars/** 映射到 classpath:/META-INF/resources/webjars/ ,结合我们上面讲到的访问资源的规则,便可以得知我们在JSP ...

最新文章

  1. TensorFlow创建DeepDream网络
  2. linux下crontab实现定时服务详解
  3. iftop是一个很好用的实时流量监测程序,跟使用iftop查看linux连接进程占用的实时流量...
  4. mysql5717开发设置怎么调回来_华为手机这几个默认设置,一定要关闭,再也不卡顿...
  5. 猴子偷桃php代码,C++实现猴子吃桃的示例代码
  6. Jquery精准计算
  7. volatile和synchronized关键字
  8. Android是如何绘制View的
  9. 选择RDP报表工具的原因
  10. smarty 模板php,php的smarty模板发动机
  11. Pycharm破解(学习python的day01)
  12. AE MG动画脚本motion2 脚本使用方法学习笔记
  13. jquery知识点总结(2)--- CSS模块+筛选模块+文档处理(CUD)模块+事件模块
  14. 微信小程序获取当前系统时间以及判断周几
  15. JAVA 中IO总结 之前篇阻塞、非阻塞
  16. 嵌入式开发之路(偏汽车电子嵌入式软件工程师学习路线图)
  17. CentOS7 安装 CMake 解决 cmake command not found 问题
  18. 转的: 健康程序员:五分钟与鼠标手说再见
  19. 农业多贡献·看亮点②平昌青花椒:这个园区为何让参会代表直呼“上头”
  20. 鸿蒙系统能用wps吗,WPS Office鸿蒙版app

热门文章

  1. Netty--Reactor模式
  2. Java生成pgp密钥对_在Javascript中生成PGP密钥对,并使用加密的PGP私钥对文本进行签名...
  3. C# winform DataGridView 常见属性
  4. 初识 JSP---(Servlet映射 / ServletRequest / get与post区别 / 解决乱码)
  5. Jenkins Gitlab持续集成打包平台搭建
  6. 安卓开源项目周报0215
  7. sql 统计用的sql
  8. tomcat与apache区别
  9. Win8 官方培训课程
  10. 人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现,具体使用 JavaScript 和 CSS 原理是什么?...