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 肯定是有问题的.这篇文章就来讲讲这方面问题,也是项目中的坑. 先 ...
随机推荐
- Codeforces Round #574 (Div. 2)补题
A. Drinks Choosing 统计每种酒有多少人偏爱他们. ki 为每种酒的偏爱人数. 输出ans = (n + 1)/2 > Σki / 2 ? (n + 1)/2 - Σki / ...
- 洛谷 P2018 消息传递 题解
题面 总体来说是一道从下往上的DP+贪心: 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间: 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可 ...
- Java EE javax.servlet中的ServletRequest接口
ServletRequest接口 public interface ServletRequest 子接口:HttpServletRequest 实现类:HttpServletRequestWrappe ...
- supersocket特征
SuperSocket, 可扩展的 Socket 服务器框架 SuperSocket 是一个轻量级, 跨平台而且可扩展的 .Net/Mono Socket 服务器程序框架.你无须了解如何使用 Sock ...
- java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2 ...
- windows服务总结
一.创建windows服务项目创建完成后结构,如: 其中,Program.cs代码: using System; using System.Collections.Generic; using Sys ...
- vue之scoped穿透
vue之scoped穿透 问题:在页面中,需要了第三方插件的样式,又不想取消scoped,防止造成样式污染 方法:>>> 代码: #tab >>> .ivu-tab ...
- java文件上传复制等功能
package com.sitech.message.controller.task;import java.io.File;//引入类 import java.io.FileInputStream; ...
- 3.移动端自动化测试-appium环境搭建(原理)
appium自动化原理: 需要服务端(appium启动),手机端(adb连接设备),脚本端(pycharm)就可以进行 自己总结下: 手机和脚本连接:1.adb连接,2靠脚本导入驱动. 脚本和服务端连 ...
- 移动端h5+vue失焦搜索,ios和android兼容问题
html部分: <input type="search" :placeholder="placeholder" v-model="searchN ...