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 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...
随机推荐
- ajax同源策略,jsonP跨域访问
浏览器处于安全性的考虑,要求ajax请求,必须满足同源策略 规定:访问的协议://域名:端口号都相同时满足同源策略,浏览器可以正确解析数据,否则如果有一项不满足要求,则属于跨域访问,浏览器可以正常获取 ...
- ARST第二周打卡
Algorithm : 做一个 leetcode 的算法题 题目:一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数.如何找出这个缺失的整数? int FindOneMissNum ...
- PAT A1065 A+B and C (64bit) (20 分)
AC代码 #include <cstdio> int main() { #ifdef ONLINE_JUDGE #else freopen("1.txt", " ...
- Linux就该这么学——新手必须掌握的命令之系统状态检测命令组
ifconfig命令 用途 : 获取网卡配置与网络状态等信息 格式 : ifconfig[网络设备][参数] 其实主要查看的就是网卡名称,inet参数后面的IP地址,ether参数后面的网卡物理地址( ...
- JWT的认识和session的区别
1.前后端分离框架中前端和后端域名不同,不能跨域请求,加上移动端无cookie,所以无法使用session.2.基于token的认证和传统的session认证的区别: 传统的session认证: 我们 ...
- PBOC第八部分和第十一部分关于TYPEA总结(二)——传输协议(ISO14443-4)
二.传输协议(ISO14443-4)(8,P50 11,P30) 1.选择应答请求(RATS) 使用RATS命令和PICC协商通讯的最大帧长度(FSD和FSC).帧等待时间(FWT)和启动帧保护时间( ...
- vb.net DBEntities框架联表查询 Join
在项目中配置好DBEntities 使用两个表:主表Table, 子表Table_Item 主要是用到了委托和泛型,ForEach用的是不带返回值的委托 Sub GetDb() Dim st As N ...
- JS基础_赋值运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 题解luoguP2054 BZOJ1965【[AHOI2005]洗牌】
题目链接: https://www.luogu.org/problemnew/show/P2054 https://www.lydsy.com/JudgeOnline/problem.php?id=1 ...
- Java基础第二天--多态、接口
多态 多态的概述 同一个对象,在不同时刻表现出来的不同形态 多态的前提和体现 有继承/实现关系 有方法重写关系 有父类引用指向子类对象 public class Animal { public voi ...