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 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...
随机推荐
- Java实现循环队列
一.分析 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.允许插入的一端称为队尾,允许删除的一端称为队头. 循环队列是一种以顺序存储结构表示的队列,为了解决“假溢出”问题而 ...
- P1373 小a和uim之大逃离(DP)
(点击此处查看原题) 题意 中文题,题意看题面吧. 解题思路 注意到我们只能向右和下移动,由此想到开二维的dp数组dp[i][j],代表当前所在位置 我们需要让两人取数的差值为0,由于起点和走法的不同 ...
- phpQuery简介
接上一篇,使用 Snoopy 抓取回来网页之后,需要解析网页中的元素,但是对于 https://www.cnblogs.com/hellowzd/p/5163276.html
- 从入门到自闭之Python--虚拟环境如何安装
Windows下创建虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新版本会覆盖以前的版 ...
- Selenium IDE for firefox
第一次接触selenium. 首先, selenium支持的 Firefox版本是17.0~34.x. 打开火狐历史版本:http://ftp.mozilla.org/pub/firefox/rele ...
- OnVScroll的通常处理
void CDialogLAMP::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码 ...
- 16-Perl 文件操作
1.Perl 文件操作Perl 使用一种叫做文件句柄类型的变量来操作文件.从文件读取或者写入数据到文件需要使用文件句柄.文件句柄(file handle)是一个I/O连接的名称.Perl提供了三种文件 ...
- z-index神奇的失效了!!!
z-index简单介绍 首先z-index只对定位元素有效,什么是定位元素呢,也就是设置了position属性的元素,position:relative--相对定位,position:absolute ...
- ztree树id、pid转成children格式的(待整理完整)
山铝菜单 因为菜单选用了bootstrap treeview ,而格式需要是children类似的格式 var nodes = [ {name: "父节点1", children: ...
- 9 java 笔记
1 所有的java对象都可以和字符串进行连接运算 2 在java中判断两个变量是否相等时:==运算符适用于基本类型的判断 3 JVM常量池保证相同的字符串直接量只有一个,不会产生多个相同的副本 4 O ...