亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解讀Spring MVC的工作流程

 更新時(shí)間:2025年01月21日 14:46:49   作者:qq_44199605  
SpringMVC的工作流程是基于模型-視圖-控制器(MVC)設(shè)計(jì)模式的一個(gè)典型實(shí)現(xiàn),主要包括用戶發(fā)送請求到前端控制器(DispatcherServlet)、前端控制器轉(zhuǎn)發(fā)請求給處理器映射器(HandlerMapping)

Spring MVC 的工作流程是基于模型-視圖-控制器(MVC)設(shè)計(jì)模式的一個(gè)典型實(shí)現(xiàn),以下是其主要工作流程步驟:

Spring MVC 的工作流程

客戶端請求發(fā)送到前端控制器(DispatcherServlet)

  • 用戶通過瀏覽器發(fā)送請求,該請求首先到達(dá) Spring MVC 的前端控制器 DispatcherServlet。
  • 這個(gè)類是整個(gè)流程的核心,它負(fù)責(zé)協(xié)調(diào)其他組件的執(zhí)行。

前端控制器轉(zhuǎn)發(fā)請求給處理器映射器(Handler Mapping)

  • DispatcherServlet 接收到請求后,依據(jù)請求的 URL 查找相應(yīng)的處理器(Controller)來處理請求。
  • 這個(gè)映射由 Handler Mapping 完成,它根據(jù)配置查找具體的處理器。

處理器映射器找到相應(yīng)的控制器(Controller)

  • Handler Mapping 根據(jù)請求的路徑,確定使用哪個(gè) Controller 來處理請求。
  • 找到之后,它返回 Controller 的信息給 DispatcherServlet

前端控制器調(diào)用目標(biāo)處理器(Controller)

  • DispatcherServlet 根據(jù) Handler Mapping 提供的信息,調(diào)用具體的 Controller 處理請求。
  • 控制器中的業(yè)務(wù)邏輯會(huì)處理客戶端的數(shù)據(jù),并返回一個(gè) ModelAndView 對象,包含了模型數(shù)據(jù)和視圖名稱。

控制器返回模型數(shù)據(jù)和視圖名稱

  • Controller 將處理后的模型數(shù)據(jù)和視圖名稱返回給 DispatcherServlet

前端控制器請求視圖解析器(View Resolver)

  • DispatcherServlet 將視圖名稱交給視圖解析器 View Resolver
  • 由它負(fù)責(zé)將視圖名稱解析為具體的視圖(比如 JSP、Thymeleaf 等)

視圖解析器生成視圖

  • 視圖解析器會(huì)根據(jù)配置找到相應(yīng)的物理視圖文件
  • 并返回給 DispatcherServlet

前端控制器將模型數(shù)據(jù)傳遞給視圖

  • DispatcherServlet 將控制器返回的模型數(shù)據(jù)傳遞給解析出來的視圖
  • 通常這些數(shù)據(jù)會(huì)通過 ModelModelAndView 對象傳遞

視圖渲染

  • 視圖結(jié)合模型數(shù)據(jù)進(jìn)行渲染
  • 生成最終的 HTML 頁面

前端控制器響應(yīng)客戶端

  • 渲染后的視圖由 DispatcherServlet 返回給客戶端(瀏覽器)
  • 最終用戶看到的是處理后的頁面內(nèi)容

例子

假設(shè)我們有一個(gè)簡單的 Web 應(yīng)用程序,用于顯示用戶的個(gè)人信息。當(dāng)用戶訪問 /user/1 這個(gè) URL 時(shí),應(yīng)用程序會(huì)展示 ID 為 1 的用戶信息。

詳細(xì)步驟

用戶發(fā)送請求到服務(wù)器: 用戶在瀏覽器中輸入 URL /user/1,比如 http://localhost:8080/user/1,這個(gè)請求被發(fā)送到服務(wù)器。

前端控制器(DispatcherServlet)接收請求: Spring MVC 的核心組件 DispatcherServlet 會(huì)攔截所有進(jìn)入的 HTTP 請求。它相當(dāng)于請求的入口點(diǎn),負(fù)責(zé)將請求分發(fā)到適當(dāng)?shù)奶幚砥鳎–ontroller)。

  • 例子中的請求路徑 /user/1DispatcherServlet 攔截,準(zhǔn)備分配給相應(yīng)的處理器。

