亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Spring MVC 處理一個請求的流程

瀏覽:34日期:2023-07-23 16:36:44

一個請求從客戶端發(fā)出到達服務(wù)器,然后被處理的整個過程其實是非常復(fù)雜的。本博客主要介紹請求到達服務(wù)器被核心組件DispatcherServlet處理的整理流程(不包括Filter的處理流程)。

1. 處理流程分析

Servlet處理一個請求時會調(diào)用service()方法,所以DispatcherServlet處理請求的方式也是從service()方法開始(debug的話建議從DispatcherServlet的service方法開始debug)。FrameworkServlet重寫了HttpServlet的service方法,這個service方法后面又調(diào)用了FrameworkServlet的processRequest()方法,processRequest()調(diào)用了DispatcherServlet的doService()方法,最后調(diào)用到DispatcherServlet的doDispatcher()方法。整合處理請求的方法調(diào)用流程如上,下面看下代碼:

protected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());if (HttpMethod.PATCH == httpMethod || httpMethod == null) {processRequest(request, response);}else { //這邊調(diào)用了HttpServlet的service()方法,但由于FrameWorkServle重寫了doGet、doPost等方法,所以最終還是會調(diào)用到processRequest方法super.service(request, response);}}

再看看FrameworkServlet的processRequest()方法。

protected final void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { long startTime = System.currentTimeMillis(); Throwable failureCause = null; LocaleContext previousLocaleContext = LocaleContextHolder.getLocaleContext(); LocaleContext localeContext = buildLocaleContext(request); RequestAttributes previousAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes requestAttributes = buildRequestAttributes(request, response, previousAttributes); WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); asyncManager.registerCallableInterceptor(FrameworkServlet.class.getName(), new RequestBindingInterceptor()); initContextHolders(request, localeContext, requestAttributes); try { //這邊調(diào)用DispatcherServlet的doService()方法 doService(request, response); } catch (ServletException ex) { failureCause = ex; throw ex; } catch (IOException ex) { failureCause = ex; throw ex; } catch (Throwable ex) { failureCause = ex; throw new NestedServletException('Request processing failed', ex); } finally { resetContextHolders(request, previousLocaleContext, previousAttributes); if (requestAttributes != null) { requestAttributes.requestCompleted(); } if (logger.isDebugEnabled()) { if (failureCause != null) { this.logger.debug('Could not complete request', failureCause); } else { if (asyncManager.isConcurrentHandlingStarted()) { logger.debug('Leaving response open for concurrent processing'); } else { this.logger.debug('Successfully completed request'); } } } publishRequestHandledEvent(request, response, startTime, failureCause); } }

doService()方法的具體內(nèi)容會在后面講到,這邊描述下doDispatcher()的內(nèi)容,

首先根據(jù)請求的路徑找到HandlerMethod(帶有Method反射屬性,也就是對應(yīng)Controller中的方法),然后匹配路徑對應(yīng)的攔截器,有了HandlerMethod和攔截器構(gòu)造個HandlerExecutionChain對象。HandlerExecutionChain對象的獲取是通過HandlerMapping接口提供的方法中得到。有了HandlerExecutionChain之后,通過HandlerAdapter對象進行處理得到ModelAndView對象,HandlerMethod內(nèi)部handle的時候,使用各種HandlerMethodArgumentResolver實現(xiàn)類處理HandlerMethod的參數(shù),使用各種HandlerMethodReturnValueHandler實現(xiàn)類處理返回值。 最終返回值被處理成ModelAndView對象,這期間發(fā)生的異常會被HandlerExceptionResolver接口實現(xiàn)類進行處理。

總結(jié)下Spring MVC處理一個請求的過程:

首先,搜索應(yīng)用的上下文對象 WebApplicationContext 并把它作為一個屬性(attribute)綁定到該請求上,以便控制器和其他組件能夠使用它。 將地區(qū)(locale)解析器綁定到請求上,以便其他組件在處理請求(渲染視圖、準(zhǔn)備數(shù)據(jù)等)時可以獲取區(qū)域相關(guān)的信息。如果你的應(yīng)用不需要解析區(qū)域相關(guān)的信息; 將主題(theme)解析器綁定到請求上,以便其他組件(比如視圖等)能夠了解要渲染哪個主題文件。同樣,如果你不需要使用主題相關(guān)的特性,忽略它即可如果你配置了multipart文件處理器,那么框架將查找該文件是不是multipart(分為多個部分連續(xù)上傳)的。若是,則將該請求包裝成一個 MultipartHttpServletRequest 對象,以便處理鏈中的其他組件對它做進一步的處理。關(guān)于Spring對multipart文件傳輸處理的支持; 為該請求查找一個合適的處理器。如果可以找到對應(yīng)的處理器,則與該處理器關(guān)聯(lián)的整條執(zhí)行鏈(前處理器、后處理器、控制器等)都會被執(zhí)行,以完成相應(yīng)模型的準(zhǔn)備或視圖的渲染如果處理器返回的是一個模型(model),那么框架將渲染相應(yīng)的視圖。若沒有返回任何模型(可能是因為前后的處理器出于某些原因攔截了請求等,比如,安全問題),則框架不會渲染任何視圖,此時認為對請求的處理可能已經(jīng)由處理鏈完成了(這個過程就是doService()和doDispatcher()做的事情)

1、 首先用戶發(fā)送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統(tǒng)一訪問點,進行全局的流程控制;

2、 DispatcherServlet——>HandlerMapping,HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,通過這種策略模式,很容易添加新的映射策略;

3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計模式的應(yīng)用,從而很容易支持很多類型的處理器;

4、 HandlerAdapter——>處理器功能處理方法的調(diào)用,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);

5、 ModelAndView的邏輯視圖名——> ViewResolver,ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術(shù);

6、 View——>渲染,View會根據(jù)傳進來的Model模型數(shù)據(jù)進行渲染,此處的Model實際是一個Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);

