springMVC的执行流程

来源:互联网 发布:mac连不上beats solo3 编辑:程序博客网 时间:2024/06/02 05:48

1.用户发起请求

2.DispatherServlet(前端控制器)接受请求,此为整个程序的入口,DispatherServlet调用HandlerMapping(处理器映射器)查找用户路径对应的Handler(处理器).  HandlerMapping有两个实现类,1)RequestMappingHandlerMapping(如果处理器上有@RequestMapping注解,就使用此映射器来查找对应的Handler);2)BeanNameHandlerMapping(如果配置文件里面在bean上配置了beanName,则使用此映射器来查找对应的Handler);   那么映射器是如何查找Handler的呢?简单来说,就是,bean在加载时,会把所有的处理器都加载进去,形成一个Map集合,Map的键即为映射路径,值为对应的Handler,根据用户请求的地址匹配Map中的路径,从而找到对应的Handler.   经过这一系列流程之后,映射器会返回HandlerExecutionChain即处理器执行器链,,包含对应的Handler,和拦截器的集合.此拦截器中,每一个拦截器默认有三个方法pre.post.after.

3.此时前端控制器并不会自己调用Handler,而是找到HandlerAdaptor(处理器适配器)来调用Handler,在是配置调用Handler之前,会首先正序执行拦截器的pre方法,如果所有的pre方法执行完毕并且都返回true,那么再来调用handler处理业务.如果返回false,则会直接逆序调用after方法,结束流程;

4.在Handler处理业务之前,会首先执行参数判断,参数注入等流程,然后真正执行Handler方法.

5.Handler执行完毕之后,会根据不同的返回值选择不同的返回值处理器.1)Handler的返回值为ModelAndView,即使用ModelAndView处理器.此时的view,只是一个视图名称,并不是真正的视图.如果返回值为json数据类型,则使用json的转换器,消息转换器是正序执行. 

6.处理器执行完毕之后,会执行拦截器的post方法(倒序执行).

7.前端控制器会根据返回的ModelAndView中view的名称,调用viewResdver视图解析器返回真正的视图,

8.再利用model对视图进行渲染,返回渲染后的视图,此时会执行拦截器的after方法.

9.前端控制器会把渲染后的视图返回给用户.