17、Spring系列-SpringMVC-請求源碼流程

前言

Spring官網的MVC模塊介紹:

Spring Web MVC是基于Servlet API構建的原始Web框架,從一開始就已包含在Spring框架中。正式名稱“ Spring Web MVC”來自其源模塊的名稱(spring-webmvc),但它通常被稱為“ Spring MVC”。

從Servlet到SpringMVC

最典型的MVC就是JSP + servlet + javabean的模式。

傳統Servlet:

弊端:

  1. xml下配置servlet的映射非常麻煩 開發效率低
  2. 必須要繼承父類、重寫方法 侵入性強
  3. 如果想在一個Servlet中處理同一業務模塊的的功能分發給不同方法進行處理非常麻煩
  4. 參數解析麻煩:單個參數(轉換類型)--->pojo對象 Json文本--->pojo對象
  5. 數據響應麻煩:pojo對象--->json ... Content-type
  6. 跳轉頁面麻煩, 對path的控制、 如果使用其他模板也很麻煩 、設置編碼麻煩...等等...

所以SpringMVC 就是在Servlet的基礎上進行了封裝,幫我把這些麻煩事都給我們做了。

Web框架的升級是一個不斷偷懶的過程

從最開始的Servlet到現在的SpringMVC、SpringBoot等等

SpringMVC

基于xml的實現方式:

1.給Servlet容器配置一個DispatcherServlet(web.xml )

2.添加SpringMVC的配置信息

  • 繼承類/實現接口 方式:

implements HttpRequestHandler

不同的HandlerMapping

<!--通過設置屬性的方式去設置映射路徑-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings"><props><prop key="httpRequest">simpleController</prop></props>
</property><!--BeanNameUrlHandlerMapping 一定要為Controller設置一個有效映射地址的名字  如  @Controller("/xxxx")-->
  • 注解方式:

配置控制器@Controller和處理方法的映射—@RequstMapping 即可

其實SpringMVC請求原理很簡單:說白了就是用一個DispatcherServlet 封裝了一個Servlet的調度中心, 由調度中心幫我們調用我們的處理方法:

在這個過程中調度中心委托給各個組件執行具體工作 ,比如幫我們映射方法請求、幫我解析參數、調用處理方法、響應數據和頁面 等

這就相當于你在家自己做飯和去飯店吃飯的區別了, 在家你買菜、洗菜、蒸飯、炒菜、洗碗都得自己來.

飯店都給你做好了, 你只要分服務員說你吃什么、就能得到響應. 殊不知呢, 你只是說了吃什么(請求), 后廚(DispatcherServlet)就有配菜員你給找到菜單-對應的食材(映射) 、切菜員切菜(解析參數)、 廚師給你炒菜(調用處理方法)、裝盤(處理返回值)、 抄完給你端出來(響應)

SpringMVC的具體執行流程

Spring MVC 是圍繞前端控制器模式設計的,其中:中央 Servlet DispatcherServlet 為請求處理流程提供統一調度,實際工作則交給可配置組件執行。這個模型是靈活的且開放的,我們可以通過自己去定制這些組件從而進行定制自己的工作流。

?

DispatcherServlet: 前端調度器 , 負責將請求攔截下來分發到各控制器方法中

HandlerMapping: 負責根據請求的URL和配置@RequestMapping映射去匹配, 匹配到會返回Handler(具體控制器的方法)

HandlerAdaper: 負責調用Handler-具體的方法- 返回視圖的名字 Handler將它封裝到ModelAndView(封裝視圖名,request域的數據)

ViewReslover: 根據ModelAndView里面的視圖名地址去找到具體的jsp封裝在View對象中

View:進行視圖渲染(將jsp轉換成html內容 --這是Servlet容器的事情了) 最終response到的客戶端

  1. 用戶發送請求至前端控制器DispatcherServlet
  2. DispatcherServlet收到請求調用處理器映射器HandlerMapping。
    1. 處理器映射器根據請求url找到具體的處理器,生成處理器執行鏈HandlerExecutionChain(包括處理器對象和處理器攔截器)一并返回給DispatcherServlet。
  3. DispatcherServlet根據處理器Handler獲取處理器適配器HandlerAdapter,執行HandlerAdapter處理一系列的操作,如:參數封裝,數據格式轉換,數據驗證等操作
  4. 執行處理器Handler(Controller,也叫頁面控制器)。
    1. Handler執行完成返回ModelAndView
    2. HandlerAdapter將Handler執行結果ModelAndView返回到DispatcherServlet
  5. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
    1. ViewReslover解析后返回具體View
  6. DispatcherServlet對View進行渲染視圖(即將模型數據model填充至視圖中)。
  7. DispatcherServlet響應用戶。

