阅读 254

Web开发的探究 | SpringBoot系列(四)


拓展

点击跳转哦~:SpringBoot系列学习汇总和拓展


@[toc]

前言

  • 其实SpringBoot的东西用起来非常简单,因为SpringBoot最大的特点就是自动装配。
  • 但是靠死记硬背肯定是不行的,毕竟东西太多了,费时费力不讨好的事。下面会有关于SpringBoot自动装配的 源码 讲解,没事的时候多看看,学习里面的思路和想法对我们的成长肯定是有很大好处的!

一、静态资源

1.1、静态资源映射规则详解

  • ①找到WebMvcAutoConfiguration.class文件

在这里插入图片描述

  • ②找到addResourceHandlers(添加资源处理)方法

在这里插入图片描述

  • ③源码探究
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
			super.addResourceHandlers(registry);
			//资源如果不存在,即false,日志打印【默认资源处理被禁用】,不进行处理,直接返回,反之进入第二步
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			ServletContext servletContext = getServletContext();
			//添加静态资源
			//所有的 /webjars/** , 都需要去 classpath:/META-INF/resources/webjars/ 找对应的资源;
			addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
			addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (servletContext != null) {
					registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
				}
			});
		}

		private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, String... locations) {
			addResourceHandler(registry, pattern, (registration) -> registration.addResourceLocations(locations));
		}

		private void addResourceHandler(ResourceHandlerRegistry registry, String pattern,
				Consumer<ResourceHandlerRegistration> customizer) {
			if (registry.hasMappingForPattern(pattern)) {
				return;
			}
			ResourceHandlerRegistration registration = registry.addResourceHandler(pattern);
			customizer.accept(registration);
			registration.setCachePeriod(getSeconds(this.resourceProperties.getCache().getPeriod()));
			registration.setCacheControl(this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl());
			customizeResourceHandlerRegistration(registration);
		}
复制代码

1.2、如何使用webjars访问静态资源

  • ①项目引用webjars: 在这里插入图片描述
  • 添加依赖
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.6.0</version>
</dependency>
复制代码
  • ②找到jar包位置

在这里插入图片描述

  • ③启动项目访问试试看

在这里插入图片描述

在这里插入图片描述

  • ⑤ ok!访问成功!大功告成!

1.3、自定义静态资源路径

  • ① 引入webjars之后,可以在resources文件夹中建立以下三个文件夹:

在这里插入图片描述

  • ②在public中加一个测试的html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>dadadingdada</h1>
</body>
</html>
复制代码
  • ③访问以下试试:打工告成!

在这里插入图片描述

1.4、静态资源路径的顺序

  • ①先在不同的地方分别建立四个一样名字的html文件,但是内容有区别,如下:

在这里插入图片描述

  • ②四个都存在的情况下:优先级最高的是:static目录下的文件

在这里插入图片描述

  • ③删除static目录下的html:优先级:public目录下第二高
    • 记得清楚浏览器缓存,不然看到的可能还是原先的页面

在这里插入图片描述

  • ④删除public目录下的文件:优先级:404

在这里插入图片描述

  • ⑤总结:static优先级高于public,而template必须得通过controller来跳转定向,resources根目录下无法访问,除非自己指定目录。

1.5、指定访问路径

  • 一旦自己定义了静态文件夹的路径,原来的自动配置就都会失效了!
    • yml配置文件中新增:
    • 格式:static-locations: file: + 静态资源所在的路径
spring:
  resources:
    static-locations: file:C:\Users\大大丁大大\Downloads\个人测试文件\dyjProject\src\main\java\com\dyjTest\dyjProject\dyj
复制代码
  • ②访问测试:

在这里插入图片描述

二、首页和图标的定制

2.1 首页

  • ①首页源码:WelcomePageHandlerMapping方法
@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));
			welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
			return welcomePageHandlerMapping;
		}
复制代码
  • ②getWelcomePage()
public FlashMapManager flashMapManager() {
			return super.flashMapManager();
		}

		private Resource getWelcomePage() {
			for (String location : this.resourceProperties.getStaticLocations()) {
				Resource indexHtml = getIndexHtml(location);
				if (indexHtml != null) {
					return indexHtml;
				}
			}
			ServletContext servletContext = getServletContext();
			if (servletContext != null) {
				return getIndexHtml(new ServletContextResource(servletContext, SERVLET_LOCATION));
			}
			return null;
		}
		// 欢迎页就是一个location下的的 index.html 而已
		private Resource getIndexHtml(Resource location) {
			try {
				Resource resource = location.createRelative("index.html");
				if (resource.exists() && (resource.getURL() != null)) {
					return resource;
				}
			}
			catch (Exception ex) {
			}
			return null;
		}
复制代码
  • ③欢迎页,静态资源文件夹下的所有 index.html 页面;被 /** 映射。

在这里插入图片描述

在这里插入图片描述

2.2 图标

  • ①首先关闭默认图标:这里建议将SpringBoot版本降到2.1.7,因为最新版本已经没有这个了

在这里插入图片描述

  • ②yml中添加配置
spring:
  mvc:
    favicon:
      enabled: false
复制代码
  • ③新建 favicon.ico 文件:放在static目录下哦~

在这里插入图片描述

  • ④清楚浏览器缓存后访问:看仔细!!!!在这里插入图片描述

路漫漫其修远兮,吾必将上下求索~ 如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~转载请注明出处哦~

文章分类
后端