SpringMvc執行流程及底層代碼流程

SpringMVC執行流程前端

 

 

 

01. 客戶端發送請求被咱們在web.xml中配置DispatcherServlet(核心控制器)攔截;web

默認執行DispatcherServlet中的json

protected void doDispatch(HttpServletRequest req,HttpServletResponse resp) throws Exception{}mvc

此方法中定義了HandlerExecutionChain mapperHandler=null;//處理器執行鏈app

MapperHandler = getHandler(processedRequest);//根據用戶的請求獲取處理器執行jsp

鏈;this

02. 核心控制器請求HandlerMapping(處理器映射器)查找須要的HandlerController)並返回此Handlerspa

進入protected HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{}3d

//在處理器映射器中遍歷查找請求的Handlerorm

for(HandlerMapping hm:this.handlerMappings){ //handlerMappings==>List<HandlerMapping>

//hmList<HandlerMapping>集合中的一個元素==HandlerMapping

   HandlerExecutionChain handler = hm.getHandler(req);

 

繼續跟進HandlerMapping接口的實現類AbstractHandlerMapping類中的

public final HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};

Object handler = getHandlerInternal(req);//獲取要執行的Handler

HandlerExecutionChain executionChain = getHandlerExecutionChain(handler,req);

跟進getHandlerExecutionChain();

For(HandlerInterceptor interceptor : this.adaptedInterceptor){

chain.addInterceptor(interceptor);//添加了一些處理器攔截器

}

由此可知:處理器執行鏈中包含了一個即將執行的handler和一些intercpetor攔截器。

03. 核心控制器DispatcherServlet調用HandlerAdapter(處理器適配器)去執行Handler

通過以上操做,如今核心控制器已經拿到要執行的handler

回到DispatcherServlet中的doDispather方法繼續往下執行;

//獲取處理器適配器,參數爲處理器執行鏈中獲取處理器

HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

跟進protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException{};

//handlerAdapters ==> List<HandlerAdapter>

for(HandlerAdapter ha : this.handlerAdapters){

       …

If(ha.support(handler)){

return ha; //返回須要的處理器適配器 handlerAdapter

}

}

 

跟進 support()方法;

boolean support(Object handler);HandlerAdapter接口中的方法;

此方法有5個實現類;默認執行3個;

webmvcjar包下找到DispatcherServlet.properties配置文件;

默認的處理器映射器/處理器適配器配置爲:

 


04. HandlerController)執行完成後給HandlerAdapter返回ModelAndView

返回到doDispatch方法繼續往下執行;

mv = ha.handler(processedRequest,response,mappedHandler.getHandler());

跟進handler方法所屬接口是HandlerAdapter

handler() 5個實現類;根據DispatcherServlet.properties中配置的順序來執行;

首先進入HttpRequestHandlerAdapter,此類中的handler方法最終將handler向下轉型爲HttpRequestHandler類型,和咱們自定義的Controller無關;

因此繼續執行下一個Adapter

而後進入SimpleControllerHandlerAdapter類中的handler方法,此方法中將handler向下轉型爲Controller類型,正是咱們須要的!(由於咱們自定義的Controller繼承了AbstractController又實現了Controller接口)

觀察handler方法中的代碼:

 


分析以上方法:

01.    只有Controller類型纔有handlerRequest方法

 


02.    AbstractController實現了Controller;

 


返回的handleRequestInternal方法也是AbstractController中的方法;

 


此方法爲抽象方法;觀察它的實現類有:

 


03.    咱們自定義的Controller中的方法名稱是handlerRequestInternal

 


04.因此執行ControllerhandlerRequestInternal方法就是執行HelloController中的handlerRequestInternal方法。

 

05. HandlerAdapter(處理器映射器)向前端核心控制器DispatcherServlet返回ModelAndView;

06. 核心控制器DispatcherServlet請求ResolverView(視圖解析器)進行解析,

將邏輯視圖名解析成真正的視圖對象View(視圖能夠爲jsp,xml,pdf,json…);

07. 視圖解析器(ResolverView)向DispatcherServlet返回View,並使用ModelAndView對象模型數據對View進行視圖渲染;

08. 最終客戶端得到響應消息。

相關文章
相關標籤/搜索