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(處理器映射器)查找須要的Handler(Controller)並返回此Handler;spa
進入protected HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};3d
//在處理器映射器中遍歷查找請求的Handlerorm
for(HandlerMapping hm:this.handlerMappings){ //handlerMappings==>List<HandlerMapping>
//hm是List<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個;
在webmvc的jar包下找到DispatcherServlet.properties配置文件;
默認的處理器映射器/處理器適配器配置爲:
04. Handler(Controller)執行完成後給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.因此執行Controller的handlerRequestInternal方法就是執行HelloController中的handlerRequestInternal方法。
05. HandlerAdapter(處理器映射器)向前端核心控制器DispatcherServlet返回ModelAndView;
06. 核心控制器DispatcherServlet請求ResolverView(視圖解析器)進行解析,
將邏輯視圖名解析成真正的視圖對象View(視圖能夠爲jsp,xml,pdf,json…);
07. 視圖解析器(ResolverView)向DispatcherServlet返回View,並使用ModelAndView對象模型數據對View進行視圖渲染;
08. 最終客戶端得到響應消息。