springboot知识点以及源码解析(2)

web开发--静态规则与定制化

springboot对静态资源的映射规则:在类路径下面定义目录static或public或resources或者META-INF/resources,访问时项目根目录+静态资源的名称

在springboot中,如果项目中存在同名的静态资源和同名的动态资源。那么我们会优先去访问动态资源,如果动态资源不存在,然后再去访问对应的静态资源,如果静态资源也找不到,那么就报404 的异常 ,为了解决这个问题。

  1. 可以在配置文件中自定义静态资源的映射规则,例如:spring.mvc.static-path-pattern=/resources/**,那么访问静态资源时根目录+resources+静态资源名称。
  2. 也可以给静态资源设置自定义的存放目录:例如spring:web:resourcesstatic-locations:[classpath:/hello/],那么在资源下创建hello这个文件夹,下面放静态资源
  3. 我们也可以访问webjars的资源(webjars 就是将静态资源打成jar包。)
    1、引入相关静态资源的jar包(依赖)
    <dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId)
    <version>3.5.1</version>
    </dependency>
    2、通过官方给定的访问路径去访问里面的资源
    http://localhost:8082/webjars/jquery/3.5.1/jquery.js

静态资源和首页映射规则底层原理

源码

webMvcAutoConfiguration底层是如何进行装配的。在org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration中的注解

 在这个类中,主要看WebMvcAutoConfigurationAdapter,是WebMvc自动配置的适配器,

看下面的这个方法 WebMvcAutoConfigurationAdapter,它是一个构造方法,参数从哪里来?

public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {this.resourceProperties = webProperties.getResources();this.mvcProperties = mvcProperties;this.beanFactory = beanFactory;this.messageConvertersProvider = messageConvertersProvider;this.resourceHandlerRegistrationCustomizer = (ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable();this.dispatcherServletPath = dispatcherServletPath;this.servletRegistrations = servletRegistrations;}
  • WebProperties 和 WebMvcProperties:被SpringBoot自动创建并填充到配置文件中,通过@EnableConfigurationProperties注解进行引入,上面图片可以看到
  • ListableBeanFactory: 代表了一个可以列出所有已注册bean定义的bean工厂。它是Spring IoC容器的一部分,不需要特别指定,Spring会自动将其传递给需要它的bean。

  • ObjectProvider<HttpMessageConverters> 和 ObjectProvider<ResourceHandlerRegistrationCustomizer>: 这两个 ObjectProvider 是用来延迟加载特定类型的bean的。如果Spring上下文中存在类型为 HttpMessageConvertersResourceHandlerRegistrationCustomizer 的bean,那么它们就会被注入到这里。如果没有找到匹配的bean,也不会导致错误,因为 ObjectProvider 支持可选的依赖项

  • ObjectProvider<DispatcherServletPath> 和 ObjectProvider<ServletRegistrationBean<?>>: 类似地,这两个也是 ObjectProvider 实例,用于提供对 DispatcherServlet 路径和 ServletRegistrationBean 的访问。如果有相应的bean存在于上下文中,它们将会被注入。

那么适配器初始化这些信息后,那么静态资源是如何生效的?

静态资源是如何生效的

在这个类(

public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware 

)下,有一个addResourceHandlers方法,下面进行图解。

也可以点进去,可以得到

 欢迎页

在WelcomePageHandlerMapping类下的WelcomePageHandlerMapping方法中

WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders, ApplicationContext applicationContext, Resource indexHtmlResource, String staticPathPattern) {this.setOrder(2); // 优先级为 2。// 确定是否有可用的欢迎页面WelcomePage welcomePage = WelcomePage.resolve(templateAvailabilityProviders, applicationContext, indexHtmlResource, staticPathPattern);if (welcomePage != WelcomePage.UNRESOLVED) { // 如果找到了欢迎页面// 根据欢迎页面是否为模板,记录日志logger.info(LogMessage.of(() -> {return !welcomePage.isTemplated() ? "Adding welcome page: " + String.valueOf(indexHtmlResource) : "Adding welcome page template: index";}));// 创建一个新的实例,可以指定视图名称ParameterizableViewController controller = new ParameterizableViewController();// 设置控制器的视图名称为欢迎页面的视图名称controller.setViewName(welcomePage.getViewName());// 将创建的控制器设置为此 HandlerMapping 的根处理器this.setRootHandler(controller);}
}

springboot中rest请求处理原理

@RestController
public class HelloController {@RequestMapping(value = "/hello",method = RequestMethod.GET)public String sayHello(){return "Hello World!";}
}

在非 REST 风格的传统代码中,为了执行数据的增删改查操作,通常需要将每个操作映射到不同的路径上。然而,采用 REST 风格后,可以使用相同的路径来表示同一个资源,并通过不同的 HTTP 方法(如 POST 用于创建,GET 用于查询,PUTPATCH 用于更新,以及 DELETE 用于删除)来区分这些操作。这样,我们就可以通过单一的端点路径结合适当的请求方法来管理资源,从而提高 API 的清晰度和可维护性。例如,在 Spring MVC 中,你可以通过 @RequestMapping 注解的 method 属性指定支持的 HTTP 方法类型,或者直接使用简化的组合注解如 @GetMapping, @PostMapping, @PutMapping, 和 @DeleteMapping 来实现这一点。同时,@RequestMapping 注解中的 pathvalue 属性互为别名,都可以用来指定请求路径。这样的设计有助于构建更加简洁、一致的服务接口。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping(value = "user",method = RequestMethod.GET)public String get(){return "Hello User Get!";}@RequestMapping(value = "user",method = RequestMethod.POST)public String post(){return "Hello User Post!";}@RequestMapping(value = "user",method = RequestMethod.PUT)public String put(){return "Hello User Put!";}@RequestMapping(value = "user",method = RequestMethod.DELETE)public String delete(){return "Hello User Delete!";}
}// demo1.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form action="/user" method="get"><input value="GET提交" type="submit"></form><form action="/user" method="post"><input value="Post提交" type="submit"></form><form action="/user" method="post"><input value="Put提交" type="submit"></form><form action="/user" method="post"><input value="Delete提交" type="submit"></form>
</body>
</html>

由于表单中只能由get和post,没有put和delete,因此它们用post进行代替。设想点击不同的按钮进入不同的表单页,显示不同的值,是这样吗?来看下结果,结果显示:对于get和post提交是正常的,但是对于put和delete提交显示的是Hello User Post!这是由于表单中只能由get和post,为了弄清楚它,回到D:\java\mvn_repository\org\springframework\boot\spring-boot-autoconfigure\3.4.3\spring-boot-autoconfigure-3.4.3.jar!\org\springframework\boot\autoconfigure\web\servlet\这个路径下的WebMvcAutoConfiguration.class类中。过滤器默认不开启,开启需要添加配置文件

在HiddenHttpMethodFilter中,有一个doFilterInternal方法,

进行debug,先发送get请求,进不到if,执行filterChain.doFilter((ServletRequest)requestToUse, response);进行放行

 下面看下post请求,其中this.methodParam是一个_method参数,需要在html文件中进行配置

下面看下加上_method的put请求,delete同理

 注意:下面两者等价 

@RequestMapping(value = "user",method = RequestMethod.GET)
@GetMapping("user")

springboot处理器映射器工作原理

        在SpringMVC中有一个组件DispatcherServlet,在DispatcherServlet.class这个类下,它是用于处理前端用户的请求。体系结构如下:

进入FrameworkServlet中,有doGet,doPost,doPut和doDelete,它们四个处理Http请求,这四个方法都调用了processRequest方法,在processRequest方法中,首先进行一些初始化,然后在doService方法中提供服务,doService方法中又有doDispatch方法,这个方法中关注这句话:mappedHandler = this.getHandler(processedRequest);

 

如果是不大于1的话: 

总结:用户的请求交给DispatcherServlet前端控制器中的doDispatch方法进行处理,其中被doDispath方法中的getHandler获取想要的handler对象,这个handler对象被包装到HandlerExecutionChain里面。那么handler如何被获取?mappedHandler=this.getHandler(processedRequest)方法帮助处理,this.getHandler内部,有5个映射器,RequestMappingHandlerMapping处理被@RequestMapping注解修饰的处理器方法,返回一个handler。这个handler最终交给处理器适配器进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:string容器(下篇)

1.string浅拷贝的问题 // 为了和标准库区分&#xff0c;此处使用String class String { public :/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") // 错误示范//String(const char* str nullptr) // 错误示范String(const char* str …

使用 vxe-table 导出 excel,支持带数值、货币、图片等带格式导出

使用 vxe-table 导出 excel&#xff0c;支持带数值、货币、图片等带格式导出&#xff0c;通过官方自动的导出插件 plugin-export-xlsx 实现导出功能 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;htt…

JavaScript数据类型和内存空间

一、JavaScript 数据类型 基本数据类型&#xff1a;字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、空&#xff08;Null&#xff09;、未定义&#xff08;Undefined&#xff09;、Symbol 引用数据类型&#xff1a;对象(Object)、数组(Array)、函数(Fun…

DNS Beaconing

“DNS Beaconing” 是一种隐蔽的网络通信技术&#xff0c;通常与恶意软件&#xff08;如木马、僵尸网络&#xff09;相关。攻击者通过定期发送 DNS请求 到受控的域名服务器&#xff08;C&C服务器&#xff09;&#xff0c;实现与恶意软件的隐蔽通信、数据传输或指令下发。由…

python中采用opencv作常规的图片处理的方法~~~

在python中&#xff0c;我们经常会需要对图片做灰度/二值化/模糊等处理&#xff0c;这时候opencv就是我们的好帮手了&#xff0c;下面我来介绍一下相关用法: 首先&#xff0c;需要安装opencv-python库: 然后&#xff0c;在你的代码中引用: import cv2 最后就是代码了&#x…

CmBacktrace的学习跟移植思路

学习移植CmBacktrace需要从理解其核心功能、适用场景及移植步骤入手&#xff0c;结合理论学习和实践操作。以下是具体的学习思路与移植思路&#xff1a; 一、学习思路 理解CmBacktrace的核心功能 CmBacktrace是针对ARM Cortex-M系列MCU的错误追踪库&#xff0c;支持自动诊断Har…

支付宝当面付java,php,sdk下载

SDK & Demo 获取 - 支付宝文档中心 开放平台服务端 SDK 为了帮助开发者调用开放接口&#xff0c;支付宝提供了开放平台服务端 SDK&#xff0c;包含 Java、PHP、NodeJS、Python 和 .NET 等语言版本&#xff0c;DEMO 中封装了签名 & 验签、HTTP 接口请求等基础功能。 详…

Cocos Creator Shader入门实战(三):CCEffect参数配置讲解

引擎版本&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 稍微回顾下前面两篇博客讲解的内容&#xff1a; 一、Cocos渲染效果的实现需要Material材质和Effect资源的互相配合。 二、Effect资源负责Shader片段的编写和属性配置&#xff0c;Material材质负责对E…

AI日报 - 2025年3月10日

AI日报 - 2025年3月10日 &#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Anthropic CEO预测强AI最早2026年到来 &#x1f52c; SAGE框架提升问答质量61.25%&#xff0c;Reflexion框架将GPT-4成功率提至91% ▎&#x1f4bc; 商业动向 | xA…

【SegRNN 源码理解】【今天不水文系列】编码器部分理解

我来小小的理解一下&#xff1a; 首先&#xff0c;16 batchsize&#xff0c;60sequendcelength&#xff0c;7 个特征的通俗解释 16 个独立的样本&#xff0c;每个样本有 60 个连续的时间步及对应的标签值&#xff0c;每个时间步有 60 个特征 所以就是因为样本是随机从训练集…

加速科技Flex10K-L测试机:以硬核创新重塑显示驱动芯片测试新标杆!

在2024年召开的世界显示产业创新发展大会上&#xff0c;加速科技自主研发的高密度显示驱动芯片测试设备Flex10K-L凭借其突破性技术创新&#xff0c;成功入选"十大创新技术&#xff08;产品&#xff09;"。作为国内显示驱动芯片测试领域的标杆性设备&#xff0c;Flex1…

Docker 部署 Vaultwarden

一、前言 1. 官网 1.1 Vaultwarden https://github.com/dani-garcia/vaultwarden https://github.com/wcjxixi/Vaultwarden-Wiki-Chn https://hub.docker.com/r/vaultwarden/server https://rs.ppgg.in/ # Vaultwarden Wiki 中文版 https://geekdaxue.co/read/Vaultward…

如何下载和使用Git:初学者指南

&#x1f31f; 如何下载和使用Git&#xff1a;初学者指南 在当今的软件开发中&#xff0c;Git已经成为不可或缺的版本控制系统。无论你是独立开发者还是团队成员&#xff0c;掌握Git的基本操作都能帮助你更高效地管理代码。今天&#xff0c;我将详细介绍如何下载和使用Git&…

doris: SQL Server

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 SQL Server 数据库。本文档介绍如何配置 SQL Server 数据库连接。 使用须知​ 要连接到 SQL Server 数据库&#xff0c;您需要 SQL Server 2012 或更高版本&#xff0c;或 Azure SQL 数据库。 SQL Server 数据库的 JDBC 驱动…

Leetcode 刷题记录 05 —— 普通数组

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 最大子数组和 方法一&#xff1a;动态规划&#xff08;卡达尼算法&#xff09; 方法…

《DataWorks 深度洞察:量子机器学习重塑深度学习架构,决胜复杂数据战场》

在数字化浪潮汹涌澎湃的当下&#xff0c;大数据已然成为推动各行业发展的核心动力。身处这一时代洪流&#xff0c;企业对数据的处理与分析能力&#xff0c;直接关乎其竞争力的高低。阿里巴巴的DataWorks作为大数据领域的扛鼎之作&#xff0c;凭借强大的数据处理与分析能力&…

wordpress自定the_category的输出结构

通过WordPress的过滤器the_category来自定义输出内容。方法很简单&#xff0c;但是很实用。以下是一个示例代码&#xff1a; function custom_the_category($thelist, $separator , $parents ) {// 获取当前文章的所有分类$categories get_the_category();if (empty($categ…

2025牛客寒假算法基础集训营6

A.复制鸡 思路&#xff1a;比较简单&#xff0c;略。 void solve() {int n, m, k;cin >> n;int last -1, ans 0;for (int i 0; i<n; i){int x;cin >> x;if (x ! last){ans;}last x;}cout << ans << endl; } B.好伙计猜拳 思路&#xff1a;这…

【C#】详解C#中的内存管理机制

文章目录 前言一、C#内存管理的基本机制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;栈内存 二、 开发者需要主动管理的场景&#xff08;1&am…

ROS云课基础题库-01C++案例-甜甜圈

效率是核心&#xff0c;但效率高的教程会忽略掉非常多的细节。 解决问题的思路和细节对于一个问题的有效求解至关重要。 资料 云课五分钟-02第一个代码复现-终端甜甜圈C-CSDN博客 从云课五分钟到五秒钟焦虑的甜甜圈向前冲-CSDN博客 说明 复现重要性没有那么大&#xff0c;…