9、简单功能分析
文章目录
- 1、静态资源访问
- 1.1、静态资源目录
- 1.2、如果静态资源与controller资源重名
- 1.3、改变默认的静态资源路径
- 1.4、修改静态资源访问前缀
- 1.5、webjar
- 2、欢迎页支持
- 3、自定义 Favicon
- 4、静态资源配置原理
- 4.1、与Web开发有关的相关自动配置类
- 4.2、WebMvcAutoConfiguration 注解介绍
- 4.3、WebMvcAutoConfiguration 功能介绍
- 4.4 WebMvcAutoConfigurationAdapter 内部类
- 1、唯一有参构造器
- 2、资源处理的默认规则
- 4.5 EnableWebMvcConfiguration 内部类
- 1、欢迎页的处理规则
- 4.6、favicon
【尚硅谷】SpringBoot2零基础入门教程-讲师:雷丰阳
笔记
路还在继续,梦还在期许
1、静态资源访问
1.1、静态资源目录
默认静态资源放在类路径下: resources 下 /static 或 /public 或 /resources 或 /META-INF/resources 目录下
访问地址: 当前项目根路径/ + 静态资源名
原理: 写静态资源名自动找到静态资源,静态资源映射/**。
spring:# 默认mvc:static-path-pattern: /**
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
1.2、如果静态资源与controller资源重名
请求进来,先去找Controller看能不能处理。
不能处理的所有请求又都交给静态资源处理器。
静态资源也找不到则响应404页面
1.3、改变默认的静态资源路径
spring:# 默认mvc:static-path-pattern: /**# 改变默认的静态资源路径resources:static-locations: [classpath:/haha/]
1.4、修改静态资源访问前缀
添加前缀
spring:# 添加前缀mvc:static-path-pattern: /res/**
访问地址:当前项目 + static-path-pattern的值 + 静态资源名 = 静态资源文件夹下找
1.5、webjar
可以自动映射 /webjars/** 下的资源
官网
<dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.5.1</version>
</dependency>
存放路径:META-INF/resources/webjars/jquery/3.5.1/jquery.js

访问地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js 后面地址要按照依赖里面的包路径
2、欢迎页支持
- 静态资源路径下 放 index.html
- 可以配置静态资源路径
- 但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致welcome page功能失效resources:static-locations: [classpath:/haha/]
- controller能处理/index
3、自定义 Favicon
favicon.ico 放在静态资源目录下,spring boot 会自动将这个名字的图标当成应用的图标。
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致 Favicon 功能失效
4、静态资源配置原理
spring boot 启动时,会默认加载 xxxAutoConfiguration 类(自动配置类),这里从配置类入手查看源码。
4.1、与Web开发有关的相关自动配置类
DispatcherServletAutoConfiguration: 配置SpringNVC中DispatcherServlet
HttpEncodingAutoConfiguration: 配置编解码
MultipartAutoConfiguration: 配置文件上传
ServletWebServerFactoryAutoConfiguration: 配置服务器
WebMvcAutoConfiguration: SpringMVC功能的自动配置类
4.2、WebMvcAutoConfiguration 注解介绍
// 当前类为配置类,组件之间无依赖关系
@Configuration(proxyBeanMethods = false)
// 程序是Servlet应用
@ConditionalOnWebApplication(type = Type.SERVLET)
// 导入Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class 这三个类
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
// 容器中没有 WebMvcConfigurationSupport.class 组件,当前类中配置才生效
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}
4.3、WebMvcAutoConfiguration 功能介绍
位置:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
// SpringMVC用于兼容REST风格
@Bean
@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)
@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)
public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {return new OrderedHiddenHttpMethodFilter();
}// 表单内容过滤器
@Bean
@ConditionalOnMissingBean(FormContentFilter.class)
@ConditionalOnProperty(prefix = "spring.mvc.formcontent.filter", name = "enabled", matchIfMissing = true)
public OrderedFormContentFilter formContentFilter() {return new OrderedFormContentFilter();
}
4.4 WebMvcAutoConfigurationAdapter 内部类
位置:org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter
// Defined as a nested config to ensure WebMvcConfigurer is not read when not
// on the classpath
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
// 把配置文件的相关属性与WebMvcProperties=(spring.mvc)、ResourceProperties进行绑定=(spring.resources)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {}
1、唯一有参构造器
有参构造器所有参数的值都会从容器中确定
| 形参 | 作用 |
|---|---|
| ResourceProperties resourceProperties; | 获取和spring.resources绑定的所有的值的对象 |
| WebMvcProperties mvcProperties | 获取和spring.mvc绑定的所有的值的对象 |
| ListableBeanFactory beanFactory | Spring的beanFactory(spring的容器) |
| HttpMessageConverters | 找到所有的HttpMessageConverters |
| ResourceHandlerRegistrationCustomizer | 找到 资源处理器的自定义器。重点 |
| DispatcherServletPath | DispatcherServlet处理的路径 |
| ServletRegistrationBean | 给应用注册Servlet、Filter… |
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,ObjectProvider<DispatcherServletPath> dispatcherServletPath,ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {this.resourceProperties = resourceProperties;this.mvcProperties = mvcProperties;this.beanFactory = beanFactory;this.messageConvertersProvider = messageConvertersProvider;this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();this.dispatcherServletPath = dispatcherServletPath;this.servletRegistrations = servletRegistrations;
}
2、资源处理的默认规则
添加资源处理器
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {// 拿到与配置文件绑定的属性spring.resources.add-mappings=true(false禁用静态资源路径映射)if (!this.resourceProperties.isAddMappings()) {//true不进入,false进入logger.debug("Default resource handling disabled");return;}// 获取到配置文件中,静态资源的缓存策略,所有的静态资源在浏览器默认存多少秒Duration cachePeriod = this.resourceProperties.getCache().getPeriod();// 注册第一种访问规则:/webjars/**CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();// 在项目中寻找静态资源if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}// 获取配置文件中spring.mvc.static-path-pattern的值,没有配置就使用默认值:/**String staticPathPattern = this.mvcProperties.getStaticPathPattern();// 在项目中寻找默认位置:{ "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };// 默认的位置也可以修改if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}
}
spring:resources:add-mappings: false #禁用所有静态资源规则cache:period: 1100 # 以秒为单位
4.5 EnableWebMvcConfiguration 内部类
/*** Configuration equivalent to {@code @EnableWebMvc}.*/
@Configuration(proxyBeanMethods = false)
public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {}
1、欢迎页的处理规则
HandlerMapping:处理器映射,保存了每一个Handler能处理哪些请求。
利用反射向容器中注入WelcomePageHandlerMapping ,作用:寻找谁可以处理欢迎页的映射。
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),this.mvcProperties.getStaticPathPattern()); // 获取spring.mvc.static-path-pattern 的值welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());return welcomePageHandlerMapping;
}
位置:org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping
final class WelcomePageHandlerMapping extends AbstractUrlHandlerMapping {WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {// 条件:欢迎页存在,并且路径是默认/**if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {logger.info("Adding welcome page: " + welcomePage.get());setRootViewName("forward:index.html");}else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {// 调用Controller看谁能处理/indexlogger.info("Adding welcome page template: index");setRootViewName("index");}}
}
4.6、favicon
与代码无关,浏览器默认发送当前项目下的favicon功能,当添加访问静态资源前缀,就会找不到。
相关文章:
9、简单功能分析
文章目录1、静态资源访问1.1、静态资源目录1.2、如果静态资源与controller资源重名1.3、改变默认的静态资源路径1.4、修改静态资源访问前缀1.5、webjar2、欢迎页支持3、自定义 Favicon4、静态资源配置原理4.1、与Web开发有关的相关自动配置类4.2、WebMvcAutoConfiguration 注解…...
如何发送和接收参数?五种参数传递方法
通常情况下,我们可以使用GET或POST来发送请求和数据,但GET和POST两种方法所携带的数据都是比较简单的数据,接下来在我们这个基础上,列举5种比较负责的参数传递方法,并对这些参数如何发送,后台改如何接收做详…...
蓝桥杯C/C++VIP试题每日一练之矩形面积交
💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…...
Spark大数据处理讲课笔记2.4 IDEA开发词频统计项目
文章目录零、本讲学习目标一、词频统计准备工作(一)启动集群的HDFS与Spark(二)在HDFS上准备单词文件二、本地模式执行Spark程序(一)创建Maven项目(二)添加Spark相关依赖,…...
【ChatGPT 】国内无需注册 openai 即可访问 ChatGPT:ChatGPT Sidebar 浏览器扩展程序的安装与使用
一、前言 问题:国内注册 openai 账号麻烦,新必应有部分人也无法登录成功,存在域名单点登录失败等问题,所以无法真正使用 ChatGPT 解决:大部分人仅需使用 ChatGPT 的搜索功能,无需真正对话,需要…...
使用fetch()异步请求API数据实现汇率转换器
任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…...
GPT-4“王炸”,10秒钟开发一套Web + APP 系统
10秒钟做出一个网站 一则有关GPT4发布会的视频在网上流传,这则两分钟的视频演示的内容是: 1. 在草稿本上用纸笔画出一个非常粗糙的草图; 2. 拍照告诉 GPT 我们要做一个网站,效果正如图所示,让其生成网站代码࿱…...
Disjoint 集合数据结构或 Union-Find 算法简介
联合查找算法是一种对此类数据结构执行两个有用操作的算法: 查找:确定特定元素在哪个子集中。这可用于确定两个元素是否在同一子集中。联合:将两个子集连接成一个子集。这里首先我们必须检查这两个子集是否属于同一个集合。如果否,…...
uniapp中nvue与vue的区别?
文章目录简介nvue 和 vue 相互通讯方式:nvue注意事项:简介 uni-app是逻辑渲染分离的,渲染层在app端提供了两套排版引擎, 小程序方式的webview渲染和weex方式的原生渲染,两种渲染引入可以自己根据需要选。 vue文件走的…...
带头双向循环链表的实现
1.结构体的创建以及类型重定义 typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; }LTNode;2.链表的初始化 这个函数用于创建节点,后面还会用到。 LTNode* BuyListNode(LTDataType x) {LTNode* n…...
大屏使用dv-digital-flop定时刷新显示总人数
本文在基础上进行改进,后端使用若依后端IofTV-Screen: 🔥一个基于 vue、datav、Echart 框架的物联网可视化(大屏展示)模板,提供数据动态刷新渲染、屏幕适应、数据滚动配置,内部图表自由替换、Mixins注入等功…...
Java面向对象部分 个人学习记录
注:此博客是个人学习记录,会有错的地方,面向对象部分我可能会画很多图来加深我的理解 不引出了,直接开始 class Dog{String name;int age;String type;public Dog(String name,int age,String type){this.namename;this.ageage;this.typetyp…...
MySQL数据库——对Linux MySQL软件包的一些说明
Linux 操作系统的发行版很多,不同发行版下的 MySQL 版本也是不同的。MySQL 主要支持的 Linux 版本有 Red Hat Enterprise Linux 和 SUSE Linux Enterprise Server。这里主要介绍不同 Linux 发行版下 MySQL 支持的版本。 Linux 操作系统的 MySQL 软件包一般分为以下…...
【JavaEE进阶】——第二节.Spring核心和设计思想
文章目录 前言 一、Spring是什么? 二、什么是容器? 三、什么是IoC? 3.1 初始loC 3.2 举例解释loC 3.3 Spring IoC思想的体现 四、什么是DI? 4.1DI的概念 4.2 Ioc和DI的区别 总结 前言 今天我们将进入到有关spring的认识当中&…...
twitter开源算法(1)For You推荐系统架构
1 Twitter’s Recommendation Algorithm 我们的推荐系统由许多互相关联的服务(services)和工作(jobs)组成,本节这要是聚焦home timeline的for you feed流。 the-algorithm开源地址:https://github.com/twitter/the-algorithm 本篇博客来源&…...
A General Framework for Uncertainty Estimation in Deep Learning源码阅读(二)
接上文 ResNet定义: 代码使用 def ResNet18ADF(noise_variance1e-3, min_variance1e-3):return ResNet(BasicBlock, [2,2,2,2], num_classes10, noise_variance1e-3, min_variance1e-3, initialize_msraFalse)定义模型,其中ResNet定义为: …...
串行通信协议---HART协议
实际应用中,HART协议是仅次于Modbus协议的最接近统一现场总线的标准,主要是在4~20mA电流信号上面叠加数字信号,物理层采用Bell 202标准的FSK技术成功实现模拟信号和数字信号双向同时通信而互不干扰。HART协议规定了传输的物理形式、消息结构、…...
【独家】华为OD机试 - 寻找密码(C 语言解题)
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本期题目:寻找密码 题目 小王在进行游…...
FPGA有哪些优质的带源码的IP开源网站?
这是某乎上的一个问题,我觉得还不错,今天就系统性的总结一下1、fpga4funhttps://www.fpga4fun.com/你能在这个网站上找到什么?您可以找到信息页面,以及使用 FPGA 板构建的 FPGA 项目。注重点:项目。FPGA 项目使用一种称…...
基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
OneNET物联网平台接入避坑指南:Android端用MQTTS协议请求数据,为什么你的Token总失效?
OneNET物联网平台MQTTS接入实战:Android端Token失效的深度排查与解决方案 第一次在Android应用中集成OneNET的MQTTS协议时,我盯着调试日志里反复出现的"401 Unauthorized"错误整整两天。官方文档看似清晰,但实际对接时才发现&…...
单细胞分析进阶:手把手教你用hdWGCNA挖掘Treg细胞关键基因模块(附完整代码)
单细胞分析进阶:手把手教你用hdWGCNA挖掘Treg细胞关键基因模块(附完整代码) 在免疫微环境中,调节性T细胞(Treg)扮演着维持免疫平衡的关键角色。理解这些细胞的基因共表达网络对于揭示其功能机制至关重要。本…...
3大核心挑战+5步完美防御:RevokeMsgPatcher让消息撤回彻底失效
3大核心挑战5步完美防御:RevokeMsgPatcher让消息撤回彻底失效 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: https://git…...
大模型入门指南:小白程序员必看,收藏学习路径!
一、基础通用概念AI(人工智能) 让机器模拟人类智能(感知、推理、学习、决策)的技术总称。 ML(机器学习) AI 的核心分支:让机器从数据中自动学习规律,不用逐条写规则。 DL(…...
探索Pem电解槽三维仿真模型:聚焦氢气扩散
Pem电解槽三维仿真模型,阴极不通水,只考虑氢气的扩散,使用二次电流分布浓物质传递自由与多孔介质流,不使用水电解槽节点。最近在研究Pem电解槽的三维仿真模型,这里面有个挺有意思的设定,阴极不通水…...
Video-LLaMA部署指南:如何在本地服务器上高效运行多模态AI
Video-LLaMA部署指南:如何在本地服务器上高效运行多模态AI 【免费下载链接】Video-LLaMA [EMNLP 2023 Demo] Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding 项目地址: https://gitcode.com/gh_mirrors/vi/Video-LLaMA …...
用Cursor+LocalStorage实现无后端项目管理:前端开发者的轻量级解决方案
用CursorLocalStorage实现无后端项目管理:前端开发者的轻量级解决方案 在当今快节奏的开发环境中,前端开发者常常需要快速搭建小型项目管理工具来跟踪个人或团队的工作进度。传统方案往往需要配置数据库、搭建后端API,这对于简单需求来说显得…...
Vue 过滤器详解及 Vue 3 中的替代方案
Vue 过滤器详解及 Vue 3 中的替代方案 一、Vue 过滤器的核心概念与特性 Vue 过滤器(Filter)是 Vue 2.x 提供的用于数据格式化转换的机制,其核心设计理念是不修改原始数据,仅对显示层进行格式化处理。过滤器本质上是纯函数…...
前端埋点数据爆炸?WebTracing缓存策略与采样率配置避坑指南
前端埋点数据治理实战:WebTracing缓存策略与采样率配置深度解析 当你的应用日活突破百万量级时,埋点数据会像雪崩一样涌向服务器。某电商平台曾因未合理配置前端监控,导致单日产生2.3TB冗余埋点数据,不仅每年浪费数百万云存储成本…...
CVPR 2026 手物交互数据生成新SOTA
Project Page: https://gasaiyu.github.io/PAM.github.io/01▪ 在只给定初始姿态、目标姿态和不含外观的物体几何信息的输入下,如何直接生成逼真的手物交互(HOI)视频?▪ 现有方法存在一系列问题:姿态合成方法只能预测 …...
