天天看點

springmvc工作流程_Java Web輕松學28 - Spring MVC核心原理目錄介紹Spring MVC架構、核心Spring MVC的請求處理流程總結

本系列文章旨在記錄和總結自己在Java Web開發之路上的知識點、經驗、問題和思考,原來已經分享在我的CSDN部落格,現在分享在頭條,希望能幫助更多碼農和想成為碼農的人。版權聲明:本文為CSDN部落客「普通的碼農」的原創文章,遵循CC 4.0 by-sa版權協定,轉載請附上原文出處連結及本聲明。原文連結:https://blog.csdn.net/liyongyan1202/article/details/95058780
           

目錄

  1. 介紹
  2. Spring MVC架構、核心
  3. Spring MVC的請求處理流程
  4. 總結

介紹

上篇文章簡單介紹了MVC的含義,本篇文章介紹Spring MVC的一個概貌,同時也是它的核心原理。

Spring MVC是基于Servlet API來實作的,是以,它就隻适用于那些使用Java Servlet技術并且需要部署到Servlet容器的應用。

Spring MVC的正式名稱是Spring WebMVC,跟對應的JAR包名字spring-webmvc-5.1.7.RELEASE.jar(我使用的版本是5.1.7)是一緻的。

Spring架構裡面還有另外一個Web架構,是基于響應式的(Reactive),叫做Spring WebFlux,這裡暫且不讨論。

Spring MVC也依賴于Spring IoC容器來配置、自動發現MVC的各個元件。

Spring MVC架構、核心

前面文章已經說過,控制器就是起到串聯請求處理的各個步驟,包括,請求的輸入、轉換成業務對象、校驗、調用業務邏輯元件、将執行結果交給視圖元件進行渲染、填充響應内容等。

在Spring MVC也是如此,它也是圍繞這麼一個前端控制器來設計的,這個前端控制器就被設計成一個Servlet,就是DispatcherServlet:

springmvc工作流程_Java Web輕松學28 - Spring MVC核心原理目錄介紹Spring MVC架構、核心Spring MVC的請求處理流程總結

這裡的設計思想就是DispatcherServlet從Servlet容器接管各個請求,然後串聯請求處理的各個步驟,串聯的時候采用接口,而各個步驟實際工作是委托給由Spring IoC配置的各個具體元件,如果某個步驟沒有配置具體元件,那麼會采用預設的配置。

這樣的設計很靈活,每個步驟都可以自由配置,甚至開發自己的具體元件。

當然,Spring MVC中的控制器可以說是分層的,最頂層的控制器就是DispatcherServlet,叫做排程器或分派器,它接管的請求配置在Servlet容器中。比如,可以使用部署描述符web.xml中配置一個DispatcherServlet,其名稱是appA,它映射到請求/appA/*;可以再配置一個DispatcherServlet,其名稱是appB,它映射到請求/appB/*。

再往下一層的控制器是基于注解@Controller的控制器元件(這就是前面文章所提到的Spring IoC容器基于注解生成Bean),它也可以配置請求的映射模式。

最低層的控制器在Spring MVC中叫做Handler,它是@Controller控制器元件中的某個方法,采用@RequestMapping等注解來配置請求的映射模式。即Handler就是Java類中的某個方法。

是以,以後在Spring MVC中這三個層次的控制器就分别叫做DispatcherServlet(排程器/分派器)、Controller(控制器)、Handler(處理器)。

而Spring MVC的視圖層就是由上圖中的ViewRecolver以及相應的視圖技術元件(JSP、Thymeleaf、FreeMarker)來擔當。ViewRecolver會将Handler傳回的邏輯視圖名字(就是一個字元串)解析到一個實際的視圖(模闆),相應的視圖技術元件會将執行結果渲染到視圖模闆。

那模型層呢?模型層實際上就是你所要開發的業務應用代碼,這裡又可以進一步劃分層次,比如服務層、資料通路層等。(注意:Spring MVC也提供了Model等元件用于挂載實際的業務資料供視圖層通路)

從上圖中可以看到,原來沒有Spring MVC的時候,開發人員需要開發的代碼包括了現在Spring MVC提供的所有功能,而不僅僅是業務邏輯;而現在,開發人員隻需要關注業務邏輯的開發即可。

  • HandlerMapping:就是映射請求和Handler的,一個請求來了,首先要找到應該調用的Handler;
  • HandlerAdapter:是用來幫助DispatcherServlet調用Handler的,實際上是向DispatcherServlet屏蔽調用細節的,比如,有些Handler的調用需要解析注解;
  • HandlerExceptionResolver:用來解決Handler調用過程中産生的異常;
  • ViewResolver:上面已經說過,就是視圖解析器;
  • LocaleResolver和LocaleContextResolver:解決視圖的國際化問題的,比如時區、語言等;
  • ThemeResolver:解決Web應用的主題,比如每個使用者都有自己的個性化的布局;
  • MultipartResolver:解決multi-part類型的請求,比如檔案上傳等,但需要第三方的multipart解析庫;
  • FlashMapManager:用來存儲、擷取和管理FlashMap實體的,FlashMap又是用來管理Flash attributes,Flash attributes又是為了實作POST/Redirect/GET模式的,這個模式又是為了解決POST/Forward/GET模式導緻的多次送出問題。

Spring MVC的請求處理流程

實際上,就是DispatcherServlet串聯的請求處理流程:

  1. 首先,找到綁定到這個請求的Spring IoC容器(實際上就是WebApplicationContext的執行個體,這篇文章及之前的文章是使用standalone應用作為示例來配置和生成Bean,它們使用的是ApplicationContext的執行個體),這樣,處理過程中就可以使用這個Spring IoC容器了;
  2. 綁定LocaleResolver到這個請求,以便在準備資料、渲染視圖的時候可以處理國際化問題;
  3. 綁定ThemeResolver到這個請求,以便決定使用哪個主題;
  4. 如果指定了MultipartResolver,就要在這個請求中找multiparts,然後把這個請求包裝成MultipartHttpServletRequest;
  5. 然後,就根據某種比對模式(比如URL、HTTP方法等)尋找比對的Handler,如果找到了,那就執行與之有關的一個執行鍊(因為可以為Handler配置preprocessors和postprocessors),進而準備好模型和渲染;
  6. 如果傳回了模型,那麼就渲染視圖,否則就不渲染視圖。

實際上,在尋找到比對的Handler之後,還可能執行從請求中提取資料轉換為業務對象的步驟(這個視Handler的參數決定),然後進行Bean校驗(也要視配置決定)。

總結

  • Spring MVC基于Servlet;
  • Spring MVC依賴于Spring IoC,要生成和配置請求處理所需要的各個具體元件Bean;
  • Spring MVC的核心是DispatcherServlet 串聯 請求處理的各個步驟,各個步驟的執行委托給配置好的Spring IoC容器托管的各個具體元件Bean;
  • Spring MVC的核心流程本質上就是DispatcherServlet 串聯 請求處理的各個步驟的流程,最核心的步驟就是:
  1. 尋找比對的Handler
  2. 執行Handler
  3. 将執行結果封裝成模型
  4. 傳回模型和視圖(具有邏輯視圖名)
  5. 視圖解析器解析成實際視圖并渲染。
  • 這樣,應用開發人員職責單一了,隻需要開發業務邏輯代碼即可,資料的呈現即視圖(模闆)可以交給前端工程師設計和開發,隻要約定好接口和資料模型即可。
  • 同時,可以靈活配置各個步驟的具體元件Bean,已有的不滿足需要的話,就自己開發一個具體元件。

繼續閱讀