欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC执行流程 - 分析部分

程序员文章站 2022-05-20 14:27:13
...

SpringMVC执行流程 - 分析部分

SpringMVC执行流程 - 分析部分

流程

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. 查找访问路径指定的控制器方法、以及拦截器

SpringMVC执行流程 - 分析部分

SpringMVC执行流程 - 分析部分

SpringMVC执行流程 - 分析部分

SpringMVC执行流程 - 分析部分


SpringMVC执行流程 - 分析部分

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

SpringMVC执行流程 - 分析部分

3. 运行执行链的拦截器

SpringMVC执行流程 - 分析部分

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

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

SpringMVC执行流程 - 分析部分