spring_webmvc执行流程

127 阅读2分钟

这算一个高频面试点了,mvc执行流程算发杂的了,我们这里分为三个大步骤进行讲解。

  • DispatcherServlet的初始化阶段
  • 匹配阶段
  • 执行阶段

1.DispatcherServlet的初始化阶段

我们这里就说默认情况下,当web容器处理请求时,第一次用到DispatcherServlet时,此时会对DispatcherServlet初始化。初始化就是对dispatcherServlet对象中的成员变量赋值。也就是我们常说的组件,我们这里只说几个重要的组件,例如MultipartResolver,HandlerMapping,HandlerAdapter,HandlerExceptionResolver,viewResolver

2.匹配阶段

1.当用户的请求都统一的到达dispatcherservlet,首先会遍历所有的HandlerMapping,找到与路径匹配的处理器。(HandlerMapping有多个,不同的HandlerMapping返回的处理器对象不同,谁先匹配,返回谁的。我们这里不用担心,能识别@RequestMapping的HandlerMapping优先级最高,所以可以返回正确的结果)@RequestMapping 返回的处理器对象是HandlerMethod。

2.找到对应的HandlerMethod后,将该处理器和拦截器封装成一个处理器链对象HandlerExecutionChain对象返回。

3.遍历HandlerAdapter,找到可以处理HandlerMethod对象的适配器,进行调用。(Handleradapter也是多个。不同的HandlerAdapter只能处理固定的处理器对象)

3.执行阶段

1.首先会依次执行拦截器的preHandle

2.然后会通过HandlerAdapter调用目标方法。(调用目标方法前:会通过参数解析器进行方法参数的解析。调用目标方法后:会通过返回值处理器对返回的结果进行处理。)

3.我们这里分为两步。

  • 3.1 当执行方法过程中没有异常。
    • 返回统一的ModelAndView对象,这个返回结果是统一的结果。然后执行拦截器的postHandle方法,然后通过ViewResolver解析视图,得到视图对象,进行视图渲染
  • 3.2 当执行方法过程中有异常
    • 进入HandlerExceptionResolver进行处理

4.不管有无异常 最后都会执行拦截器的afterCompletion方法

着重说下特殊情况,当方法加了@ResponseBody注解,在第二部执行方法返回结果的时候,就会处理成json作为最终结果,并标记ModelAndView已处理。那么就不会再进行第三步的视图渲染过程。

本文使用 文章同步助手 同步