该方法是处理请求的核心方法,所有请求都会走这个方法
其内部根据HandlerMapping找到映射,
根据HandlerAdapter找到适配器并调用Handler
根据ViewResolver和view返回
#### 开始
1. 请求来的时候根据按道理是根据url获取对应的控制器,但是返回的是HandlerExecutionChain


在HandlerExecutionChain中 可以看到其中包括控制器(handler)和拦截器(interceptors)

在拦截器中 有三个方法 afterCompletion() postHandler() preHandler()

2. 第二步
根据HandlerExecutionChain中的handler获取对应适配器

3. 执行调用handler
ha是适配器,其调用handle方法就是通过反射调用真正的控制器,返回ModeAndView对象
在调用handle之前会调用HandlerExecutionChain的前置处理方法preHandler()
在调用handle之后调用HandlerExecutionChain的后置处理方法postHandler()

在finally中可以看到,直接调用HandlerExecutionChain的afterCompletion() 所以不管是否报错,都会执行该方法.

4. 得到ModeAndView以后通过processDispatchResult()方法对ModeAndView进行处理,如果有异常 那么将异常封装成dispatchException 传入该方法中

先判断是否有异常,如果没有并且ModeAndView不为空 调用render()方法

在方法中判断viewName是否为空 如果是空直接从ModeAndView中直接getView,如果不为空 调用resolveViewName

在resolveViewName中 通过ViewResolver组件 通过viewName获取对应的View进行返回

最后通过view.render解析成html返回

网友评论