1、 用户发送请求至前端控制器DispatcherServlet。
DispatcherServlet工作原理:它重写父类FrameworkServlet的doService方法,doService中主要设置了一些属性和调用doDispatch方法,doDispatch用来做分发请求和流程控制doDispatch方法解析2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
这一步会调用getHander返回一个HandlerExecutionChain包含处理器和处理器拦截器4、 DispatcherServlet调用HandlerAdapter处理器适配器。
获取适配器是通过遍历handlerAdapters列表找的,HandlerAdapter包含了3个方法.
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
处理器适配器中在applyPreHandle中会遍历该HandlerExecutionChain中所有的拦截器,然后使用拦截器通过preHandle对handler进行预处理,如果所有的拦截器都能处理那就会继续往下执行,如果一旦有一个拦截器不能处理,就没必要往下走了,那就会触发triggerAfterCompletion方法,在triggerAfterCompletion中它是倒序遍历的拦截器的,执行完triggerAfterCompletion返回false之后doDispatch这个方法就执行结束了,下面的八、九、十、十一就不再执行。从第五步括号里的备注也能猜出来HandlerExecutionChain.handler处理器是什么,它可以是Controller。8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
注意: 渲染视图是前端控制器做的而不是视图解析器11、 DispatcherServlet响应用户。