DispatcherServlet 请求处理流程

49 篇文章 1 订阅

子容器创建完成后,当有请求到来时,DispatcherServlet就可以进行分发处理了。我们首先根据Servlet规范查找doService()方法,这个方法在DispatcherServlet本身就有实现:

@Override protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// ... ... 
	try { 
		doDispatch(request, response); 
	} finally { 
		// ... ... 
	}

我们省去了无关代码,于是可以明显看出doDispatch()才是分发请求的主要实现方法:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { 
	HttpServletRequest processedRequest = request; 
	HandlerExecutionChain mappedHandler = null; 
	boolean multipartRequestParsed = false; 
	WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); 
	try { 
		ModelAndView mv = null; 
		Exception dispatchException = null; 
		try { 
			// 查检是否是文件上传请求 
			processedRequest = checkMultipart(request); 
			multipartRequestParsed = (processedRequest != request); 
			// 查找能够处理当前请求的Handler 
			mappedHandler = getHandler(processedRequest); 
			if (mappedHandler == null || mappedHandler.getHandler() == null) { 
				noHandlerFound(processedRequest, response); 
				return; 
			} 
			// 查找能够处理当前请求的Handler 
			Adapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); 
			// ... ... 
			// 拦截器的preHandle()方法就是在这里被调用的 
			// 可见,如果preHandle()方法返回false,则终止分发流程,直接返回 
			if (!mappedHandler.applyPreHandle(processedRequest, response)) { 
				return; 
			} try { 
				// 这一行是对我们写的Controller方法的真正调用 
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 
			} finally { 
				if (asyncManager.isConcurrentHandlingStarted()) { 
					return; 
					} 
				} 
				applyDefaultViewName(request, mv); 
				// 拦截器的postHandle()方法就是在这里被调用的,即在Controller调用完成之后 
				mappedHandler.applyPostHandle(processedRequest, response, mv); 
			} catch (Exception ex) { 
				dispatchException = ex; 
			} 
			processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); 
		} catch (Exception ex) { 
			// ... ... 
		} finally { 
			// ... ... 
		} 
	}

分析到这里,DispatcherServlet的分发请求处理流程就一目了然了。

版权声明:本文为博主原创文章,转载请注明出处和原作者。https://blog.csdn.net/neosmith/article/details/44206671

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值