【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

虚幻大学 xuhss 446℃ 0评论
文章目录 显示

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

✿ 阅读源码思路:

先跳过非重点,深入每个方法,进入的时候可以把整个可以理一下方法的执行步骤理一下,也可以,理到某一步,继续深入,回来后,接着理清除下面的步骤。

✿ 阅读本文的准备工作,预习一下SpringMVC的执行流程

■ 解释一下,为什么标题是验证SpringMVC执行流程:

  不知道小伙伴有没有做过物理实验的验证实验,道理是一样的,举个高中生都做过的物理实验吧----自由落体实验,这个实验是通过小钢球做抛物运动,验证重力加速度的g值是9.8。对于本文,咱的做法是通过调试来验证SpringMVC的执行流程是:

1、前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。

2、前端控制器通过处理器适配器,调用处理器的方法,然后处理器执行后返回模型视图对象给处理器适配器,适配器再将模型视图对象返回给前端对象。

3、前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应。

? SpirngMVC执行流程图(图片来源于叩丁狼)

d806472a7ca9eca637b6d6c66a757187 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

一、执行流程前的次要源码

● 开始debug的时候,对HttpMethod感到好奇,点进去查看一下HttpMethod究竟是何物?

2e978d9222a4b70d944da07f01e125d1 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • HttpMethod 是请求方法的枚举类,结合咱浏览器地址栏的参数是直接输入,可以知道咱的HttpMethod的值是Get
    4efecc9783c4afa6194f71973ae9d611 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 果然咱的HttpMethod的值是Get,所以下一步会执行super.service(request, response);
  • ctr进入该方法看一下,究竟是何物,发现按ctr没有反应解决:重新打开该类的文件
    e88697b18e29a6dfe0393ed352e77769 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 进入super.service(request, response);内部一探究竟:
  • 发现这个service方法做的是请求分发操作,结合咱的请求方法是GET,所以下一步咱是到doGet方法去一探究竟~
    9453e231a32d6770094c20f0143eb8aa - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 再进入processRequest方法~
    f8cd71ab24b58f3f7d7a172baee5485a - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 进入发现重点是doService(request, response);那咱就进入该方法内部一探究竟吧~
    3ee22518a8b84efb055c39bdc9fc0c61 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 进入发现重点是doDispatch(request, response);那咱就进入该方法内部一探究竟吧~
    cdb626df4f3ff32ca4d9242b24ee4eed - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

二、真正的springMVC执行流程的源码分析

1、验证:前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。

● 获取处理器映射器返回处理器执行链对象,getHandler(processedRequest);方法

【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器寻找处理器,返回一个处理器执行链对象】。

24ff1335e3dcc469ea84850474408a93 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 发现了 this.handlerMappings 处理器映射器-观察它的值为:

[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@40851021]【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器寻找处理器,返回一个处理器执行链对象】。
33a499e015ebeebd47c232cd539689cb - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 进入 mapping.getHandler(request); 方法内部:

a1c4fb1367e5b10b6e5f0ce03e6c686a - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 进入返回处理器对象的getHandlerInternal方法内部:Object handler = lookupHandler(lookupPath, request);

【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器依据路径进行匹配来寻找处理器,返回一个处理器执行链对象】。
72095efaa8e58434f9ec23a3aa5d71cf - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 进入lookupHandler方法内部:验证了通过处理器映射器依据路径进行匹配来寻找处理器。还观察到urlPath的值,正是咱配置的处理器的路径

1dd162cec55e6a8fc280ace87f8af86c - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
9b8d7fc8eb6860da1fcd476d8424bec4 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

---- 按照阅读源码观察步骤,到这一步,你已经理清楚了,可以调试回去,回去到:

25f8463e6f4dbf71a6dc0238dec8673f - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
......

✿ 至此,验证了SpringMVC的执行流程:前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。


2、验证:前端控制器通过处理器适配器,调用处理器的方法,然后处理器执行后返回模型视图对象给处理器适配器,适配器再将模型视图对象返回给前端对象.

● 获取处理器适配器对象HandlerAdapter

089e617d4123f7b4ad378a7deaab8da9 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 进入getHandlerAdapter获取处理器适配器方法内部:

看到了this.handlerAdapters 处理器映射器-观察它的值为:
[org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@60038152]
7540275c8545ed2c06741876cef5705e - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • 非重点:判断与“被修改”相关的
  • 非重点:前置拦截器相关的
    d0a5af6114d71763b83110de553f28ca - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 进入ha.handle方法内部观察:

84c8e442386c557e8bc13a5c867dcfa9 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • 看到了(Controller) handler -观察它的值为:
    com.shan.hello.HelloController@591b274

0b0765804e6c1b73976c1b739ebff85d - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

60007e646ccc1fb04f2c16940a8968d2 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • 执行完((Controller) handler).handleRequest(request, response);即调用咱自己书写的处理器类的方法~`
  • 返回,继续观察,发现ModelAndView对象,观察它的值
    ModelAndView [view="/WEB-INF/views/welcome.jsp"; model={msg=你好,easyMVC}]
    aae1e22d83ea290aba7a17455f8dacea - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 这个深入进去,设置视图名称
    1fd1744114b58cc4ffae316d52efdccd - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 非重点:后置拦截器
    ad7cb81448bf5b7e41441b0e42da3bdb - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 继续观察---观察到:处理分发的结果,深入进去观察:
    fccbd2c2af8586cd4b641305f7f7d5ae - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
  • 非重点:错误异常相关的
  • 重点:渲染方法
    66b6cfafdce7b88ded8df66f3bb3ef89 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

。。。。。。跟视图有关的重点。。。。。

至此,验证了SpringMVC的执行流程:前端控制器通过处理器适配器HandlerAdapter,调用处理器HelloController的方法,然后处理器执行后返回模型视图对象ModelAndView给处理器适配器,适配器再将模型视图对象返回给前端控制器.


3、验证:前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应.

  • 非重点:国际化
  • 非重点:视图名称
    9ac7c254455f12bfb0b61968b68df52f - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 重点:渲染视图

a8ce775bf16dca6b807bb2ba94efc3c4 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
1de2181477ff1f491d36e6b7a9ea1e35 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • 观察到返回一个模型对象,根据方法调用的先后顺序,先调用了view.render(mv.getModelInternal(), request, response);的mv.getModelInternal()方法,需要重新深入一次
    c9ad8fb6003892cbac61277db2e0efa7 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
    7486a0068495dc7a2162b03a5a49063e - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 在渲染视图render方法内部,观察到mergedModel,观察它的值:

{msg=你好,easyMVC}
355ce80066eb7d62de40236d403094cc - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

  • 非重点:预响应

● 重点:renderMergedOutputModel【符合咱提前了解的SpringMVC的执行流程中渲染视图的数据】

3914e8729ce44f783a12e8ad6ff1787d - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 深入,发现是将共享数据设置到请求中去

b3521254683e843210f96c8957db7fa8 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

● 接着往下,跳过非重点,来到请求转发

5b9ae8eb522a0fe73a71ebb8ac473974 - 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

至此,验证:前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应.

转载请注明:xuhss » 【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程

喜欢 (0)

您必须 登录 才能发表评论!