springMVC执行流程附源码

本文详细介绍了SpringMVC的执行流程,从initStrategies的初始化方法到doDispatch的调度过程,包括处理器映射器、处理器适配器的调用,以及视图解析和渲染模型的步骤。通过源码分析,深入理解每个阶段的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


预览图

DispatcherServlet执行流程
图片链接

在这里插入图片描述


一、initStrategies初始化方法

项目启动时会先在initStrategies中初始化一些配置,图中标记了比较重要的几个初始化方法。

在这里插入图片描述

二、doDispatch调度方法

1.调度处理器映射器

在这里插入图片描述

在这里插入图片描述
getHandler方法内部

	@Nullable
	protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		if (this.handlerMappings != null) {
		// 循环查找可以处理的handlerMapping
			for (HandlerMapping mapping : this.handlerMappings) {
			// 返回HandlerExecutionChain 
				HandlerExecutionChain handler = mapping.getHandler(request);
				if (handler != null) {
					return handler;
				}
			}
		}
		return null;
	}

HandlerExecutionChain

public class HandlerExecutionChain {

	private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);

	// 处理器
	private final Object handler;

	@Nullable
	private HandlerInterceptor[] interceptors;
	// 拦截器
	@Nullable
	private List<HandlerInterceptor> interceptorList;

	private int interceptorIndex = -1;

HandlerExecutionChain 类
在这里插入图片描述


2.调度处理器适配器

在这里插入图片描述
获得处理器适配器
在这里插入图片描述
getHandlerAdapter方法内部

	protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
		if (this.handlerAdapters != null) {
		// 寻找可以处理的执行器适配器
			for (HandlerAdapter adapter : this.handlerAdapters) {
				if (adapter.supports(handler)) {
					return adapter;
				}
			}
		}
		throw new ServletException("No adapter for handler [" + handler +
				"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
	}

3.执行处理器

在这里插入图片描述

前置-handle-post
在这里插入图片描述

applyPreHandle方法内部

	boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HandlerInterceptor[] interceptors = getInterceptors();
		if (!ObjectUtils.isEmpty(interceptors)) {
		// 从前到后执行拦截器群的前置方法 i从0开始
			for (int i = 0; i < interceptors.length; i++) {
				HandlerInterceptor interceptor = interceptors[i];
				if (!interceptor.preHandle(request, response, this.handler)) {
					triggerAfterCompletion(request, response, null);
					return false;
				}
				this.interceptorIndex = i;
			}
		}
		return true;
	}

handle实际调用,返回modelAndView

protected ModelAndView handleInternal(HttpServletRequest request,
			HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {

		ModelAndView mav;
		checkRequest(request);

		// Execute invokeHandlerMethod in synchronized block if required.
		if (this.synchronizeOnSession) {
			HttpSession session = request.getSession(false);
			if (session != null) {
				Object mutex = WebUtils.getSessionMutex(session);
				synchronized (mutex) {
					mav = invokeHandlerMethod(request, response, handlerMethod);
				}
			}
			else {
				// No HttpSession available -> no mutex necessary
				mav = invokeHandlerMethod(request, response, handlerMethod);
			}
		}
		else {
			// No synchronization on session demanded at all...
			mav = invokeHandlerMethod(request, response, handlerMethod);
		}

		if (!response.containsHeader(HEADER_CACHE_CONTROL)) {
			if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {
				applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers);
			}
			else {
				prepareResponse(response);
			}
		}

		return mav;
	}

applyPostHandle方法内部

	void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)
			throws Exception {

		HandlerInterceptor[] interceptors = getInterceptors();
		if (!ObjectUtils.isEmpty(interceptors)) {
		// 拦截器的post方法从后往前执行 i从length - 1 到 0
			for (int i = interceptors.length - 1; i >= 0; i--) {
				HandlerInterceptor interceptor = interceptors[i];
				interceptor.postHandle(request, response, this.handler, mv);
			}
		}
	}

4.视图解析器和renderMergedOutputModel

视图解析器
在这里插入图片描述
processDIspatchResult——>AbstractView.render()
在这里插入图片描述

resolveViewName

Alt

	protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
			Locale locale, HttpServletRequest request) throws Exception {

		if (this.viewResolvers != null) {
		// 遍历视图解析器群找到可以处理的视图解析器返回视图
			for (ViewResolver viewResolver : this.viewResolvers) {
				View view = viewResolver.resolveViewName(viewName, locale);
				if (view != null) {
				// 返回视图
					return view;
				}
			}
		}
		return null;
	}

processDIspatchResult——>AbstractView.render()——>renderMergedOutputModel
多个视图解析器自动调用
在这里插入图片描述
processDIspatchResult——>AbstractView.render()——>InternalResourceView.renderMergedOutputModel
在这里插入图片描述

protected void renderMergedOutputModel(
			Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

		// 将model放入request中
		exposeModelAsRequestAttributes(model, request);
		
		exposeHelpers(request);

		String dispatcherPath = prepareForRendering(request, response);

		RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);
		if (rd == null) {
			throw new ServletException("Could not get RequestDispatcher for [" + getUrl() +
					"]: Check that the corresponding file exists within your web application archive!");
		}

		if (useInclude(request, response)) {
			response.setContentType(getContentType());
			if (logger.isDebugEnabled()) {
				logger.debug("Including [" + getUrl() + "]");
			}
			rd.include(request, response);
		}

		else {
		
			if (logger.isDebugEnabled()) {
				logger.debug("Forwarding to [" + getUrl() + "]");
			}
			rd.forward(request, response);
		}
	}

最后由视图jsp等来渲染页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值