DispatcherServlet
是 Spring MVC 框架中的核心组件之一,负责接收所有进入的 HTTP 请求,并将它们分发到适当的处理器(通常是控制器)。doDispatch()
方法是 DispatcherServlet
类中处理请求的核心方法。
主要流程
获取或创建
HandlerExecutionChain
:- 首先,
DispatcherServlet
会尝试找到一个适合当前请求的处理器(Handler),这通常是一个控制器方法。 - 它通过调用
getHandler(HttpServletRequest request)
来查找处理器和对应的拦截器链(Interceptor Chain),返回的是HandlerExecutionChain
对象。
- 首先,
预处理:
- 如果存在拦截器链,
DispatcherServlet
会调用这些拦截器的preHandle()
方法。如果任何一个拦截器返回false
,则表示请求被拦截,不会继续处理。
- 如果存在拦截器链,
获取
HandlerAdapter
:- 接下来,
DispatcherServlet
调用getHandlerAdapter(Object handler)
方法来获取能够执行该处理器的适配器(HandlerAdapter)。Spring MVC 使用适配器模式来支持多种类型的处理器。
- 接下来,
应用
HandlerExceptionResolver
:- 在实际调用处理器之前,如果有异常发生,
DispatcherServlet
会尝试使用HandlerExceptionResolver
来解决异常。
- 在实际调用处理器之前,如果有异常发生,
调用处理器:
- 然后,
DispatcherServlet
会调用HandlerAdapter
的handle()
方法来真正执行处理器逻辑。这是用户自定义业务逻辑所在的地方。
- 然后,
后处理:
- 处理完成后,
DispatcherServlet
会再次遍历拦截器链,这次是调用它们的postHandle()
方法。这允许拦截器在视图渲染前进行额外的操作。
- 处理完成后,
渲染视图:
- 如果处理器返回了一个
ModelAndView
对象,则DispatcherServlet
会根据它来选择合适的视图进行渲染。这涉及到ViewResolver
组件的选择与使用。
- 如果处理器返回了一个
异常处理:
- 如果在整个过程中抛出了未捕获的异常,
DispatcherServlet
会尝试使用HandlerExceptionResolver
来解析异常,生成错误页面或者响应信息。
- 如果在整个过程中抛出了未捕获的异常,
完成请求:
- 最后,
DispatcherServlet
会调用拦截器链中的afterCompletion()
方法,标志着整个请求处理过程结束。
- 最后,
关键点解析
- 处理器映射 (HandlerMapping): 定义了如何将 URL 映射到具体的处理器。
- 处理器适配器 (HandlerAdapter): 提供了一种机制,使得不同类型的处理器可以按照统一的方式被调用。
- 视图解析器 (ViewResolver): 决定了如何把逻辑视图名称转换成实际的视图对象。
- 拦截器 (Interceptor): 可以在请求的不同阶段插入自定义逻辑,比如权限检查、日志记录等。
注意事项
doDispatch()
方法内部包含了大量的空检查和其他边界条件处理,确保即使在某些情况下没有配置特定的组件(如HandlerMapping
或HandlerAdapter
),也不会导致程序崩溃。- 这个方法还处理了各种异常情况,保证了系统的健壮性。