2023年11月28日发(作者:)

Springbootresources下资源访问的问题

对于路径问题,是让我⼀直感到痛苦的事情,⾸先是因为我的眼⾼⼿低,感觉路径这么简单根本没必要去看,但是昨天项⽬组长的冷嘲

热讽让我⽆地⾃容:你竟然连linuxwindow的路径的区别都不知道,呵呵。事情的起因是我在配置⽇志⽂件的时候,我不晓得window

径下的根⽬录是什么,于是我打开了cmd,想输⼊cd /,但是发现cd /之后的路径是盘符根⽬录,woc这是不是根⽬录,接下来就被⽆情的嘲

讽了。⾔归正传,对于springboot的资源⽬录我⼀直是莫名其妙的只有⼀个Resources⽬录,那么它的⽬录结构是怎样的呢?我把我遇到的

所有情况都记录下来作为记忆。

SpringBoot的资源⽬录的分类

-1. static 存放静态资源,⽐如静态画⾯,图⽚,js等等

⽐如这⾥我们新建⼀个,我们可以直接访问到静态⽬录的资源

也可以使⽤Controller跳转

@Controller

public class RedirectController {

@RequestMapping("/stc")

public String stc(){

return "";

}

}

-2. templates 存放动态画⾯等

templates下⾯存放的动态页⾯不能通过url中输⼊.html的⽅式直接访问,需要通过请求服务器,在转到动态画⾯。

我们需要使⽤⼀种⽅式达到⽬的,就像是jsp⼀样,使⽤数据加模板的形式进⾏渲染,但是jsp不利于前后端分离的开发(虽然我觉得使⽤

java写前端很安逸,但是Springboot不建议使⽤jsp

官⽅建议的是使⽤Thymeleaf来做动态界⾯,这⾥我使⽤的是freemakerspringboot也是集成了freemaker的。

这是我templates下⾯

⾸先引⼊依赖

spring-boot-starter-freemarker

然后在进⾏简单的配置,这个配置的作⽤在后⾯会讲

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 配置的⽅式

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/才能访问到这些⽬录下

的资源,

第⼆:-locations,这个配置项是告诉springboot去哪找资源,根据前后关系确定优先级,也就是说如果/META-

INF/resources/⽬录和/resources都有⼀个,那么根据默认的优先级,会去访问/test/下的资源。(tips:当更改了此项配置,默认

的项⽬也需要加上,不然会被覆盖,详情可见源码)

那么我们来实验⼀下:我在每个⽬录下⾯都写了

当我访问的时候,优先级最⾼的就是test⽬录下的资源

-2 使⽤配置类的⽅式

import uration;

import ceHandlerRegistry;

import ConfigurerAdapter;

@Configuration

public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

@Override

public void addResourceHandlers(ResourceHandlerRegistry registry) {

ourceHandler("/**").addResourceLocations("classpath:/test/");

ourceHandlers(registry);

}