通過處理器映射器(Handler Mapping)查找控制器DispatcherServlet 使用處理器映射器(HandlerMapping)查找合適的控制器來處理 /user/1 請求。這個(gè)映射過程通常是根據(jù) URL 路徑來匹配的。

  • 例如,@RequestMapping("/user/{id}") 注解可以告訴 Spring 這個(gè)方法負(fù)責(zé)處理 /user/{id} 的請求。
  • 在我們的例子中,處理器映射器會(huì)找到 UserController,該控制器負(fù)責(zé)處理所有與用戶相關(guān)的請求。

控制器(Controller)處理請求: 找到合適的控制器后,DispatcherServlet 將請求轉(zhuǎn)發(fā)給控制器??刂破靼藨?yīng)用程序的業(yè)務(wù)邏輯,負(fù)責(zé)處理用戶請求和返回?cái)?shù)據(jù)。

  • 在這個(gè)例子中,UserController 的方法會(huì)接受用戶的 ID(比如 1),然后從數(shù)據(jù)庫或內(nèi)存中獲取 ID 為 1 的用戶信息。
@Controller
public class UserController {
    @RequestMapping("/user/{id}")
    public ModelAndView getUser(@PathVariable("id") int userId) {
        // 模擬從數(shù)據(jù)庫獲取用戶數(shù)據(jù)
        User user = userService.getUserById(userId);
        ModelAndView mav = new ModelAndView("userView");
        mav.addObject("user", user);
        return mav;
    }
}

在這個(gè)例子中:

  • getUser 方法會(huì)從 userService 獲取用戶數(shù)據(jù),并將該數(shù)據(jù)存儲(chǔ)在 ModelAndView 對象中,返回給 DispatcherServlet。
  • "userView" 是視圖的名稱,Spring MVC 會(huì)根據(jù)這個(gè)名稱來找到合適的視圖模板(比如 JSP 頁面、Thymeleaf 頁面等)。
  • mav.addObject("user", user) 將用戶信息存儲(chǔ)在模型中,供視圖使用。

返回模型和視圖給 DispatcherServlet: 控制器方法返回一個(gè) ModelAndView 對象,包含了模型數(shù)據(jù)(用戶信息)和視圖名稱(userView)。DispatcherServlet 接收這個(gè)返回對象。

通過視圖解析器(View Resolver)查找視圖DispatcherServlet 會(huì)將視圖名稱(如 "userView")交給視圖解析器(ViewResolver),由它根據(jù)配置找到物理視圖文件。

視圖解析器生成視圖: 視圖解析器會(huì)找到 userView.jsp 并返回給 DispatcherServlet。此時(shí),視圖還沒有渲染出用戶數(shù)據(jù),只是找到了物理文件。

前端控制器將模型數(shù)據(jù)傳遞給視圖DispatcherServlet 將控制器返回的用戶數(shù)據(jù)(模型)傳遞給 userView.jsp 視圖。視圖文件會(huì)使用這些數(shù)據(jù)生成動(dòng)態(tài)的 HTML 頁面。

視圖渲染: 視圖(userView.jsp)結(jié)合模型數(shù)據(jù)進(jìn)行渲染。比如 JSP 文件中可能會(huì)使用表達(dá)式 ${user.name} 來顯示用戶的姓名。

返回響應(yīng)到客戶端: 渲染后的 HTML 頁面被返回給客戶端(用戶的瀏覽器)。用戶最終看到的是包含用戶信息的完整頁面。

注:

  • 在使用 Spring Boot 進(jìn)行前后端分離開發(fā)時(shí),后端只負(fù)責(zé)提供數(shù)據(jù)接口(通常以 RESTful API 的形式),前端負(fù)責(zé)渲染頁面和處理用戶交互。
  • 這種架構(gòu)在 Spring Boot 中表現(xiàn)為 RESTful API,而不再像傳統(tǒng) Spring MVC 那樣返回視圖。
  • 與傳統(tǒng) MVC 不同,Controller 使用 @RestController,直接返回 Java 對象,而不返回視圖。
  • Spring Boot 會(huì)自動(dòng)將返回的對象序列化為 JSON 或 XML。