7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個流程結(jié)束。

2. 請求流程圖

Spring MVC 處理一個請求的流程

還是這個圖比較清楚。發(fā)現(xiàn)根據(jù)代碼不太能把這個流程說清楚。而且整個流程很長,代碼很多,我就不貼代碼了。這里根據(jù)這個圖再把整個流程中組件的功能總結(jié)下:

DispatcherServlet:核心控制器,所有請求都會先進入DispatcherServlet進行統(tǒng)一分發(fā),是不是感覺有點像外觀模式的感覺; HandlerMapping:這個組件的作用就是將用戶請求的URL映射成一個HandlerExecutionChain。這個HandlerExecutionChain是HandlerMethod和HandlerInterceptor的組合。Spring在啟動的時候會默認注入很多HandlerMapping組件,其中最常用的組件就是RequestMappingHandlerMapping。

上面的HandlerMethod和HandlerInterceptor組件分別對應(yīng)我們Controller中的方法和攔截器。攔截器會在HandlerMethod方法執(zhí)行之前執(zhí)行

HandlerAdapter組件,這個組件的主要作用是用來對HandlerMethod中參數(shù)的轉(zhuǎn)換,對方法的執(zhí)行,以及對返回值的轉(zhuǎn)換等等。這里面涉及的細節(jié)就很多了,包括HandlerMethodArgumentResolver、HandlerMethodReturnValueHandler 、RequestResponseBodyMethodProcessor 、和HttpMessageConvert等組件。

當(dāng)HandlerAdapter組件執(zhí)行完成之后會得到一個ModleAndView組件,這個組件代表視圖模型。

得到ModleAndView后會執(zhí)行攔截器的postHandle方法。 如果在上面的執(zhí)行過程中發(fā)生任何異常,會由HandlerExceptionResolver進行統(tǒng)一處理。 最后模型解析器會對上面的到的ModleAndView進行解析,得到一個一個View返回給客戶端。在返回客戶端之前還會執(zhí)行攔截器的afterCompletion方法。

以上就是Spring MVC 處理一個請求的流程的詳細內(nèi)容,更多關(guān)于Spring MVC 處理請求的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 黄色aaaaa| 一级特黄性色生活片 | 欧美高清一级 | 99久热在线精品视频观看 | 黄色一级片在线 | 亚洲天天网综合自拍图片专区 | 精品国产欧美一区二区最新 | 制服丝袜第一页在线观看 | 国产成人精品午夜 | 国产一区二区精品久久凹凸 | 国产精品玖玖玖在线观看 | 欧美另类69xxxxx免费 | 成年免费大片黄在线观看岛国 | 免费片| 久青草国产手机在线观 | 国产xxxxxx久色视频在 | 精品综合网 | 2021国产成人午夜精品 | 亚洲精品久久青草 | 成年啪啪网站免费播放看 | 天天在线天天综合网色 | 二区视频在线 | 久久久亚洲欧洲国产 | 精品国偷自产在线不卡短视频 | 特色一级黄色片 | 亚洲国产一级毛片 | 成人福利网址永久在线观看 | 成年大片免费高清在线观看 | 麻豆传媒小视频 | 免费人成黄页在线观看忧物 | 亚洲线精品久久一区二区三区 | 久久er这里只有精品 | 九九精品视频一区在线 | 国产免费高清 | 久久精品国产精品亚洲红杏 | 香蕉视频在线观看www | 成人午夜精品 | 在线视频日韩 | 亚洲精品人成网在线播放蜜芽 | 欧美一区二区三区免费播放 | 欧美黄色一级片免费看 |