SpringMVC框架流程复习
springMVC是当下web请求与响应的一个经典流程,作为一名B/S后端java开发,我们没有任何理由不去了解清楚它的详细结构与运转流程.
一、流程图

二、流程描述
1 | 1. 用户发出请求到服务器,前端控制器(dispatcher)拦截到请求,根据请求url去映射器(handlerMapping)去寻找对应的handler(Controller),映射器返回handler. |
三、SpringMVC源码debugger
3.1.准备工作与debugger环境:
1 |
|
3.2.配置文件
1 | <!-- ########## SpringMVC maven 依赖如下 --> |
3.3源码debugger解析
根据web.xml配置文件得到springMVC处理入口前端控制器(DispatcherServlet)

进入DispatcherServlet类中找到doService方法,可以看到其中的this.doDispatch(req, res);这两个地方是dispatcher进行处理的逻辑核心.
1 | protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { |

那么问题来了,如何知道这个doService方法就是我们要找的MVC流程呢?它是在什么时候被调用的?
1 | // DispatcherServlet.java |
DispatcherServlet类从FrameworkServlet类继承,FrameworkServlet类从HttpServletBean类继承,HttpServletBean类从HttpServlet类继承…,顺着继承关系一直找上去不难发现,父类是HttpServlet,那么就要遵守servlet规范,我们知道servlet的生命周期是从被容器加载(例如tomcat)init(),被调用service(),最后执行销毁destroy(),现在我们想知道 DispatcherServlet类中的doService方法是如何在请求响应过程中被调用的顺序,则对其继承的各个父类的生命周期方法进行查找即可.
1 | // DispatcherServlet 父类FrameworkServlet中有对doService()方法的调用,废话不多说,上代码. |
有了调用关系,下面让我们一步一步debugger,查看具体dispatcher是如何处理请求的
1 | 浏览器发送请求到后台 http://localhost:8080/api/hello |

1 | HttpServlet的service方法,调用this.doGet() |

1 | this.doGet使用的是frameworkServlet的doGet |

1 | framework的processRequest方法会调用doService方法 |

1 | Dispatcher的doService设置一些参数之后调用doDispatch() |

1 | 下面的getHandler(req) 方法则是前端控制器根据请求来寻找对应handler的方法. |


1 | 然后委托handlerAdapter处理器解析器去执行对应的handler(Controller),并返回ModelAndView. |


1 | 执行完handler之后,将会调用视图解析器去解析视图,返回View对象. |

1 | 最后则是对数据进行组合填充,进行响应,至此整个SpringMVC的流程源码debugger已经完成了,当然更细节的内容需要我们亲手去debugger. |
