上下文
- servlet对请求的处理一般都是交给service(HttpServletRequest request, HttpServletResponse response)方法。因此定位到DispatcherServlet的service(HttpServletRequest request, HttpServletResponse response)方法(在其父类FrameworkServlet中定义,被继承了)。
FrameworkServlet.service执行逻辑

FrameworkServlet.service.png
- 从源码中可以看到FrameworkServlet.service单独增加了对PATCH请求的处理逻辑,其他类型的请求依旧调用父类HttpServlet的service方法。
HttpServlet.service执行逻辑

HttpServlet.service.png
- 可以看到HttpServlet.service内部对不同的请求类型会分开处理,对应不支持的请求类型直接返回HTTP状态为501
FrameworkServlet.doGet执行逻辑

FrameworkServlet.doGet.png
- 从源码中可以看到get、post、put、delete等请求都是交给processRequest(request, response)方法执行。
FrameworkServlet.processRequest执行逻辑

FrameworkServlet.processRequest.png
- 这个方法前面和后面通过ThreadLoal线程隔离,做的工作是保留现场,请求处理结束后恢复现场。真正处理请求的方法是doService。这个方法在DispatcherServlet中被重写。
DispatcherServlet.doService执行逻辑

DispatcherServlet.doService.png
- 各种属性的添加,处理请求的事情交给doDispatch去完成。
DispatcherServlet.doDispatch执行逻辑

DispatcherServlet.doDispatch.png
- 简单梳理doDispatch的执行流程
- 获取Handler
- 获取Adapter
- 执行applyPreHandle
- 执行handle方法
- 执行applyPostHandle
- 处理返回结果
- 至此,处理请求结束。可以看出spring mvc 执行链非常清晰,具体的请求处理细节交给对应的模块处理。
网友评论