spring源码解析-web系列(一):启动
spring源码解析-web系列(二):处理请求的过程
spring源码解析-web系列(三):九大组件之HandlerMapping
spring源码解析-web系列(四):九大组件之HandlerAdapter
spring源码解析-web系列(五):解析请求参数
spring源码解析-web系列(六):九大组件之ViewResolver
spring源码解析-web系列(七):九大组件之HandlerExceptionResolver
转载请标明出处:
https://blog.csdn.net/bingospunky/article/details/97640326
本文出自马彬彬的博客
servlet
在j2ee规范里,处理请求的就是servlet,我们使用spring时,配置的就是DispatcherServlet来处理。当请求来到以后,被DispatcherServlet处理,在DispatcherServle中,找到我们配置的controller、解析参数、处理返回值等。
DispatcherServlet的继承关系也比较简答,DispatcherServlet -> FrameworkServlet -> HttpServletBean。
HttpServletBean
HttpServletBean类很简单,继承HttpServlet,添加了一些对spring环境的支持。
FrameworkServlet
FrameworkServlet里的service、doGet、doPost等一些其他方法都会调用FrameworkServlet.processRequest来处理。在processRequest中,先处理LocaleContext和ServletRequestAttributes和当前线程的关系,然后调用doService方法处理逻辑,最后调用publishRequestHandledEvent方法发送ServletRequestHandledEvent事件。
doService方法被DispatcherServlet覆盖,处理具体逻辑。
DispatcherServlet
1.doService方法也没有直接处理,而是交给了doDispatch,该方法先做了一些准备工作,比如把WebApplicationContext、localeResolver、themeResolver等对象存放到request的Attribute里,以便后续方便使用。
2.doDispatch的流程如下:
图1:
这里注意doDispatch的两层Exception处理,内层是捕获对请求吹过程中的异常,外层是渲染时抛出的异常。
对于内层的异常处理,如果存在合适的HandlerExceptionResolver(@ExceptionHandler注解的方法),则使用HandlerExceptionResolver进行处理,如果没有合适的HandlerExceptionResolver进行处理,则往外抛异常。
对于外层的异常,捕获该异常,做一些相关操作或者new一个新的异常,然后再抛出来,该异常不会被消化掉的,直到抛出到Servlet里,由Tomcat容器来处理。
总结
借用《看透spring mvc源代码分析与实践》里的总结来总结。
图2: