spring源码解析-web系列(二):处理请求的过程

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:

https://qingtian-blog.oss-cn-beijing.aliyuncs.com/spring%20web%20%E7%B3%BB%E5%88%972%EF%BC%9A%E5%A4%84%E7%90%86%E8%AF%B7%E6%B1%82%E7%9A%84%E8%BF%87%E7%A8%8B_1.png

这里注意doDispatch的两层Exception处理,内层是捕获对请求吹过程中的异常,外层是渲染时抛出的异常。

对于内层的异常处理,如果存在合适的HandlerExceptionResolver(@ExceptionHandler注解的方法),则使用HandlerExceptionResolver进行处理,如果没有合适的HandlerExceptionResolver进行处理,则往外抛异常。

对于外层的异常,捕获该异常,做一些相关操作或者new一个新的异常,然后再抛出来,该异常不会被消化掉的,直到抛出到Servlet里,由Tomcat容器来处理。

总结

借用《看透spring mvc源代码分析与实践》里的总结来总结。

图2:

https://qingtian-blog.oss-cn-beijing.aliyuncs.com/spring%20web%20%E7%B3%BB%E5%88%972%EF%BC%9A%E5%A4%84%E7%90%86%E8%AF%B7%E6%B1%82%E7%9A%84%E8%BF%87%E7%A8%8B_2.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章