1. 程式人生 > >Spring mvc 請求處理

Spring mvc 請求處理

轉自:http://www.cnblogs.com/dreamworlds/p/5396112.html
轉自:http://www.jianshu.com/p/baa3a05cd271
轉自:http://blog.csdn.net/binglumeng/article/details/53585821
從web.xml中servlet的配置開始,根據servlet攔截的url-pattern,進行請求轉發。
Spring MVC工作流程如下:
這裡寫圖片描述
這裡寫圖片描述
Spring工作流程如上圖所示:
1.使用者向伺服器傳送請求,請求被Spring前端控制Servlet DispatcherServlet捕獲;
2.DispatcherServlet對請求URL進行解析,得到請求資源識別符號(URI),呼叫HandlerMapping獲得該Handler配置的所有相關的物件(包括Handler物件以及Handler物件對應的攔截器),最後以HandlerExecutionChain物件的形式返回;
3.DispatcherServlet根據獲得的Handler,選擇一個合適的HandlerAdapter。(如果成功獲得HandlerAdapter後,此時將開始執行攔截器的preHandler(…)方法);
4.提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)。在填充Handler入參的過程中,根據你的配置,Spring幫你完成如下工作:
  HttpMessageConveter:將請求訊息(如Json、xml等資料)轉換成一個物件,將物件轉換為指定的響應資訊
  資料轉換:對請求訊息進行資料轉化。如String轉化成Integer、Double等;
  資料驗證:驗證資料的有效性(長度、格式等),驗證結果儲存到BindingResult或Error中。
5.Handler執行完成後,向DispatcherServlet返回一個ModelAndView物件;
6.根據返回的ModelAndView,選擇一個合適的ViewResolver返回給DispatcherServlet;
7.ViewResolver結合Model和View,來渲染檢視;
8.將渲染結果返回給客戶端。

為什麼Spring只使用一個Servlet(DispatcherServlet)來處理所有請求?
主要原因由於J2EE核心模式-Font Controller(前端控制器)。Front Controller模式要求在WEB應用系統的前端(Front)設定一個入口控制器(Controller),所有的request請求都被髮往該控制器統一處理。Front Controller一般可以用來做一共同處理比如認證,頁面導航,Session管理,國際化或本地化處理等。在開發WEB應用系統(但不拘於WEB應用)時,存在很多不恰當的設計方法,比如讓客戶端(Client,一般指瀏覽器)可以直接訪問各個檢視(view,JSP等)。這樣邏輯被分散到各個檢視中,從而產生了各種問題:
1》對已有的功能修改困難,可維護性低。假如session管理,一旦session內容需要發生改變,則需要修改所有view中的相關程式碼。
2》很難增加新的功能,缺乏可擴充套件性。例如,需要在已有的系統中加入安全控制功能,控制使用者對某些頁面的訪問,因為沒有統一的處理入口,需要在所有的view中都加上認證程式碼。
使用Front Controller,強制分離view的顯示邏輯與業務處理邏輯。

Spring為什麼要結合使用HandlerMapping以及HnadlerAdapter來處理Handler?
主要原因是符合和麵向物件中單一職責原則,程式碼架構清晰,便於維護,程式碼可複用性高。如HandlerAdapter可能會被用於處理多種Hander。
這裡寫圖片描述
1. 當DispatcherServlet接到請求時,他先回查詢適當的處理程式來處理請求。DispatcherServlet通過一個或者多個處理程式對映,將每個請求對映到處理程式中。處理程式對映配置在web應用程式的上下文中,是實現了HandlerMapping介面的Bean。它負責為請求返回一個適當的處理程式(也就是Controller)。處理程式對映通常根據請求的URL將請求對映到處理程式(Controller)。
2. 一旦DispatcherServlet選擇了適當的控制器,它就會呼叫這個控制器來處理請求。
3. 控制器處理完請求後,會將模型和檢視名(有時候是檢視物件)返回給DispatcherServlet。模型包含了控制器要傳遞給檢視進行顯示的屬性。如果返回的是檢視名稱,它會被解析成檢視物件再進行呈現。繫結模型和檢視的基本類是ModelAndView.
4. 當DispatcherServlet接收到模型和檢視名稱時,它會將邏輯檢視名稱解析成檢視物件再進行呈現。DispatcherServlet從一個或者多個檢視解析器中解析檢視。檢視解析器配置在Web應用程式上下文中,是實現了ViewResolver介面的Bean。它的任務是根據邏輯檢視名稱返回試圖物件。
5. 一旦DispatcherServlet將檢視名稱解析稱為檢視物件,它就會呈現檢視物件,並傳遞控制器返回的模型。檢視的任務是將模型屬性展示給使用者。

