2.1、静态资源访问
1、静态资源目录
类路径下:
/static
/public
/resources
/META-INF/resources
访问:当前项目根路径/ + 静态资源名
spring官方文档给我们说什么:
其实它映射的是
/**
,也就是说你只要写资源名,他就会自动给你找到静态资源;如果你想改变默认的静态资源访问的这个根目录你可以再配置文件中写spring.mvc.pattern
spring.mvc.static-path-pattern=/resources/**
这是什么场景呢?
我们来看一下静态文件资源访问原理。它怎么知道要找静态资源而不是找请求。
其实非常方便
比如我先来创建一个
Controller.java
package com.example.boot05web01.Contorller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/YSN1.jpg") public String hello(){ return "aaa"; } }
比如正好,我有一个动态请求名叫
YSN1.jpg
我们还有一个静态资源也叫YSN1.jpg
,但是动态请求给我返回的是aaa
.猜一猜我们同时访问YSN1.jpg
他是给我们找的是动态资源还是静态目录下的静态资源。浏览器给我们返回的是
Controller
里面的aaa
原理:因为我们静态映射(/**
)是拦截所有请求的;而巧了我们动态资源也要看所有请求,所以请求一进来先是去找了Controller
看能不能处理,如果Controller
能处理就处理 , 如果不能因为我们静态资源映射的是/**
,所以所有的资源不能处理的所有请求有交给静态资源处理器,静态资源就会去我们(/static /public /resources /META-INF/resources
)然后按照我们请求的名字来找。如果静态资源也找不到就会是404
你的静态资源默认是我们根目录路劲加上我们的静态资源名就能访问,但是如果你想要静态资源加一个前缀也行,这个是我们以后经常要用的,我们举一个例子: 我们的web应用,应用里面有超多静态资源,然后还有我们的动态请求,但是我们应用里面肯定有相应的拦截器要做一些功能,比如我们登录拦截器,我们只有登录以后我们才能访问动态请求,所以我们一般拦截器如果拦/**
相当于把静态文件全拦住了,所以未来拦截器配置方便,我们让所有静态文件访问都带一个前缀,这样让我们拦截器放行指定前缀的路劲开始的所有请求,这样我们以后就非常方便能放我们过滤的静态资源,所以我们一般希望静态文件访问的路劲都有一个前缀
2、静态资源的访问前缀
默认是无前缀的。如果我们想要给他一个指定前缀,spring官方说,你只要指定配置一个
spring.mvc.static-path-pattern=/resources/**
yml
里面配置是:
spring:
mvc:
static-path-pattern: /resources/**
所以以后我们访问静态文件就都应该是当前项目更目录下加/resources
(访问前缀,可以是res
与文件包名无关)加静态文件名
当前项目(localhost:端口号)/ + static-path-pattren / + 静态资源名 == 静态资源文件夹下找
另外一点就是:人家官方也说这个静态资源路劲你也可以改变
spring.resources.static-locations
因为我们现在静态资源的路径是在/static /public /resources /META-INF/resources
这四个目录下找的,我不想让它在这四个目录下找。
改变默认的静态资源路径
spring: #spring
resources: #资源策略下的
static-locations: classpath:/MyStaticRes #一个配置项
#classpath:就代表我们所有静态资源在类路径下来找一个位置
#/MyStaticRes:我们希望把所有的静态文件都放在这个文件夹下
这样以改变后以前的四个文件夹下的静态资源就找不到了。
温馨提示:我本人在测试的时候放在前面三个文件夹里的静态资源都失效了唯独’/META-INF/resources’还是可以的
静态资源的路径:
ctrl+箭头点击static-locations查看 -> return super.getStaticLocations(); -> return this.staticLocations; -> private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
-> private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
我们这个静态资源路径你也可以配多个,因为这也是一个数组
数组写法:
spring:
resources:
static-locations: [classpath:/MyStaticRes/]
另外就是:我们spring官方文档里面还说他还能映射/webjars/**
下的所有
webjars就是:
把我们这个jar包,相当于css、js这些东西他弄成了一个jar包
webjars
pom.xml里导入依赖
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
可以直接在url里面写
http://localhost:端口号/webjars/jquery/3.6.0/dist/jquery.js
/jquery/3.6.0/dist/jquery.js的地址要按照依赖里面的包路径
包括使用jquery压缩版的不使用完整版的:
http://localhost:端口号/webjars/jquery/3.6.0/dist/jquery.min.js