探討SpringMVC的工作原理

SpringMVC是Spring框架的一部分,是用于構建Web應用程序的一個模塊。SpringMVC遵循Model-View-Controller(MVC)設計模式,幫助開發者將應用程序的業務邏輯、控制邏輯和表示層分離。以下是SpringMVC的工作原理及其核心組件的詳細介紹。

工作原理

SpringMVC的工作流程如下:

  1. 客戶端請求

    • 客戶端(如瀏覽器)發送HTTP請求到服務器。
  2. 前端控制器(DispatcherServlet)

    • 請求首先到達DispatcherServlet(前端控制器),這是SpringMVC的核心組件,用于協調不同的組件處理請求。
    • DispatcherServlet配置在web.xml或Spring Boot的自動配置中。
  3. 請求映射(HandlerMapping)

    • DispatcherServlet通過HandlerMapping查找處理請求的合適的處理器(Handler)。
    • HandlerMapping會依據請求的URL、HTTP方法等信息匹配合適的處理器。
  4. 處理器(Handler)

    • 處理器通常是一個@Controller注解標識的類的方法。
    • 處理器執行具體的業務邏輯,并返回一個ModelAndView對象,包含視圖名稱和模型數據。
  5. 視圖解析器(ViewResolver)

    • DispatcherServlet通過ViewResolver解析視圖名稱,確定實際的視圖(通常是JSP、Thymeleaf模板等)。
  6. 視圖渲染

    • 解析后的視圖會結合模型數據進行渲染,生成最終的HTML響應。
  7. 響應返回

    • 生成的HTML響應返回給客戶端,完成整個請求-響應過程。

核心組件

DispatcherServlet
  • 作用:前端控制器,負責接收請求,協調不同組件處理請求。
  • 職責
    • 初始化并加載Spring上下文。
    • 將請求分發給合適的處理器。
    • 將處理結果協調給視圖進行渲染。
HandlerMapping
  • 作用:根據請求URL和其他屬性找到合適的處理器。
  • 常用實現
    • RequestMappingHandlerMapping:基于注解的映射機制,例如@RequestMapping。
HandlerAdapter
  • 作用:負責調用處理器的方法。
  • 職責
    • 通過反射調用處理器方法,傳遞請求參數。
    • 處理器返回ModelAndView對象后,HandlerAdapter負責協調視圖解析和渲染。
Controller
  • 作用:處理具體的業務邏輯。
  • 實現
    • 使用@Controller注解標識的類。
    • 使用@RequestMapping等注解定義請求映射。
ViewResolver
  • 作用:解析視圖名稱,確定實際視圖。
  • 常用實現
    • InternalResourceViewResolver:解析JSP視圖。
    • ThymeleafViewResolver:解析Thymeleaf模板視圖。
View
  • 作用:視圖用于渲染最終的HTML響應。
  • 職責
    • 結合模型數據生成HTML響應。
    • 常用視圖技術包括JSP、Thymeleaf、Freemarker等。

示例代碼

Controller
 

java復制代碼

@Controller public class HelloController { @RequestMapping("/hello") public ModelAndView hello() { ModelAndView mav = new ModelAndView(); mav.setViewName("hello"); mav.addObject("message", "Hello, SpringMVC!"); return mav; } }

配置DispatcherServlet

web.xml配置

 

xml復制代碼

<web-app> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

Spring配置文件(spring-servlet.xml)

 

xml復制代碼

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.example.controller"/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> </beans>

視圖文件(hello.jsp)

 

jsp復制代碼

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> <h1>${message}</h1> </body> </html>

總結

SpringMVC通過DispatcherServlet作為前端控制器,協調請求處理過程中的各個組件,包括HandlerMapping、HandlerAdapter、Controller、ViewResolver和View等。它依據MVC設計模式,將業務邏輯、控制邏輯和表示層分離,從而提高代碼的可維護性和擴展性。通過SpringMVC,開發者可以方便地構建靈活且高效的Web應用程序。

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

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

相關文章

Oracle數據庫導入導出詳解

