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

您的位置:首頁技術文章
文章詳情頁

Spring MVC 處理一個請求的流程

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

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

1. 處理流程分析

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

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 { //這邊調用了HttpServlet的service()方法,但由于FrameWorkServle重寫了doGet、doPost等方法,所以最終還是會調用到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 { //這邊調用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()方法的具體內容會在后面講到,這邊描述下doDispatcher()的內容,

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

總結下Spring MVC處理一個請求的過程:

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

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

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

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

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

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

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

7、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

2. 請求流程圖

Spring MVC 處理一個請求的流程

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

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

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

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

當HandlerAdapter組件執行完成之后會得到一個ModleAndView組件,這個組件代表視圖模型。

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

以上就是Spring MVC 處理一個請求的流程的詳細內容,更多關于Spring MVC 處理請求的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日产高清欧美一区二区三区| 在线综合亚洲| 国产精品va| 国内揄拍国内精品久久| 91精品国产福利在线观看麻豆| 伊人久久亚洲美女图片| 亚洲欧洲日韩| 久久中文字幕一区二区| 久久久久免费av| 亚洲精品日韩久久| 国产一区调教| 国产精品毛片| 欧美日韩午夜电影网| 国产aⅴ精品一区二区四区| 日韩欧美少妇| 亚洲天堂日韩在线| 精品美女在线视频| 在线看片不卡| 国产欧美一级| 神马日本精品| 日本在线不卡视频| 91欧美在线| 亚洲精品女人| 天堂√中文最新版在线| 久久亚洲二区| 精品福利久久久| 另类国产ts人妖高潮视频| 国产色噜噜噜91在线精品| 日韩毛片视频| 日韩av网站在线免费观看| 免费一二一二在线视频| 中文字幕免费一区二区| 日韩不卡一区| 国产精品腿扒开做爽爽爽挤奶网站| 国产情侣久久| 日韩视频中文| 精品国产中文字幕第一页| 在线亚洲免费| 国产精品久久观看| 日韩高清在线不卡| 极品日韩av| 麻豆国产精品视频| 久久亚洲欧美| 正在播放日韩精品| 欧美久久香蕉| 国产精品外国| 亚洲成人av观看| 国产精品色在线网站| 亚洲欧洲一区| 亚洲女同av| 国产伦精品一区二区三区在线播放| 激情欧美国产欧美| 成人午夜在线| 国产精一区二区| 中文无码日韩欧| 亚洲婷婷在线| 精品久久久亚洲| 天堂俺去俺来也www久久婷婷| 成人免费网站www网站高清| 国产精品一区二区免费福利视频| 男女性色大片免费观看一区二区| 免费高潮视频95在线观看网站| 国产精品一区二区av交换 | 在线看片日韩| 久久久久欧美精品| 国产精品草草| 亚洲精品乱码| 亚洲深夜影院| 999国产精品永久免费视频app| 精品视频高潮| 日本亚洲视频在线| 国产精品普通话对白| 亚洲婷婷免费| 亚洲不卡av不卡一区二区| 福利视频一区| 乱一区二区av| 国产精品嫩模av在线| 亚洲不卡视频| 亚洲资源在线| 麻豆9191精品国产| 亚洲一区观看| 国产精品色网| 99国产精品视频免费观看一公开| 欧美成人基地 | 美女精品一区二区| 欧美日韩亚洲一区三区| 亚洲不卡视频| 亚洲欧美一级| 一区二区国产在线观看| 视频一区二区三区在线| 欧美99久久| 日韩成人亚洲| 精品亚洲美女网站| 久久国产欧美| 久久精品导航| 国户精品久久久久久久久久久不卡| 久久婷婷激情| 午夜精品婷婷| 国产精品日本欧美一区二区三区| 国产农村妇女精品一二区| 一区免费在线| 视频一区国产视频| 亚洲区国产区| 亚洲精品自拍| 久久精品72免费观看| 国产免费久久| 精品欠久久久中文字幕加勒比| 国产一区二区三区国产精品| 国产成人久久| 偷拍精品精品一区二区三区| 人人香蕉久久| 国产亚洲福利| 亚洲精品麻豆| 国产精品视频一区视频二区| 精品一区二区三区免费看 | 国产一区国产二区国产三区| 精品国产精品久久一区免费式| 欧美丰满日韩| 国产一区久久| 国产视频一区在线观看一区免费| 久久国产高清| 日韩精品免费视频人成| 国产精品资源| 国产h片在线观看| 亚洲福利国产| 久久大逼视频| 青草久久视频| 精品三级在线| 国精品一区二区三区| 视频在线观看国产精品| 欧美影院视频| 欧美国产美女| 不卡中文一二三区| 亚洲精品麻豆| 久久99影视| 久久精品动漫| 日韩欧美2区| 精品欧美日韩精品| 亚洲精品电影| 国产图片一区| 久久视频一区| 少妇高潮一区二区三区99| 卡一卡二国产精品| 午夜影院欧美| 久久国产乱子精品免费女| 国产日韩电影| 免费在线视频一区| 老牛国内精品亚洲成av人片 | 精品国产乱码久久久久久樱花| 欧美日韩中文字幕一区二区三区| 亚洲精一区二区三区| 成人在线黄色| 久久亚洲电影| 精品国产乱码久久久久久1区2匹| 午夜av一区| 国产精品传媒麻豆hd| 亚洲国产日韩欧美在线| 国产日韩在线观看视频| 欧美a级一区| 国产精品亲子伦av一区二区三区 | 三级一区在线视频先锋| 国产精品亚洲一区二区在线观看 | 久久久久一区| 日本精品一区二区三区在线观看视频 | 国产成人精品999在线观看| 夜夜嗨一区二区三区| 麻豆国产91在线播放| 图片区亚洲欧美小说区| 日韩高清在线不卡| 99精品综合| 国产伦精品一区二区三区千人斩 | 中文字幕一区二区三区日韩精品 | 蜜桃精品在线| 久久精品999| 尤物精品在线| 精品亚洲精品| 亚洲精品极品| 久久亚洲精品中文字幕蜜潮电影| 日韩avvvv在线播放| japanese国产精品| 国产a久久精品一区二区三区| 亚洲精品精选| 成人av二区| 久久天堂影院| 亚洲久草在线| 欧美1区免费| 免费日韩成人| 日韩影院免费视频| 亚洲电影有码| 九九九精品视频| 日韩综合小视频| 夜夜精品视频| 高清av一区二区三区| 久久精品一区二区国产| 亚洲1区在线观看| 亚洲一区二区三区四区五区午夜| 色网在线免费观看| 欧美交a欧美精品喷水| 亚洲精品自拍| 日韩视频一区二区三区在线播放免费观看|