SpringMVC执行流程 - 分析部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFQT1P7i-1587882992069)(en-resource://database/26408:0)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u20vLZXg-1587882992095)(en-resource://database/26058:1)]

流程

DispatcherServlet伪源码

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    
    


				// 1.  找到控制器以及拦截器的一个执行链对象 - 寻找自己的笔记本
				HandlerExecutionChain mappedHandler = getHandler(processedRequest);


				// 2.  控制器对应的适配器   -  寻找笔记本的电源线
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());


				// 3. 使用HandlerExecutionChain里面的拦截器preHandle,获取请求信息
				if (!mappedHandler.applyPreHandle(processedRequest, response)) {
    
    
					return;
				}

				// 4. 通过适配器,控制器方法被执行,并返回 ModelAndView对象(视图地址、数据),如果控制器返回值不是ModelAndView类型,则返回null
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());


				// 5. 默认,通过@RequestMapping的地址赋值给ModelAndView.setName()这个视图地址,如果形参中有ModelAndView且设置了,则使用形参设置的。                
				applyDefaultViewName(processedRequest, mv);
                
                
				//6. 执行拦截器的 PostHandle的方法, 获取请求信息           
				mappedHandler.applyPostHandle(processedRequest, response, mv);
			}

		}
		finally {
    
    
			if (asyncManager.isConcurrentHandlingStarted()) {
    
    
				// 7. 运行执行链中的拦截器的 afterCompletion 获取请求信息
				if (mappedHandler != null) {
    
    
					mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
				}
			}

		}
	}

1. 查找访问路径指定的控制器方法、以及拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z89KrqvR-1587882992102)(en-resource://database/26044:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtKnwtSt-1587882992111)(en-resource://database/26040:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BZ7oqrT-1587882992118)(en-resource://database/26042:1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFqmloZE-1587882992122)(en-resource://database/26046:1)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lhh0NTHq-1587882992131)(en-resource://database/26050:1)]

2. 查找合适的HandlerExecutionChain执行链适配器Adapter

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FS1cEuMh-1587882992134)(en-resource://database/26048:1)]

3. 运行执行链的拦截器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcbuag1r-1587882992138)(en-resource://database/26052:1)]

4. 运行控制器并返回ModelAndView对象

ModelAndView必须要控制器的返回值有才行,没有则null

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFfA5Mei-1587882992142)(en-resource://database/26056:1)]

猜你喜欢

转载自blog.csdn.net/weixin_39651356/article/details/105768624