@RestController
public class UserController {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") int id) {
        // 從服務(wù)層獲取用戶信息
        return userService.getUserById(id); // 返回的是 User 對象,而不是視圖名稱
    }
}

傳統(tǒng) Spring MVC 返回視圖

  • 返回的是視圖文件(如 JSP 頁面)通過服務(wù)端渲染動(dòng)態(tài) HTML。
  • 控制器返回 ModelAndView 對象,包含視圖名稱和模型數(shù)據(jù)。
  • 使用 JSP、Thymeleaf 等視圖引擎渲染視圖。

Spring Boot RESTful API

  • 返回的是 JSON 或 XML 格式的數(shù)據(jù),由前端或客戶端負(fù)責(zé)渲染。
  • 使用 @RestController,控制器直接返回對象,Spring Boot 自動(dòng)將其轉(zhuǎn)換為 JSON。

總結(jié)

Spring MVC 的整個(gè)流程可以簡單總結(jié)為以下幾個(gè)步驟:

  1. 用戶發(fā)送請求到 DispatcherServlet。
  2. DispatcherServlet 使用 HandlerMapping 查找對應(yīng)的控制器。
  3. 控制器處理請求,生成 ModelAndView。
  4. DispatcherServlet 使用 ViewResolver 解析視圖名稱。
  5. 將模型數(shù)據(jù)傳遞給視圖進(jìn)行渲染。
  6. 將渲染的視圖返回給用戶。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA配置Maven的超詳細(xì)步驟

    IDEA配置Maven的超詳細(xì)步驟

    Maven是一個(gè)能使我們的java程序開發(fā)節(jié)省時(shí)間和精力,是開發(fā)變得相對簡單,還能使開發(fā)規(guī)范化的工具,下面這篇文章主要給大家介紹了關(guān)于IDEA配置Maven的超詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式示例

    Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式示例

    這篇文章主要介紹了Java實(shí)現(xiàn)指定線程執(zhí)行順序的三種方式,包括通過共享對象鎖加上可見變量,通過主線程Join()以及通過線程執(zhí)行時(shí)Join()等三種實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-01-01
  • 淺談Java中ArrayList的擴(kuò)容機(jī)制

    淺談Java中ArrayList的擴(kuò)容機(jī)制

    本文主要介紹了淺談Java中ArrayList的擴(kuò)容機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過程

    基于Jenkins自動(dòng)打包并部署docker環(huán)境的操作過程

    這篇文章主要介紹了基于Jenkins自動(dòng)打包并部署docker環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • Java從入門到起飛之變量與運(yùn)算符詳解

    Java從入門到起飛之變量與運(yùn)算符詳解

    這篇文章主要介紹了Java編程語言中的關(guān)鍵字、標(biāo)識(shí)符、變量、基本數(shù)據(jù)類型以及運(yùn)算符等基本概念和用法,它涵蓋了變量聲明、賦值、類型轉(zhuǎn)換、字符串操作以及運(yùn)算符優(yōu)先級(jí)等內(nèi)容,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • java并發(fā)編程_線程池的使用方法(詳解)

    java并發(fā)編程_線程池的使用方法(詳解)

    下面小編就為大家?guī)硪黄猨ava并發(fā)編程_線程池的使用方法(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳解SpringBoot如何自定義自己的Starter組件

    詳解SpringBoot如何自定義自己的Starter組件

    這篇文章主要為大家詳細(xì)介紹了在SpringBoot中如何自定義自己的Starter組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Spring Boot 在啟動(dòng)時(shí)進(jìn)行配置文件加解密的方法詳解

    Spring Boot 在啟動(dòng)時(shí)進(jìn)行配置文件加解密的方法詳解

    這篇文章主要介紹了Spring Boot 在啟動(dòng)時(shí)進(jìn)行配置文件加解密的方法,本文通過實(shí)例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java+selenium 網(wǎng)易云音樂刷累計(jì)聽歌數(shù)的方法

    java+selenium 網(wǎng)易云音樂刷累計(jì)聽歌數(shù)的方法

    這篇文章主要介紹了java+selenium 網(wǎng)易云音樂刷累計(jì)聽歌數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • shade解決mybatis包沖突問題

    shade解決mybatis包沖突問題

    這篇文章主要介紹了shade解決mybatis包沖突問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論