Springboot的resources下资源访问的问题
对于路径问题,是让我一直感到痛苦的事情,首先是因为我的眼高手低,感觉路径这么简单根本没必要去看,但是昨天项目组长的冷嘲热讽让我无地自容:“你竟然连linux和window的路径的区别都不知道,呵呵”。事情的起因是我在配置日志文件的时候,我不晓得window路径下的根目录是什么,于是我打开了cmd,想输入cd /,但是发现cd /之后的路径是盘符根目录,woc这是不是根目录,接下来就被无情的嘲讽了。言归正传,对于springboot的资源目录我一直是莫名其妙的只有一个Resources目录,那么它的目录结构是怎样的呢?我把我遇到的所有情况都记录下来作为记忆。
一 、SpringBoot的资源目录的分类
-1. static 存放静态资源,比如静态画面,图片,js等等

比如这里我们新建一个static.html,我们可以直接访问到静态目录的资源

也可以使用Controller跳转
@Controller
public class RedirectController { @RequestMapping("/stc")
public String stc(){
return "static.html";
}
}

-2. templates 存放动态画面等
templates下面存放的动态页面不能通过url中输入.html的方式直接访问,需要通过请求服务器,在转到动态画面。
我们需要使用一种方式达到目的,就像是jsp一样,使用数据加模板的形式进行渲染,但是jsp不利于前后端分离的开发(虽然我觉得使用java写前端很安逸,但是Springboot不建议使用jsp)
官方建议的是使用Thymeleaf来做动态界面,这里我使用的是freemaker,springboot也是集成了freemaker的。
这是我templates下面

首先引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
然后在application.yml进行简单的配置,这个配置的作用在后面会讲
spring:
freemarker:
suffix: .html
配置完成以后,我们先试验一下直接访问能否成功

这里报的是404,显然没有找到
那我们实验下通过controller的方式
@RequestMapping("tmplts")
public String tmplts(){
return "template";
}
注意这里的return不可以带.html,前面我们对freemaker进行的配置中给他添加了后缀名为.html

现在已经访问成功了。那么到现在为止,最最基本的使用已经掌握了。接下来讲解一些其他的。
二、自定义静态资源访问路径以及springboot默认的配置
首先我们讲解下springboot资源目录下的几种静态目录,
/META-INF/resources
resources
static
public

