在springMVC的核心组件DispatcherServlet与原始的Servlet对接完成后,会进入自己的doDispatcher方法。在该方法中,会执行所有的请求处理操作,包括请求分发、响应处理等核心操作。
2. 1请求分发流程概述
阅读doDispatcher方法源码,可分为11个处理逻辑,每一个处理逻辑都会涉及一些SpringMVC的组件,这11个处理逻辑如下:
- 预处理多块请求。
- 获取请求处理器。
- 查找处理适配器。
- 处理HTTP缓存。
- 执行前置拦截器链。
- 处理适配器执行。
- 返回值视图名处理。
- 执行后置拦截器链。
- 处理返回值与响应。
- 执行完成拦截器链。
- 清理资源。
源码如下:
/**
* 执行请求分发到处理器
*
* 处理器通过当前应用中初始化的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
SpringMVC请求处理流程详解

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

被折叠的 条评论
为什么被折叠?



