SpringBoot-06-Web开发静态资源处理

SpringBoot-06-Web开发静态资源处理

1. 简介

使用SpringBoot的步骤:

1、创建一个SpringBoot应用,选择我们需要的模块,SpringBoot就会默认将我们的需要的模块自动配置好

2、手动在配置文件中配置部分配置项目就可以运行起来了

3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。

要熟悉掌握开发,之前学习的自动配置的原理一定要搞明白!

  • 比如SpringBoot到底帮我们配置了什么?我们能不能修改?我们能修改哪些配置?我们能不能扩展?

  • 向容器中自动配置组件 :xxxAutoconfiguration

  • 自动配置类,封装配置文件的内容:xxxProperties

提醒:

  • 没事就找找类,看看源码,理解自动装配原理!

2. 静态资源导入

  • 首先,我们搭建一个普通的SpringBoot项目,回顾一下HelloWorld程序!

  • 写请求非常简单,那如果要引入我们前端资源

    • 项目中有许多的静态资源,比如css,js等文件,这个SpringBoot怎么处理呢?
  • 疑问分析

    • 如果是一个web应用,我们的main下会有一个webapp,我们以前都是将所有的页面导在这里面的,对吧!(war包)
    • 但是我们现在的pom呢,打包方式是为jar的方式,那么这种方式SpringBoot能不能来给我们写页面呢?当然是可以的,但是SpringBoot对于静态资源放置的位置,是有规定的!

先来聊聊这个静态资源映射规则:

  • SpringBoot中,SpringMVC的web配置都在WebMvcAutoConfiguration这个配置类里面
  • 看看 WebMvcAutoConfigurationAdapter 中有很多配置方法;
  • 有一个方法:addResourceHandlers 添加资源处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
// 1. 如果有自定义配置,那么默认配置就失效
logger.debug("Default resource handling disabled");
return;
}
// 2. 缓存控制
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
//2.1 方式一:webjars方式配置
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}

//2.2 方式二:静态资源配置
String staticPathPattern = this.mvcProperties.getStaticPathPattern();

if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
}
}
  • 读一下源代码:比如所有的 /webjars/**, 都需要去 classpath:/META-INF/resources/webjars/ 找对应的资源;

2.1 方式一 : webjars

  • Webjars本质就是以jar包的方式引入我们的静态资源 , 我们以前要导入一个静态资源文件,直接导入即可。

  • 使用SpringBoot需要使用Webjars,我们可以去搜索一下:

1
2
3
4
5
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
  • 导入完毕,查看webjars目录结构,并访问Jquery.js文件!

2.2 方式二 : 静态资源映射(重要)

  • 那项目中要是使用自己的静态资源该怎么导入呢?我们看下一行代码;
    • 去找staticPathPattern发现第二种映射规则 :/**
    • 访问当前的项目任意资源,它会去找 resourceProperties 这个类,可以点进去看一下分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
// 进入方法
public String[] 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/"
};
  • ResourceProperties 可以设置和我们静态资源有关的参数;这里面指向了它会去寻找资源的文件夹,即上面数组的内容。

  • 所以得出结论,以下四个目录存放的静态资源是我们可以识别到的

1
2
3
4
5
6
// classpath = src/main or src/resources
优先级如下:
"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
  • 可以在resources根目录下新建对应的文件夹,都可以存放我们的静态文件;
  • 比如我们访问 http://localhost:8080/1.js
    • 他就会去这些文件夹中寻找对应的静态资源文件;

2.3 方式三: 自定义静态资源路径

  • 我们也可以自己通过配置文件来指定一下,哪些文件夹是需要我们放静态资源文件的,在application.properties中配置;
  • 注意:开发日常不要使用
1
spring.resources.static-locations=classpath:/coding/,classpath:/zhuuu/

3. 首页定制

  • 静态资源文件夹说完后,继续向下看源码!可以看到一个欢迎页的映射,就是首页!
1
2
3
4
5
6
7
8
9
10
11
12
13
// 处理页面地址映射
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(
ApplicationContext applicationContext,
FormattingConversionService mvcConversionService,
ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext),
applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
return welcomePageHandlerMapping;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// 2. 从resourceProperties获取资源路径
private Optional<Resource> getWelcomePage() {
String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
// ::是java8 中新引入的运算符
// Class::function的时候function是属于Class的,应该是静态方法。
// this::function的funtion是属于这个对象的。
// 简而言之,就是一种语法糖而已,是一种简写
return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
}
// 3. 欢迎页就是一个location下的的 index.html 而已
private Resource getIndexHtml(String location) {
return this.resourceLoader.getResource(location + "index.html");
}
  • 欢迎页,静态资源文件夹下的所有 index.html 页面;被 / 映射

  • 比如我访问 http://localhost:8080/ ,就会找静态资源文件夹下的 index.html

  • 新建一个index.html,在我们上面的3个目录中任意一个;然后访问测试 http://localhost:8080/ 看结果!

4. 网页的图标

  • 与其他静态资源一样,Spring Boot在配置的静态内容位置中查找 favicon.ico。如果存在这样的文件,它将自动用作应用程序的favicon。

步骤如下:

  1. 关闭SpringBoot默认的图标
1
2
#关闭默认图标
spring.mvc.favicon.enabled=false
  1. 自定义放一个图标在静态资源目录下
  2. 清除浏览器缓存,刷新网页,发现图标变成自己的了!

5. 关于 Templates目录

  • 注意
    • Templates目录下的东西只能通过controller进行访问
    • 相当于是以前的web-info下的目录
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信