摘要:調用攔截器的方法,它在處理器實際執行之前會被執行,它在處理器執行完畢以后被執行,它在整個請求處理完成之后被執行。根據參數調用具體的方法,并獲取返回值交有具體的參數解析器后,完成具體的相應參數的解析,例如包括請求中得是等進行相應的解析。
官方文檔說明
中文文檔鏈接
部分內容引字下面博客
博客1
博客2
與很多的web框架一樣,Spring Mvc也是圍繞著一個中央Servlet展開的,Spring mvc 的這個servlet就是DispatcherServlet,但這個DispatcherServlet能做的更多。它與Spring IoC容器做到了無縫集成,這意味著,Spring提供的任何特性,在Spring MVC中你都可以使用。同時也說明了DispatcherServlet就是一個Servlet(它繼承自HttpServlet基類),同樣也需要在你web應用的web.xml配置文件下聲明。你需要在web.xml文件中把你希望DispatcherServlet處理的請求映射到對應的URL上去。這就是標準的Java EE Servlet配置;下面的代碼就展示了對DispatcherServlet和路徑映射的聲明:
流程example org.springframework.web.servlet.DispatcherServlet 1 example /example/*
1.那么從發送請求到DispatcherServlet之間做了什么呢?(也就是上圖的第一步)
這里就是對請求的一個描述過程,http請求到了后臺之后經歷了一系列的servlet轉發最后到達了doDispatch()這個方法;這個方法中做了如下幾件事情:
2.第二步映射處理器又做了什么呢?
1). 獲取處理執行鏈對象: HandlerExecutionChain mappedHandler = getHandler(processedRequest);
處理執行鏈類 HandlerExecutionChain : 由處理對象 handler 和 攔截器 HandlerInterceptor 組成。這里就涉及了一個新的概念HandlerInterceptor:
Spring的處理器映射機制包含了處理器攔截器。攔截器在你需要為特定類型的請求應用一些功能時可能很有用,比如,檢查用戶身份等。在這里可以配置攔截請求:文檔鏈接如下:配置HandlerInterceptor攔截器。
2). 獲取處理適配器: HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
SpringMVC 遍歷所有的 HandlerAdapter 類,如果某個處理適配器支持該處理器類型,則返回該處理器。3). 調用攔截器的 preHandle 方法;
preHandle(..),它在處理器實際執行 之前 會被執行; postHandle(..),它在處理器執行 完畢 以后被執行; afterCompletion(..),它在 整個請求處理完成 之后被執行。這三個方法為各種類型的前處理和后處理需求提供了足夠的靈活性。
preHandle(..)方法返回一個boolean值。你可以通過這個方法來決定是否繼續執行處理鏈中的部件。當方法返回 true時,處理器鏈會繼續執行;若方法返回 false, DispatcherServlet即認為攔截器自身已經完成了對請求的處理(比如說,已經渲染了一個合適的視圖),那么其余的攔截器以及執行鏈中的其他處理器就不會再被執行了。4)調用具體的接口方法,并返回模型視圖對象: mv = ha.handle(processedRequest, response,mappedHandler.getHandler());
這是一個很復雜的過程,調用具體方法是做了以下幾個事情:
(a)解析參數:
springmvc解析參數的時候會先去方法定義的所有參數列表然后根據集體需要的參數類型調用相應的參數解析器,這一步是通過反射的相關內容完成的。
(b)根據參數調用具體的方法,并獲取返回值:
交有具體的參數解析器后,完成具體的相應參數的解析,例如包括請求中得contentType是application/json等進行相應的解析。
(c)返回返回值:
解析完參數后,則通過反射機制調用具體的方法并獲取返回值。5)調用攔截器的 postHandle 方法;
preHandle(..),它在處理器實際執行 之前 會被執行; postHandle(..),它在處理器執行 完畢 以后被執行;6)調用攔截器的afterCompletion(..),它在 整個請求處理完成 之后被執行。這三個方法為各種類型的前處理和后處理需求提供了足夠的靈活性。
7)處理結果: processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
(a)處理異常;
如果在前面的處理中拋出了異常,則會獲取相應的模型視圖對象。有兩種處理方式:如果異常對象為 ModelAndViewDefiningException 類型,則直接獲取模型視圖對象;否則的話調用當前系統內的處理異常解析器 ( HandlerExceptionResolver ) 處理:如果某個異常解析器返回了有效的模型視圖對象,則跳出循環。
此處的 ExceptionHandlerExceptionResolver 類通過用戶自定義的 @ExceptionHandler 方法解析異常,如果用戶未定義,則跳出該解析器。
(b)渲染 ModelAndView 對象;
在渲染方法 render() 中,如果傳入的 ModelAndView 對象是 View 引用類型,即為 String 字符串時,則調用當前的視圖解析器 ViewResolver 解析該字符串,如當前配置了視圖解析器為:
則該實現會在視圖解析器列表 viewResolvers 中: 在解析時,將會添加上對應的 prefix, suffix, 接下來則調用 View 對象的 render() 方法,根據提供的 Model 對象渲染該視圖對象。
(c)調用處理執行鏈的 triggerAfterCompletion() 方法。
該方法只調用在 preHandle() 方法中成功調用且返回為 true 的攔截器,且從列表后往前調用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68313.html
摘要:核心類類的繼承關系前端控制器是規范中的核心類,實現接口,繼承此類用于處理用戶請求。主要配置中初始化參數。 Spring MVC 核心類 類的繼承關系Spring MVC前端控制器DispatcherServlet-->FrameworkServlet-->HttpServletBean-->HttpServletshowImg(https://segmentfault.com/img/...
摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節因不同的實現而不相同。該參數是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:概述回顧上兩章,我們主要分析了的概念作業以及如何使用的組件,本節以及后續幾章,將介紹為我們提供的的具體實現類,基于源碼和設計層面進行介紹,歡迎大家關注。本系列文章是基于。 概述 回顧上兩章,我們主要分析了HandlerAdapter的概念、作業以及Spring MVC如何使用的HandlerAdapter組件,本節以及后續幾章,將介紹Spring為我們提供的HandlerAdapter...
摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時代,看看開發模式中用戶是如何參與的。備注當然本文所使用的全是非注解的配置方法,即需要在中進行配置并且需要遵循各種實現原則。而更加通用主流的基于注解的配置方法將在后續文章中詳述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...
閱讀 2950·2023-04-26 01:32
閱讀 1544·2021-09-13 10:37
閱讀 2282·2019-08-30 15:56
閱讀 1676·2019-08-30 14:00
閱讀 3048·2019-08-30 12:44
閱讀 1967·2019-08-26 12:20
閱讀 1065·2019-08-23 16:29
閱讀 3233·2019-08-23 14:44