最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀Spring MVC的工作流程

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

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

Spring MVC 的工作流程

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

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

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

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

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

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

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

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

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

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

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

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

視圖解析器生成視圖

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

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

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

視圖渲染

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

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

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

例子

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

詳細(xì)步驟

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

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

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

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

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

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

  • 在這個(gè)例子中,UserController 的方法會(huì)接受用戶的 ID(比如 1),然后從數(shù)據(jù)庫(kù)或內(nèi)存中獲取 ID 為 1 的用戶信息。
@Controller
public class UserController {
    @RequestMapping("/user/{id}")
    public ModelAndView getUser(@PathVariable("id") int userId) {
        // 模擬從數(shù)據(jù)庫(kù)獲取用戶數(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 對(duì)象中,返回給 DispatcherServlet
  • "userView" 是視圖的名稱,Spring MVC 會(huì)根據(jù)這個(gè)名稱來(lái)找到合適的視圖模板(比如 JSP 頁(yè)面、Thymeleaf 頁(yè)面等)。
  • mav.addObject("user", user) 將用戶信息存儲(chǔ)在模型中,供視圖使用。

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

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

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

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

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

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

注:

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

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

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

Spring Boot RESTful API

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

總結(jié)

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

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

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

相關(guān)文章

  • SpringBoot集成和使用RabbitMQ方式

    SpringBoot集成和使用RabbitMQ方式

    本文介紹了如何在SpringBoot項(xiàng)目中集成RabbitMQ,并結(jié)合死信隊(duì)列實(shí)現(xiàn)延時(shí)消息,通過(guò)這些配置和機(jī)制,開發(fā)者可以在分布式系統(tǒng)中構(gòu)建更為靈活和可靠的消息傳遞系統(tǒng)
    2024-12-12
  • Java接口請(qǐng)求重試機(jī)制的幾種常見(jiàn)方法

    Java接口請(qǐng)求重試機(jī)制的幾種常見(jiàn)方法

    Java接口請(qǐng)求重試機(jī)制是保證系統(tǒng)穩(wěn)定性和容錯(cuò)能力的重要手段之一,當(dāng)接口請(qǐng)求發(fā)生失敗或暫時(shí)性錯(cuò)誤時(shí),通過(guò)重試機(jī)制可以提高請(qǐng)求的成功率,本文將詳細(xì)介紹Java接口請(qǐng)求重試機(jī)制的幾種常見(jiàn)方法,需要的朋友可以參考下
    2023-11-11
  • Java 圖表類庫(kù)詳解

    Java 圖表類庫(kù)詳解

    本文主要介紹了Java圖表類庫(kù)的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲

    Java實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Spring AOP底層源碼詳解

    Spring AOP底層源碼詳解

    這篇文章主要介紹了Spring AOP底層源碼詳解,幫助大家更好的理解和學(xué)習(xí)使用Spring AOP,感興趣的朋友可以了解下
    2021-03-03
  • java.util.Random和concurrent.ThreadLocalRandom使用對(duì)比

    java.util.Random和concurrent.ThreadLocalRandom使用對(duì)比

    這篇文章主要介紹了java.util.Random和concurrent.ThreadLocalRandom使用對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 淺析java中密文的創(chuàng)建和校驗(yàn)

    淺析java中密文的創(chuàng)建和校驗(yàn)

    這篇文章主要為大家詳細(xì)介紹了java中密文的創(chuàng)建和校驗(yàn)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Java中的@builder建造者模式詳細(xì)解析

    Java中的@builder建造者模式詳細(xì)解析

    這篇文章主要介紹了Java中的@builder建造者模式詳細(xì)解析,使用 @Builder 注解可以簡(jiǎn)化手動(dòng)編寫建造者模式的代碼,使代碼更加簡(jiǎn)潔易讀,它可以自動(dòng)生成鏈?zhǔn)秸{(diào)用的方法來(lái)設(shè)置對(duì)象的屬性,并且可以在需要時(shí)進(jìn)行可選屬性的設(shè)置,需要的朋友可以參考下
    2024-01-01
  • spring cloud gateway 全局過(guò)濾器的實(shí)現(xiàn)

    spring cloud gateway 全局過(guò)濾器的實(shí)現(xiàn)

    全局過(guò)濾器作用于所有的路由,不需要單獨(dú)配置,我們可以用它來(lái)實(shí)現(xiàn)很多統(tǒng)一化處理的業(yè)務(wù)需求,這篇文章主要介紹了spring cloud gateway 全局過(guò)濾器的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • SpringBoot使用minio及配置代碼

    SpringBoot使用minio及配置代碼

    MinIO是一個(gè)非常輕量的服務(wù),可以很簡(jiǎn)單的和其他應(yīng)用的結(jié)合,類似?NodeJS,?Redis?或者?MySQL。本文重點(diǎn)給大家介紹SpringBoot使用minio及配置代碼,感興趣的朋友一起看看吧
    2022-02-02

最新評(píng)論

工布江达县| 家居| 全椒县| 四平市| 尚志市| 望江县| 林口县| 都兰县| 隆回县| 金坛市| 福贡县| 大庆市| 昌宁县| 涡阳县| 灵丘县| 高安市| 安平县| 驻马店市| 和田市| 东明县| 壤塘县| 安平县| 江永县| 华宁县| 无锡市| 冷水江市| 华池县| 咸阳市| 锦州市| 桐乡市| 宿州市| 漳浦县| 晋宁县| 南投县| 同江市| 佳木斯市| 革吉县| 敦煌市| 舟曲县| 商都县| 巴彦淖尔市|