Spring MVC 的请求处理流程
根据 Spring MVC 源码, spring-webmvc:5.3.2
- 客户端发送请求
- 经过 Servlet API 的 filter
- 请求到达 DispatcherServlet.DispatcherServlet 控制器按顺序调用每个 HandlerMapping , 直到找到第一个handler。
- HandlerMapping 根据请求调用对应的 Controller 组件处理。获得 HandlerExecutionChain 记为 mappedHandler
- HandlerMapping 负责维护请求和 Controller 组件对应关系。
- HandlerExecutionChain 中包含 handler (HandlerMethod) 和拦截器列表
- RequestMappingHandlerMapping 中的 handler 类型是 HandlerMethod
- 依次调用 handlerAdapters 直到找到一个支持 handler 的 handlerAdapter
- 未找到会报 ServletException
- HandlerAdapter 用于支持不用的 handler, 并对dispatcherServlet 提供统一的执行接口 handler() 方法
- HandlerMethod 对应的HandlerAdapter是 RequestMappingHandlerAdapter
- HandlerExecutionChain 按顺序执行拦截器的 preHandle 方法
- 如果一个拦截器的 preHandle 方法返回了false ,
- 将马上调用所有拦截器的afterCompletion 方法
- 结束请求的处理
- 如果一个拦截器的 preHandle 方法返回了false ,
- 调用 handlerAdapter 的 handle 方法, 执行handler, 并返回ModelAndView
- RequestMappingHandlerAdapter的执行过程
- 绑定用于绑定参数的 WebDataBinderFactory
- 获取model工厂
- 解析方法参数
- 执行方法
- 生成ModelAndView
- RequestMappingHandlerAdapter的执行过程
- HandlerExecutionChain 按顺序执行拦截器的 postHandle 方法
- 处理调度结果, 尝试处理异常, 渲染试图
- 异常处理, 如果有异常, 调用 HandlerExceptionResolver 处理异常 生成ModelAndView
- 如果没找到对应的 HandlerExceptionResolver, 将异常再次抛出
- 之后拦截器将会在 afterCompletion 方法中接收到异常参数
- 渲染handler 返回的视图
- 本地化
- 依次调用 viewResolvers 解析视图
- 如果没有viewName, 直接返回ModelAndView中的view
- view 将视图渲染并写入HttpServletResponse
- handlerExecutionChain 按顺序执行拦截器的 afterCompletion 方法, 无异常
- 请求处理完成
Comments