SpringMVC运行流程图解

流程图

学习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中)

 

到此结束。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值