在數據庫管理和維護過程中&#xff0c;數據的導入與導出是常見的需求&#xff0c;特別是在數據遷移、備份或數據分析等場景下尤為重要。Oracle數據庫作為企業級的數據庫管理系統&#xff0c;提供了強大的數據導入導出工具。本文將詳細介紹Oracle數據庫中數據導入和導出的常用方…

macOS使用Karabiner-Elements解決羅技鼠標G304連擊、單擊變雙擊的故障

記錄一下羅技鼠標G304單擊變雙擊的軟件解決過程和方案&#xff08;適用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有類似解決辦法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通過羅技Logitech G HUB軟件對羅技的游戲鼠標側鍵b…

攝像機反求跟蹤軟件/插件 Mocha Pro 2024 v11.0.2 CE Win

AE/PR/OFX/達芬奇/AVX插件 | 攝像機反求跟蹤軟件Mocha Pro 2024 v11.0.2 CE Win-PR模板網 Mocha Pro 軟件(插件)&#xff0c;用于平面運動跟蹤、3D跟蹤、動態觀察、對象移除、圖像穩定和PowerMesh有機扭曲跟蹤等功能。整合了SynthEyes核心的3D跟蹤算法&#xff0c;能夠快速自動…

k8s-第四節-Service

Service Service 通過 label 關聯對應的 PodServcie 生命周期不跟 Pod 綁定&#xff0c;不會因為 Pod 重創改變 IP提供了負載均衡功能&#xff0c;自動轉發流量到不同 Pod可對集群外部提供訪問端口集群內部可通過服務名字訪問 創建 Service kubectl apply -f service.yamlkub…

math.round和math.floor相互轉化

在Python中&#xff0c;math.round() 函數用于對浮點數進行四舍五入到最接近的整數&#xff0c;而 math.floor() 函數則是直接取浮點數的整數部分&#xff0c;即向下取整。如果你需要在 math.round() 和 math.floor() 之間進行某種“相互轉化”&#xff0c;實際上&#xff0c;你…

003-基于Sklearn的機器學習入門:回歸分析(上)

本節及后續章節將介紹機器學習中的幾種經典回歸算法&#xff0c;所選方法都在Sklearn庫中聚類模塊有具體實現。本節為上篇&#xff0c;將介紹基礎的線性回歸方法&#xff0c;包括線性回歸、邏輯回歸、多項式回歸和嶺回歸等。 2.1 回歸分析概述 回歸&#xff08;Regression&…

11 - matlab m_map地學繪圖工具基礎函數 - 繪制航跡、橢圓、風向玫瑰圖和特定的圓形區域的有關函數及其用法

11 - matlab m_map地學繪圖工具基礎函數 - 繪制航跡、橢圓、風向玫瑰圖和特定的圓形區域的有關函數及其用法 0. 引言1. 關于m_track2. 關于m_range_ring3. 關于m_ellipse4. 關于m_windrose5. 結語 0. 引言 本篇介紹下m_map中繪制航跡圖函數&#xff08;m_track&#xff09;、繪…

python 發布應用程序包

文章目錄 發布python包toml配置文件構建發布python包 官方文檔參考 將自己的python項目發布成源碼包或者wheel二進制包,供其他開發者使用。 方式: 使用py工具; distutils,該工具的使用已過時;setuptools,常用方式;wheel,在setuptools的基礎上添加了 bdist_wheel, …

【BUUCTF-PWN】4-ciscn_2019_n_1

參考&#xff1a;BUUCTF-ciscn_2019_n_1 - 紙鳶asahi - 博客園 (cnblogs.com) buuctf 刷題記錄_PWN ciscn_2019_n_1 - MuRKuo - 博客園 (cnblogs.com) 從題海中入門&#xff08;四&#xff09;ciscn_2019_n_1 - FreeBuf網絡安全行業門戶 ciscn_2019_n_1 ——兩種解法_0x4134800…

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介紹宋飏提出的帶噪聲擾動的基于得分的生成模型。首先介紹基本的基于得分的生成模型的訓練方法&#xff08;得分匹配&#xff09;和采樣方法&#xff08;朗之萬動力學&#xff09;。然后基于流形假…

