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),也不会导致程序崩溃。- 这个方法还处理了各种异常情况,保证了系统的健壮性。
