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