快速了解-注解Annotation

描述 Annotation定義&#xff1a;注解是Java語言從JDK 5.0版本開始引入的一種技術。 Annotation作用&#xff1a; 注解不是程序本身&#xff0c;但可以對程序作出解釋。這與注釋&#xff08;comment&#xff09;類似&#xff0c;但注解可以被其他程序&#xff08;如編譯器&…

react apollo hooks

1、創建ApolloProvider來包裝整個程序 <ApolloProvider client{client}><App /> <ApolloProvider> 2、useQuery查詢 工作方式usequery將返回一個數組 const {要返回的對象} useQuery(傳入參數) 實例 const query gqlquery name {whatever {field}} e…

信號量——Linux并發之魂

歡迎來到 破曉的歷程的 博客 引言 今天&#xff0c;我們繼續學習Linux線程本分&#xff0c;在Linux條件變量中&#xff0c;我們對條件變量的做了詳細的說明&#xff0c;今天我們要利用條件變量來引出我們的另一個話題——信號量內容的學習。 1.復習條件變量 在上一期博客中&…

天潤融通分析AI技術助力客戶服務,實現滿意度三倍增長

如今&#xff0c;客戶體驗越來越成為影響客戶決策的核心要素。 對于企業來講&#xff0c;客戶在不同觸點的每一次互動體驗&#xff0c;都成為塑造品牌聲譽的“Aha時刻”。但同時&#xff0c;隨著社會的發展的加速&#xff0c;客戶的需求也在日新月異&#xff0c;給企業帶來挑戰…

刷代碼隨想錄有感(125):動態規劃——最長公共子序列

題干&#xff1a; 代碼&#xff1a; class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>>dp(text1.size() 1, vector<int>(text2.size() 1, 0));for(int i 1; i < text1.size(); i){for(int j …

【SQL】已解決:SQL錯誤(15048): 數據兼容級別有效值為100、110或120

文章目錄 一、分析問題背景二、可能出錯的原因三、錯誤代碼示例四、正確代碼示例五、注意事項 已解決SQL錯誤(15048): 數據兼容級別有效值為100、110或120 在數據庫開發和管理過程中&#xff0c;我們經常會遇到各種各樣的錯誤。本文將詳細分析SQL錯誤(15048)的背景、可能原因、…

langchain框架輕松實現本地RAG

一 什么是RAG? RAG&#xff08;Retrieval-Augmented Generation&#xff09;是一種結合了檢索和生成模型的方法&#xff0c;主要用于解決序列到序列的任務&#xff0c;如問答、對話系統、文本摘要等。它的核心思想是通過從大量文檔中檢索相關信息&#xff0c;然后利用這些信息…

vue3-openlayers 圖標閃爍、icon閃爍、marker閃爍

本篇介紹一下使用vue3-openlayers 圖標閃爍、icon閃爍、marker閃爍 1 需求 圖標閃爍、icon閃爍、marker閃爍 2 分析 圖標閃爍、icon閃爍、marker閃爍使用ol-animation-fade組件 3 實現 <template><ol-map:loadTilesWhileAnimating"true":loadTilesWh…

讀人工智能全傳03分治策略

1. 黃金年代 1.1. 圖靈在他發表的論文《計算機器與智能》中介紹了圖靈測試&#xff0c;為人工智能學科邁出第一步做出了重大貢獻 1.2. 美國在第二次世界大戰后幾十年里計算機技術發展的特色&#xff0c;也是美國在未來60年內確立人工智能領域國際領先地位的核心 1.3. 1955年…

lodash中flush的使用(debounce、throttle)

在項目的配置中&#xff0c;看到了一個請求&#xff0c;類似是這樣的 import { throttle } from lodash-es// 請求函數 async function someFetch(){const {data} await xxx.post()return data }// 節流函數 async function throttleFn(someFetch,1000)// 執行拿到數據函數 a…