这几种有什么作用呢?这几个目录都是springboot默认提供的静态资源访问路径,他们的根路径都是“/”
什么意思呢?就是说在访问这些目录下面文件的时候,他们的访问目录和resources下面文件的访问目录是一样的,就比如我们之前访问的目录都没有加static之类的
那么久大有可为了,我们给不同的目录分配不同的功能,使代码看起来更加清晰明了
既然如此,万一这些目录下面的文件重名了会如何执行呢?他们之间是有有限顺序的,这个顺序默认是/META-INF/resources>resources>static>public,但是后面会说如何更改
那么还有一个问题是,如果我想自己创建一个目录也是可以通过访问根路径的方式访问该目录下的资源,那我该怎么办?接下来就是正题。
首先我们有两种方式进行配置,但他们的本质是一样的,我这里创建了一个test目录
-1 配置application.yml的方式
spring:
mvc:
static-path-pattern: /**
resources:
static-locations: classpath:/test/,classpath:/static/js/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
这里我们配置了两部分,
第一:static-path-pattern,这个配置项是告诉springboot,应该以什么样的方式去寻找资源。默认配置为 /* 。换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求,我们也可配置成 /user/**,这样我们必须输入/user/index.html才能访问到这些目录下的资源,
第二:spring.resources.static-locations,这个配置项是告诉springboot去哪找资源,根据前后关系确定优先级,也就是说如果/META-INF/resources/目录和/resources都有一个index.html,那么根据默认的优先级,会去访问/test/下的资源。(tips:当更改了此项配置,默认的项目也需要加上,不然会被覆盖,详情可见源码)
那么我们来实验一下:我在每个目录下面都写了index.html

当我访问index.html的时候,优先级最高的就是test目录下的资源

-2 使用配置类的方式
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/test/");
super.addResourceHandlers(registry);
}
}
这种方式需要继承WebMvcConfigurerAdapter类,并重写addResourceHandlers方法,这里的设置跟yml配置基本相似的
https://blog.csdn.net/qq_34797335/article/details/80194137这篇文章可以看看更加详细的源码讲解
https://www.jianshu.com/p/a9e6edd46e98
https://www.cnblogs.com/wangshen31/p/8727359.html
Springboot的resources下资源访问的问题的更多相关文章
- SpringBoot 常用配置 静态资源访问配置/内置tomcat虚拟文件映射路径
Springboot 再模板引擎中引入Js等文件,出现服务器拒绝访问的错误,需要配置过滤器 静态资源访问配置 @Configuration @EnableWebMvc public class Sta ...
- SpringBoot中的静态资源访问
一.说在前面的话 我们之间介绍过SpringBoot自动配置的原理,基本上是如下: xxxxAutoConfiguration:帮我们给容器中自动配置组件: xxxxProperties:配置类来封装 ...
- WEB-INF下资源访问问题
原文链接:http://blog.csdn.net/u010921701/article/details/67637527 问题描述:建了一个Web工程,将js.css等放到了WEB-INF文件下,发 ...
- springboot 读取resources下的文件然后下载
记录下代码 /** * 下载模板 * * @param response * @param request */ @RequestMapping(value = "downloadTemp& ...
- springboot取得resources下的文件
参考http://blog.csdn.net/programmeryu/article/details/58002218 ResourceUtils.getFile("classpath:p ...
- springboot 静态资源访问,和文件上传 ,以及路径问题
springboot 静态资源访问: 这是springboot 默认的静态资源访问路径 访问顺序依次从前到后(http://localhost:8080/bb.jpg) spring.resourc ...
- SpringBoot静态资源访问+拦截器+Thymeleaf模板引擎实现简单登陆
在此记录一下这十几天的学习情况,卡在模板引擎这里已经是四天了. 对Springboot的配置有一个比较深刻的认识,在此和大家分享一下初学者入门Spring Boot的注意事项,如果是初学SpringB ...
- SpringBoot 项目打包后获取不到resource下资源的解决
SpringBoot 项目打包后获取不到resource下资源的解决 在项目中有几个文件需要下载,然后不想暴露真实路径,又没有CDN,便决定使用接口的方式来获取文件.最初的时候使用了传统的方法来获取文 ...
- 聊聊、SpringBoot 静态资源访问
SpringBoot 1.X 版本和 SpringBoot 2.X 版本在静态资源访问上有一些区别,如果直接从 1.X 升级到 2.X 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...
随机推荐
- Kafka如何实现每秒上百万的高并发写入
Kafka是高吞吐低延迟的高并发.高性能的消息中间件,在大数据领域有极为广泛的运用.配置良好的Kafka集群甚至可以做到每秒几十万.上百万的超高并发写入. 那么Kafka到底是如何做到这么高的吞吐量和 ...
- Http 协议学习
借助[小坦克:HTTP 协议教程] 1.HTTP协议是什么 协议是计算机在通信过程中必须共同遵守的规则,我的理解是类似所有汽车在行驶过程中必须共同遵守的交通规则一样. http协议叫超文本协议,是一种 ...
- Spring 的 Bean 管理(XML 方式)
Spring 的 Bean 管理(XML 方式) 1. 三种实例化 Bean 的方式 使用类构造器实例化(默认无参数) 使用静态工厂方法实例化(简单工厂模式) 使用实例工厂方法实例化(工厂方法模式) ...
- Stacey矩阵简介
1. Stacey 矩阵包含哪几个区域? 1区:Simple 第一个区域,需求明确,技术(解决方案)也确定,这类项目就是简单的项目(Simple):比如注册一个新公司,需求很明确,手续也很清楚,就那么 ...
- JS基础_if注意问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 题解 POJ1964/UVA1330/SP277 【City Game】
题目链接: https://www.luogu.org/problemnew/show/UVA1330 http://poj.org/problem?id=1964 https://www.luogu ...
- python之项目依赖管理
生成所有依赖清单 requirements.txt 1. pipreqs 工具 安装) pip install pipreqs 执行生成依赖列表命令) pipreqs ./ 完善版本: pipreq ...
- canva绘制圆角矩形
在做组态的时候,需要支持矩形圆角格式,但是因为canvas本身不带有圆角矩形,需要自行算出坐标进行绘制 方案一.统一圆角 <!DOCTYPE html> <html> < ...
- JSR-303
JSR-303是java标准的验证框架,已有的实现由 Hibernate validator 定义的注解验证bean属性: 空检查 @Null 验证对象是否为空 @NotNull 验证对象不为空 @N ...
- 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...