doDispatch

整個調用過程其實都在doDispatch中體現了:

  1. 用戶發送請求至前端控制器DispatcherServlet
  • 由于它是個Servlet會先進入service方法——>doGet/doPost——>processRequestdoService——>doDispatch ↓
  • 這個doDispatch非常重要--體現了整個請求流程

HandlerMapping

在整個過程中,涉及到非常多的組件,每個組件解析各個環節,其中HandlerMapping最為重要它是用來映射請求的,我們就著重介紹下HandlerMapping的解析過程和請求映射過程:

附上流程圖:

@RequestMapping原理| ProcessOn免費在線作圖,在線流程圖,在線思維導圖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20808.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20808.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20808.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 軟件安裝:從源碼編譯到包管理器安裝

Linux 軟件安裝&#xff1a;從源碼編譯到包管理器安裝 在 Linux 操作系統中&#xff0c;軟件安裝是一個非常重要的任務。不同的軟件安裝方式有不同的優缺點&#xff0c;本篇博客將介紹 Linux 軟件安裝的幾種方式&#xff0c;包括從源碼編譯安裝、使用包管理器安裝和使用第三方…

【Redis】什么是緩存雪崩 ? 怎么解決

緩存雪崩&#xff08;Cache Avalanche&#xff09;是指在某個時刻&#xff0c;大量的緩存同時失效或過期&#xff0c;導致大量的請求直接打到數據庫&#xff0c;使數據庫壓力劇增&#xff0c;甚至崩潰。與緩存穿透和緩存擊穿不同&#xff0c;緩存雪崩是多個緩存同時失效或過期引…

[AI Google] 三種新方法利用 Gemini 提高 Google Workspace 的生產力

Workspace 側邊欄中的 Gemini 現在將使用 Gemini 1.5 Pro&#xff0c;新的 Gemini for Workspace 功能即將登陸 Gmail 移動應用&#xff0c;等等。 Gemini for Google Workspace 幫助個人和企業更好地利用 Google 應用——從在 Gmail 中撰寫郵件到在 Sheets 中組織項目計劃。過…

glpi 安裝與使用

1、環境介紹 操作系統&#xff1a;龍蜥os 8.9 nginx&#xff1a;1.26.1 php&#xff1a;8.2.19 mysql&#xff1a;MarinaDB 10.3.9 glpi&#xff1a;10.0.6 fusioninventory&#xff1a;fusioninventory-10.0.61.1 2、安裝epel源 dnf install epel-release -y dnf install htt…

Mongodb安裝和簡單操作

文章目錄 1.安裝服務端1.1 官網下載&#xff0c;解壓安裝1.2 配置啟動 2.安裝客戶端2.1 MongoDB Shell下載安裝2.2 連接服務3.操作3.1 創建數據庫 Create a New Database and Collection3.1 Insert Documents3.2 Query Documents3.3 Update Documents3.4 Delete Documents 1.安…

Python | Leetcode Python題解之第125題驗證回文串

題目&#xff1a; 題解&#xff1a; class Solution:def isPalindrome(self, s: str) -> bool:n len(s)left, right 0, n - 1while left < right:while left < right and not s[left].isalnum():left 1while left < right and not s[right].isalnum():right - …

2010-2015 年阿拉斯加北坡苔原植物功能類型連續覆蓋圖

ABoVE: Tundra Plant Functional Type Continuous-Cover, North Slope, Alaska, 2010-2015 2010-2015 年阿拉斯加北坡苔原植物功能類型連續覆蓋圖 簡介 文件修訂日期&#xff1a;2021-08-27 數據集版本: 1 摘要 該數據集以 30 米的分辨率提供了阿拉斯加北坡約 12.5 萬平方…

UTF-64設想之排列組合

現有的UTF-8和UTF-16&#xff0c;用不同語言表示相同意思時&#xff0c;字節數相差很多。所以&#xff0c;就有了UTF-64的設想。它的設計目標是&#xff1a;不同語言表示相同意思&#xff0c;需要的字節數相差不多。 運行以下程序&#xff0c;得出所有排列組合。 import itert…

【深度學習的未來:探索無監督學習的潛力】

