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; // Determine handler for the current request. mappedHandler = getHandler(processedRequest, false); if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } // Determine handler adapter for the current request. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // Process last-modified header, if supported by the handler. String method = request.getMethod(); boolean isGet = "GET".equals(method); if (isGet || "HEAD".equals(method)) { long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); if (logger.isDebugEnabled()) { String requestUri = urlPathHelper.getRequestUri(request); logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified); } if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) { return; } } if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } try { // Actually invoke the handler. mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); } finally { if (asyncManager.isConcurrentHandlingStarted()) { return; } } applyDefaultViewName(request, mv); mappedHandler.applyPostHandle(processedRequest, response, mv); } catch (Exception ex) { dispatchException = ex; } processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } catch (Exception ex) { triggerAfterCompletion(processedRequest, response, mappedHandler, ex); } catch (Error err) { triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err); } finally { if (asyncManager.isConcurrentHandlingStarted()) { // Instead of postHandle and afterCompletion mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); return; } // Clean up any resources used by a multipart request. if (multipartRequestParsed) { cleanupMultipart(processedRequest); } } }
请直接跳到24行,24行前的代码没有变化,我们可以看到的是检查是否是多媒体request,然后找到对应requet的handler,24行直接进行了supported handlerAdapter的查找(区别请看我的第一篇springMVC源代码札记)
boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception { if (getInterceptors() != null) { for (int i = 0; i < getInterceptors().length; i++) { HandlerInterceptor interceptor = getInterceptors()[i]; if (!interceptor.preHandle(request, response, this.handler)) { triggerAfterCompletion(request, response, null); return false; } this.interceptorIndex = i; } } return true; }
interceptor 被置于后面的方法中,在这方法之前做的是关于GET处理请求的东西,我还没有仔细理解,稍后再看
applyDefaultViewName(request, mv); mappedHandler.applyPostHandle(processedRequest, response, mv);
都是将之前的代码封装了起来 可以对比着第一篇看
if (mv != null && !mv.wasCleared()) { render(mv, request, response); if (errorView) { WebUtils.clearErrorRequestAttributes(request); } }
则是被放入了
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
相关推荐
springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析springMvc源码分析
在学习过程中,你可以逐步理解 Spring MVC 的组件和工作原理,掌握如何使用 Hibernate 进行数据库操作,并最终通过实际项目来巩固所学知识。这个压缩包是初学者宝贵的参考资料,有助于快速入门 Java Web 开发。
Spring源码学习九:DispatcherServlet初始化源码分析1 DispatcherServlet是SpringMVC的核心分发器,它实现了请求分发,是处理请求的入口,本篇将深入源码分析它的初始化过程。 首先,从DispatcherServlet的名称上...
在源码学习过程中,你可能会遇到以下关键类和接口:`RequestMappingHandlerMapping`, `RequestMappingHandlerAdapter`, `SimpleControllerHandlerAdapter`, `ModelAndView`, `DefaultListableBeanFactory`, `Bean...
1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...
分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析...
分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析...
《看透SpringMVC源代码分析与实践》这...总的来说,深入学习SpringMVC源码能够提升我们的技术水平,使我们在面对复杂业务场景时更有信心。《看透SpringMVC源代码分析与实践》这本书无疑是实现这一目标的重要参考资料。
在本文中,我们将深入探讨`DispatcherServlet`的初始化流程,这是SpringMVC的核心组件。`DispatcherServlet`扮演着中央调度者的角色,负责接收请求、解析请求信息,并调用合适的控制器进行业务逻辑处理。 首先,让...
在本压缩包 "springmvc源码测试代码" 中,我们可能找到了用于理解和学习 Spring MVC 源码的测试代码。这里我们将深入探讨 Spring MVC 的核心概念、工作流程以及如何通过测试代码来理解其实现。 首先,Spring MVC 的...
【SpringMVC源码剖析(二)- DispatcherServlet的前世今生1】 在Spring MVC框架中,DispatcherServlet扮演着至关重要的角色,它是整个框架的核心。本文将深入探讨DispatcherServlet的两个核心设计原则及其在Spring ...
在源码分析中,我们可以看到如何通过@SpringBootApplication注解启动SpringBoot应用,以及AutoConfiguration类是如何根据项目依赖自动配置Bean的。 要熟练掌握这三个框架,你需要理解以下关键概念: 1. Bean的生命...
在源码中,你可以看到这些核心组件的实现细节,比如DispatcherServlet如何解析请求、HandlerMapping如何查找映射、ViewResolver如何解析视图。阅读源码有助于理解Spring MVC的工作机制,提高问题排查能力,也能启发...
通过尚硅谷的SpringMVC源码分析,开发者可以更深入地了解SpringMVC的内部机制,如DispatcherServlet、HandlerAdapter、ModelAndView的实现细节,以及AOP、IOC容器在SpringMVC中的应用。源码学习有助于提升对框架原理...
SpringMVC是Spring框架的一部分,专门用于处理Web应用程序...通过深入学习和分析这些源码,你将能够更好地理解SpringMVC的工作原理,从而在实际项目中更有效地利用它。此外,这也有助于提升你在Web开发领域的专业技能。
本压缩包包含SpringMVC的源码,对于学习和理解SpringMVC的工作原理及其内部机制非常有价值。 1. **DispatcherServlet**:SpringMVC的核心组件,它作为前端控制器,负责接收HTTP请求,并根据请求信息(如URL、HTTP...
在这个"SpringMVC简单源码实现"中,我们将会深入探讨SpringMVC的核心机制,包括请求处理、模型视图解析以及依赖注入等方面。 1. **请求处理流程**: 当一个HTTP请求到达SpringMVC应用时,它首先由前端控制器`...
SpringMVC源码jar包,方便查看源码。学习起来更加方便
DispatcherServlet 首先是一个 Servlet,Servlet 有自己的生命周期的方法(init、destory 等),那么我们在看 DispatcherServlet 初始化时首先需要看源码中 DispatcherServlet 的类结构设计。 DispatcherServlet 的...