成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringMVC之DispatcherServlet(一)

Chiclaim / 2334人閱讀

摘要:調(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

前言:DispacherServlet是什么?
與很多的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)文章

  • SpringMVC源碼分析--啟動(dòng)過程

    摘要:核心類類的繼承關(guān)系前端控制器是規(guī)范中的核心類,實(shí)現(xiàn)接口,繼承此類用于處理用戶請(qǐng)求。主要配置中初始化參數(shù)。 Spring MVC 核心類 類的繼承關(guān)系Spring MVC前端控制器DispatcherServlet-->FrameworkServlet-->HttpServletBean-->HttpServletshowImg(https://segmentfault.com/img/...

    Olivia 評(píng)論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(

    摘要:接口接口作用是將請(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...

    ralap 評(píng)論0 收藏0
  • springmvc

    摘要:容器將讀取的核心配置文件進(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...

    蘇丹 評(píng)論0 收藏0
  • SpringMVC源碼分析--HandlerAdapter(三)

    摘要:概述回顧上兩章,我們主要分析了的概念作業(yè)以及如何使用的組件,本節(jié)以及后續(xù)幾章,將介紹為我們提供的的具體實(shí)現(xiàn)類,基于源碼和設(shè)計(jì)層面進(jìn)行介紹,歡迎大家關(guān)注。本系列文章是基于。 概述 回顧上兩章,我們主要分析了HandlerAdapter的概念、作業(yè)以及Spring MVC如何使用的HandlerAdapter組件,本節(jié)以及后續(xù)幾章,將介紹Spring為我們提供的HandlerAdapter...

    Dionysus_go 評(píng)論0 收藏0
  • 從SpringBoot到SpringMVC

    摘要:概述用久了,深受其約定大于配置的便利性毒害之后,我想回歸到時(shí)代,看看開發(fā)模式中用戶是如何參與的。備注當(dāng)然本文所使用的全是非注解的配置方法,即需要在中進(jìn)行配置并且需要遵循各種實(shí)現(xiàn)原則。而更加通用主流的基于注解的配置方法將在后續(xù)文章中詳述。 showImg(https://segmentfault.com/img/remote/1460000015244684); 概述 用久了Sprin...

    xavier 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<