日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Spring MVC 處理一個(gè)請(qǐng)求的流程

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

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

1. 處理流程分析

Servlet處理一個(gè)請(qǐng)求時(shí)會(huì)調(diào)用service()方法,所以DispatcherServlet處理請(qǐng)求的方式也是從service()方法開(kāi)始(debug的話建議從DispatcherServlet的service方法開(kāi)始debug)。FrameworkServlet重寫了HttpServlet的service方法,這個(gè)service方法后面又調(diào)用了FrameworkServlet的processRequest()方法,processRequest()調(diào)用了DispatcherServlet的doService()方法,最后調(diào)用到DispatcherServlet的doDispatcher()方法。整合處理請(qǐng)求的方法調(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等方法,所以最終還是會(huì)調(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)容會(huì)在后面講到,這邊描述下doDispatcher()的內(nèi)容,

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

總結(jié)下Spring MVC處理一個(gè)請(qǐng)求的過(guò)程:

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

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

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

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

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

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

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

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

2. 請(qǐng)求流程圖

Spring MVC 處理一個(gè)請(qǐng)求的流程

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

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

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

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

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

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

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

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美特黄一区| 蜜桃av一区二区在线观看| 亚洲精品少妇| 日韩视频一区二区三区在线播放免费观看| 午夜av不卡| 麻豆精品蜜桃视频网站| 国产美女亚洲精品7777| 欧美日本久久| 国产精品chinese| 麻豆国产欧美日韩综合精品二区| 国产乱人伦丫前精品视频 | 国产三级精品三级在线观看国产| 天堂久久一区| 日韩精品a在线观看91| 亚洲综合小说| 亚洲精品在线a| 久久国产精品久久久久久电车| 怡红院精品视频在线观看极品| 日韩视频在线一区二区三区| 蜜桃成人av| 亚洲激情不卡| 蜜桃视频免费观看一区| 四虎精品一区二区免费| 日韩欧美久久| 久久国产人妖系列| 国产精品3区| 国产a亚洲精品| 久久精品123| 伊人精品视频| 日本在线视频一区二区| 国产精品网址| 大香伊人久久精品一区二区| 亚洲1234区| 蜜桃免费网站一区二区三区| 国产调教精品| 亚洲精品福利电影| 夜夜嗨网站十八久久| 亚洲免费成人av在线| 嫩草伊人久久精品少妇av杨幂 | 国产在线一区不卡| 久久国产影院| 亚洲精品中文字幕99999| 国产精品3区| 亚洲欧美综合| 欧美天堂一区二区| 麻豆国产91在线播放| 久久九九精品| 亚洲精品四区| 成人午夜亚洲| 美女91精品| 国产日韩三级| 久久久久久久久丰满| 亚洲区第一页| 97在线精品| 蜜桃视频第一区免费观看| 欧美国产另类| 五月婷婷六月综合| 日韩不卡一区二区| 日韩在线观看一区| 亚洲精品观看| 久久三级毛片| 在线综合视频| 精品视频一二| 性欧美精品高清| 麻豆精品视频在线| 夜夜嗨一区二区三区| 国产精品一卡| 国产视频久久| 国产一区2区| 中文字幕免费精品| 日韩电影在线视频| 日韩高清二区| 久久久国产亚洲精品| 日韩成人午夜精品| japanese国产精品| 国产精品久久久久久av公交车| 欧美日韩国产一区精品一区| 麻豆国产欧美一区二区三区| 久久亚洲精品伦理| 国产精选在线| 日韩 欧美一区二区三区| 欧产日产国产精品视频| 日本国产一区| 午夜日韩av| av资源中文在线| 国产欧美日韩在线观看视频| 黄色免费成人| a日韩av网址| 久久国产精品美女| 综合一区av| 91精品国产福利在线观看麻豆| 国产精品久久久久久久久久妞妞| 国产一区91| 国产91一区| 美女av在线免费看| 国产精品毛片久久久| 一区二区电影| 亚洲成人一区| 中文字幕色婷婷在线视频| 国产欧美69| 亚洲视频二区| 午夜欧美理论片| 亚洲成av在线| 成人国产精品一区二区免费麻豆| 91精品视频一区二区| 蜜臀av免费一区二区三区| 国产精品99一区二区三| 国产精品sss在线观看av| 蜜桃久久精品一区二区| 日本精品影院| 国产精品精品| 美女视频黄免费的久久| 日韩av电影一区| 在线观看亚洲精品福利片| 欧美日韩国产综合网| 久久久久久久久99精品大| 成人影视亚洲图片在线| 九九久久国产| 麻豆91精品视频| 国产精品tv| 日韩va欧美va亚洲va久久| 四虎在线精品| 一区二区三区国产盗摄| 免费看黄色91| 中文字幕亚洲在线观看| 亚洲午夜免费| 日韩欧美高清一区二区三区| 亚洲一区av| 亚洲精品伊人| 日韩精品免费一区二区夜夜嗨 | 视频在线观看一区| 午夜在线视频一区二区区别| av成人国产| 亚洲激情另类| 在线视频精品| 日韩影院在线观看| 亚洲日产国产精品| 日韩精品三级| 国产另类在线| 久久亚洲资源中文字| 精品高清久久| 91看片一区| 亚洲一级黄色| 久久先锋影音| 日韩成人一级| 久久精品国产成人一区二区三区| 精品亚洲免a| 最近高清中文在线字幕在线观看1| 美女精品视频在线| 国产精品久久观看| 香蕉久久精品| 丝袜脚交一区二区| 日韩av电影一区| 免费亚洲一区| 日韩综合精品| 国产毛片一区| 日韩av资源网| 精品一区二区三区在线观看视频| 国产一区二区三区四区| 中文字幕高清在线播放| 在线日韩中文| 免费日本视频一区| 欧美日韩午夜电影网| 国产美女视频一区二区| 国产福利片在线观看| 波多野结衣一区| 日本亚洲最大的色成网站www | 亚洲精品视频一二三区| 欧美激情福利| 亚洲福利专区| 亚洲精品在线二区| 国产videos久久| 亚洲深夜影院| 国产精区一区二区| 久久久久欧美精品| 婷婷综合电影| 日韩在线欧美| 97久久超碰| 久久久久美女| 日本免费一区二区视频| 91av亚洲| 日本成人在线一区| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 亚洲一区日韩在线| 国产精品宾馆| 日韩电影在线视频| 亚洲精品极品| 日韩免费视频| 日本 国产 欧美色综合| 青青草91久久久久久久久| 日韩深夜视频| 欧美国产91| 日韩激情视频网站| 精品三级久久久| 久久一区二区三区电影| 免费人成黄页网站在线一区二区 | 麻豆国产精品777777在线| 在线精品亚洲欧美日韩国产| 亚洲黄页一区| 麻豆精品99|