文章目錄 前言無監督學習的基本概念簡單的無監督學習示例&#xff1a;K-Means聚類分析代碼結論 前言 隨著深度學習技術的不斷進步&#xff0c;我們正逐漸從依賴大量標注數據的有監督學習轉向更加高效和自主的無監督學習。無監督學習旨在讓機器從數據中自行發現模式和結構&…

【RuoYi】實現文件的上傳與下載

一、前言 首先&#xff0c;最近在做一個管理系統&#xff0c;里面剛好需要用到echarts圖和富文本編輯器&#xff0c;然后我自己去看了官網覺得有點不好懂&#xff0c;于是去B站看來很多視頻&#xff0c;然后看到了up主【程序員青戈】的視頻&#xff0c;看了他講的echarts圖和富…

k8s 部署 Dashboard

Dashboard 是官方提供的一個UI&#xff0c;可用于基本管理K8s資源。 # 在master節點執行# wget \ https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml vi recommended.yaml 增加 nodePort: 30001 和 type: NodePort ...... spec:p…

一步一步寫線程之十四并行編程和并行庫

一、并行編程 多線程和多進程編程&#xff0c;在早期一般是并發編程&#xff0c;現在基本是并行編程的基礎。或者干脆就叫并行編程也沒有什么可糾結的。但實際上并發編程和并行編程還是有著很大的不同。在前面的“多核和多CPU編程”系列中&#xff0c;已經對并發和并行的概念以…

利用Python處理DAX多條件替換

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情況&#xff1f; 小A&#xff1a;是這樣的&#xff0c;最近不是臨近項目上線嘛&#xff0c;有一大波度量值需要進行類似的調整&#xff0c;一個兩個倒沒啥&#xff0c;600多個&#xff0c;兄弟&#xff0c;救命…

從JS角度直觀理解遞歸的本質

讓我們寫一個函數 pow(x, n)&#xff0c;它可以計算 x 的 n 次方。換句話說就是&#xff0c;x 乘以自身 n 次。 有兩種實現方式。 迭代思路&#xff1a;使用 for 循環&#xff1a; function pow(x, n) {let result 1;// 在循環中&#xff0c;用 x 乘以 result n 次for (let i…

Springboot中使用spel+自定義注解實現權限控制

使用spel+自定義注解實現權限控制的案例很多, 比如springsecurity,本文也是一同樣的方式實現權限校驗 定義注解 package com.example.demo.anno;import java.lang.annotation.ElementType; import java.lang.annotation.

opencv進階 ——(九)圖像處理之人臉修復祛馬賽克算法CodeFormer

算法簡介 CodeFormer是一種基于AI技術深度學習的人臉復原模型&#xff0c;由南洋理工大學和商湯科技聯合研究中心聯合開發&#xff0c;它能夠接收模糊或馬賽克圖像作為輸入&#xff0c;并生成更清晰的原始圖像。算法源碼地址&#xff1a;https://github.com/sczhou/CodeFormer…

如何快速找到 RCE

背景介紹 本文將分享國外白帽子在‘偵察’階段如何快速發現 RCE 漏洞的經歷。以Apache ActiveMQ 的 CVE-2023–46604 為特例&#xff0c;重點介紹如何發現類似此類的漏洞&#xff0c;讓我們開始吧。 快速發現過程 在‘偵察’階段&#xff0c;白帽小哥會保持每周更新一次目標…

1940java swing零售庫存管理系統myeclipse開發Mysql數據庫CS結構java編程

一、源碼特點 java swing 零售庫存管理系統 是一套完善的窗體設計系統&#xff0c;對理解SWING java 編程開發語言有幫助&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;&#xff0c;系統主要采用C/S模式開發。 應用技術&#xff1a;javamysql 開發工具&#xff1a;…

適合技術小白學習的項目1863java在線視頻網站系統 Myeclipse開發mysql數據庫web結構java編程計算機網頁項目

一、源碼特點 java在線視頻網站系統 是一套完善的web設計系統&#xff0c;對理解JSP java編程開發語言有幫助采用了java設計&#xff0c;系統具有完整的源代碼和數據庫&#xff0c;系統采用web模式&#xff0c;系統主要采用B/S模式開發。 開發環境為TOMCAT7.0,Myeclipse8.5開發…

數據庫、數據表的基本操作

1.數據庫的基本操作 &#xff08;1&#xff09;創建數據庫 &#xff08;2&#xff09;刪除數據庫 &#xff08;3&#xff09;將數據庫的字符集修改為gbk gbk是漢字內碼擴展規范&#xff0c;是GB2312和GB13000的擴展&#xff0c;主要用于簡體中文。 &#xff08;4&#xff09;…