流程图
学习SpringMVC有一些日子了 ,到最后看到这张图(感谢尚硅谷),详细介绍了SpringMVC的运行流程。下面我想结合HelloWorld介绍一下在Idea中的运行流程。会附上详细的debug全过程。
项目结构图如下:
1.用户向服务器发送请求,请求被SpringMVC前端控制器DispatcherServlet捕获。
2.DispatcherServlet对请求URL进行解析,判断请求URL对应的映射:
①.映射不存在:
a.在判断是否配置了<mvc:default-servlet-handler>(连同<mvc:annotation-driven>一起配置,否则出错)
b.如果没配置,则控制台报映射查找不到,客户端展示404错误
c.如果有配置,则执行目标资源(一般为静态资源,如:JS,CSS,HTML)
(上图中的断点的标记会在下面的图中给出)
配置了<mvc:default-servlet-handler> 没有配置<mvc:default-servlet-handler>
配置了<mvc:default-servlet-handler>之后DispatcherServlet的handlerMappings中多了一个SimpleUrlHandlerMapping,这个SimpleUrlHandlerMapping回去查找对应的目标资源(该项目中abc.html为静态资源,为验证所用)。
②.映射存在:
执行下面流程
3.根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
4.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter。
下面的这段debug用于解释 3,4.
{
使用debug模式启动整个项目:
1.首先在@Controller标记的类的目标方法中标记断点:
2.点击index页面的helloworld,执行到断点,如下图所示
3.在debugger Frames窗口中,找到如下一行代码:doDispatch(方法):DispatcherServlet(类)
(在debug调试中Frames中的代码执行顺序是从下往上的)
4.在doDispatch方法中找到这一行,并打上断点。该方法中的mappedHandler是HandlerExecution的实例。
5.点开getHandler方法(Ctrl+鼠标左键),在下面的两处打上断点。
第一处断点 可以查看HanlderMappings有多少个HandlerMapping。
第二处断点 可以查看根据哪一个HandlerMapping生成的HandlerExecutionChain实例
6.在getHandler()的下一行打上断点
返回的HandlerExecutionChain实例如下图所示
7.根据HandlerExecutionChain实例,得到HandlerAdapter
}
5.如果成功获得HandlerAdapter后,此时将开始执行preHandler()方法(前提是定义了拦截器)
6.提取request中的模型数据,填充目标方法的入参,开始执行目标方法,处理请求。(可能会用到HttpMessageConveter@RequestBody@ResponseBody,数据类型转换,数据类型格式化(配置FormattingConversionService),数据验证JSR303用hibernate validator实现)
7.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象
8.执行拦截器的postHandle()方法
{
5,6,7,8的断点图如下图所示
}
9.执行processDispatchResult()方法
10.进入processDispatchResult()方法,先判断是否有异常(如果有异常就用handlerExceptionResolver解决),在进行渲染
11.进入render()方法内部通过视图解析器(一般都是InternalResourceViewResolver)解析ModelAndView,从而确定跳转的view。
12.往下走,调用view.render()方法。
13.在view.render()方法中会通过调用AbstractView类中的exposeModelAsRequestAttribute()方法,将ModelAndView中的model放入到request域中
14.最后调用afterCompletion()方法 (该方法在processDispatchResult中)
到此结束。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。