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.pswp.cn/diannao/72895.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72895.shtml
英文地址,請注明出處:http://en.pswp.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;…