DispatcherServlet接收到請求後如何對映到Controller?
在Spring MVC中,web請求被Web應用程式上下文中宣告的一個或者多個處理程式對映Bean對映到Controller,Spring MVC提供了幾種HandlerMapping實現:
  BeanNameUrlHandlerMapping(預設情況),他根據Controller Bean名稱中指定的URL模式將請求對映到處理程式上。
eg. …
當你訪問http://**/welcome.htm這個URL時,DispatcherServlet通過BeanNameUrlHandlerMapping對映就找到了WelcomeController。
  ControllerClassNameHandlerMapping,它是按控制器類名稱對映請求。
   SimpleUrlHandlerMapping,用定製的對映定義來對映請求。
這裡寫圖片描述
Controller介面是Spring MVC中所有控制器類的基本介面。通過實現這個介面,你可以建立自己的控制器。在handleRequest()方法中,可以隨意地處理Web請求。
AbstractController:如果你想讓控制器具備一些基本的特性,如過濾受支援的HTTP方法(GET,POST和HEAD),以及在HTTP響應中生成cache-control頭部等,你可以讓它擴充套件AbstractController類。
ParameterizableViewController:用來建立帶有引數化檢視的控制器。
SimpleFormController:它支援命令物件的概念(commandName),並且可以將表單域的值繫結到命令物件的同名屬性上。
AbstractWizardFormController:為嚮導表單的處理定義了基本的任務。嚮導表單有多個單頁,因此必須為嚮導表單控制器定義多個頁面檢視。然後這個控制器可以跨越所有這些表單頁面來管理表單狀態。嚮導表單會有多個動作,不像SimpleFormController只有單個提交動作。AbstractWizardFormController會根據特殊的請求引數決定使用者的動作,通常是用提交按鈕的名稱來指定動作的。
_finished: 完成嚮導表單。
_cancel: 取消嚮導表單。
_targetx: 進入目標頁面,這裡的x是從0開始的頁面索引。
MultiActionController:允許你將多個相關的動作分組到一個控制器中。
常見的檢視型別:
這裡寫圖片描述

幾種常見的ViewResolver的解析:
InternalResourceViewResolver: 根據URL解析檢視。通過新增字首和字尾的方法,將每個檢視名稱都對映到一個URL上。
XmlViewResolver: 從XML配置檔案中解析檢視。將檢視宣告成Spring的Bean,並按他們的Bean Name進行解析。
ResourceBundleViewResolver: 從ResourceBundle中解析檢視。
用多個檢視解析器解析檢視, 需要注意的是,您需要為你配置的檢視解析器配置解析的優先順序。 value越小,優先順序越高。

相關推薦

Spring MVC請求處理流程及架構

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; H

spring mvc 請求處理方式...

標題實在不知應該如何定義,略處尷尬。 相信有很多剛接觸Spring mvc的小夥伴跟我一樣都有個小疑問。如何正確根據場景需要來處理請求,舉個栗子吧~~~   拿login作為栗子,賬號密碼輸入完畢 -》 登陸按鈕 -》 Controller -》賬戶正確 -》 主頁.jsp

Spring mvc請求處理流程詳解(一)之檢視解析

前言   Spring mvc框架相信很多人都很熟悉了,關於這方面的資料也是一搜一大把。但是感覺講的都不是很細緻,讓很多初學者都雲裡霧裡的。本人也是這樣,之前研究過,但是後面一段時間不用發現又忘記了。所以決定寫下來,以備後用。   本系列文基於spring-

Spring mvc 請求處理

轉自:http://www.cnblogs.com/dreamworlds/p/5396112.html 轉自:http://www.jianshu.com/p/baa3a05cd271 轉自:http://blog.csdn.net/binglumeng/

