2、SpringMVC源码分析-DispatcherServlet执行流程

SpringMVC请求处理流程详解
本文深入剖析了SpringMVC的请求处理流程,从doDispatch方法开始,详细介绍了预处理多块请求、查找请求处理器、获取处理适配器、执行前置拦截器链等11个关键步骤。在预处理多块请求中,通过MultipartResolver判断并转换请求。查找请求处理器时,SpringMVC使用处理器映射寻找合适的处理器执行链。获取处理适配器阶段,根据处理器类型选择相应的HandlerAdapter。执行前置拦截器链时,若任一拦截器preHandle方法返回false,请求处理将提前结束。这些步骤揭示了SpringMVC如何高效、灵活地处理HTTP请求。

在springMVC的核心组件DispatcherServlet与原始的Servlet对接完成后,会进入自己的doDispatcher方法。在该方法中,会执行所有的请求处理操作,包括请求分发、响应处理等核心操作。

2. 1请求分发流程概述

阅读doDispatcher方法源码,可分为11个处理逻辑,每一个处理逻辑都会涉及一些SpringMVC的组件,这11个处理逻辑如下:

  1. 预处理多块请求。
  2. 获取请求处理器。
  3. 查找处理适配器。
  4. 处理HTTP缓存。
  5. 执行前置拦截器链。
  6. 处理适配器执行。
  7. 返回值视图名处理。
  8. 执行后置拦截器链。
  9. 处理返回值与响应。
  10. 执行完成拦截器链。
  11. 清理资源。

源码如下:

/**
	 * 执行请求分发到处理器
	 *
	 * 处理器通过当前应用中初始化的HandlerMapping处理器映射列表按顺序获取处理器。
	 * 通过当前应用中初始化的HandlerAdapter处理适配器列表,获取支持当前请求处理器的处理适配器。
	 * 该方法处理可处理的所有请求方法。对于一些特殊的请求方法如Options等,响应需要做额外的一些适配操作,该适配操作交给请求处理器与处理适配器的逻辑去处理。
	 *
	 * @param request 当前HTTP请求
	 * @param response 当前HTTP响应
	 * @throws Exception 出现任何类型的处理失败
	 */
	protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 定义一个已处理请求,指向参数中的request,已处理请求后续可能改变
		HttpServletRequest processedRequest = request;
		// 定义处理器执行链,内部封装拦截器列表与处理器
		HandlerExecutionChain mappedHandler = null;
		// 是否是多块请求,默认为否
		boolean multipartRequestParsed = false;
		// 获取与当前请求关联的异步管理器,用于执行异步操作
		WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

		try {
			// 用于保存处理适配器执行处理器后的返回结果
			ModelAndView mv = null;
			// 用于保存处理过程中发生的异常
			Exception dispatchException = null;

			try {
				// 1.检查多块请求,如果是多块请求,则返回一个新的请求,processedRequest保存这个新的请求引用;否则返回原始请求。
				processedRequest = checkMultipart(request);
				//判断两者是否是同一个引用,如果是则说明为多块请求,且已经处理,此变量为true
				multipartRequestParsed = (processedRequest != request);

				// Determine handler for the current request.
				// 2.获取可处理当前请求的请求处理器,通过HandlerMapping查找,请求处理器中封装了拦截器链和对应的处理器,可以是具体的处理器方法
				mappedHandler = getHandler(processedRequest);
				// 如果没有,则执行没有处理器逻辑
				if (mappedHandler == null) {
					// 内部逻辑判断配置throwExceptionIfNoHandlerFound是否为ture,如果为true则抛出异常,否则直接设置响应内容为404
					// 可通过spring.mvc.throwExceptionIfNoHandlerFound设置其值,默认为false
					noHandlerFound(processedRequest, response);
					return;
				}

				// Determine handler adapter for the current request.
				// 3.根据当前请求的处理器获取支持该处理器的处理适配器
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

				// Process last-modified header, if supported 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值