Spring MVC請求處理流程

從web.xml中 servlet的配置開始, 根據servlet攔截的url-parttern,來進行請求轉發 Spring MVC工作流程圖 圖一 圖二  Spring工作流程描述       1. 使用者向伺服器傳送請求,請求被Spring 前端控制Servelt Di

spring mvc請求處理流程/原理

1.spring mvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。2.DispatcherServlet查詢一個或多個Handl

Spring MVC請求處理具體流程

// 前端控制器分派方法 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { Htt

Spring MVC請求處理流程分析

一、簡介 Spring MVC框架在工作中經常用到,配置簡單,使用起來也很方便,很多書籍和部落格都有介紹其處理流程,但是,對於

jquery 跨域 非同步請求 自定義頭部 預檢請求 spring mvc攔截處理 實現token單點登入

被跨域搞死了,各種奇葩問題。 問題描述:跨域登入,生成token並儲存到redis中,然後返回給客戶端,客戶端每次請求需要將token放到請求頭中傳給服務端,服務端使用過濾器處理跨域攔截,使用攔截器判斷token有效性。問題來了,發來的請求總是獲取不到頭部資訊,也就是取不到

Spring MVC異常處理實例

bsp ips etag label 視圖 uri _id integer ive 以下內容引用自http://wiki.jikexueyuan.com/project/spring/mvc-framework/spring-exception-handling-examp

spring mvc請求過程

logs ont com 邏輯 src resolv 發送 pre mage 1. 請求會首先發送到DispatchServlet,這是spring的前置Servlet,它會接收請求並轉發給spring的MVC controller,也就是業務controller 2. D

Spring MVC異常處理SimpleMappingExceptionResolver

bean pri 分享圖片 ESS bsh trace 內部實現 ont per Spring MVC異常處理SimpleMappingExceptionResolver【轉】 (2012-12-07 13:45:33) 轉載▼ 標簽: 雜談 分類: 技術

Spring MVC 異常處理 - ResponseStatusExceptionResolver

執行 代碼 pin ces val col resolv use turn 作用在類和方法上面 更改返回的代碼和錯誤消息 類上 通過throw new UserName***Exception()拋出 @ResponseStatus(value=HttpStatus.FO

Spring系列(七) Spring MVC 異常處理

nco 部分 給定 uri too ebo intended 路徑 onf Servlet傳統異常處理 Servlet規範規定了當web應用發生異常時必須能夠指明, 並確定了該如何處理, 規定了錯誤信息應該包含的內容和展示頁面的方式.(詳細可以參考servlet規範文檔)

spring mvc 請求引數String 轉date

以spring boot為背景 1 實現org.springframework.core.convert.converter.Converter介面生成一個自定義Converter。 public class DateConverter implements Converter&l

spring mvc(4)處理模型資料

處理模型資料 Spring MVC 提供了以下幾種途徑輸出模型資料: – ModelAndView: 處理方法返回值型別為 ModelAndView時, 方法體即可通過該物件新增   模型資料 – Map 及 Model: 入參為org.springframework.ui.Mo

簡單讀!spring-mvc請求的來龍去脈

  相信spring-mvc這種被玩壞了的架構理念,大家都爛熟於胸了,不過還是想來扒一扒他的細節。   一個http請求,怎麼樣被 spring 接收,又怎樣做出響應呢? 一般地,我們會配置一個 web.xml,然後開始程式碼之旅。    在 web.xml 中配置 servlet-mapping, 將

spring MVC提交處理帶檔案和非檔案表單

<form action="" method="post" enctype="multipart-form-date"> <input type="file" name="file"/> <input type="user.userName"/&g

Spring MVC非同步處理-DeferedResult使用

DeferedResult處理流程 Spring mvc的控制層接收使用者的請求之後,如果要採用非同步處理,那麼就要返回DeferedResult<>泛型物件。在呼叫完控制層之後,立即回返回DeferedResult物件,此時驅動控制層的容器主執行緒,可以處理更多的請求。

Spring Boot & Spring MVC 異常處理的N種方法

預設行為 根據Spring Boot官方文件的說法: For machine clients it will produce a JSON response with details of the error, the HTTP status and the excep