一个旅游网站建设需求,国内网站速度慢,南昌seo排名方案,wordpress的iconPython微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
✿ 阅读源码思路#xff1a;
先跳过非重点#xff0c;深入每个方法#xff0c;进入的时候可以把整个可以理一下方法的执…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执行流程图图片来源于叩丁狼 一、执行流程前的次要源码
● 开始debug的时候对HttpMethod感到好奇点进去查看一下HttpMethod究竟是何物 HttpMethod 是请求方法的枚举类结合咱浏览器地址栏的参数是直接输入可以知道咱的HttpMethod的值是Get 果然咱的HttpMethod的值是Get所以下一步会执行super.service(request, response);ctr进入该方法看一下究竟是何物发现按ctr没有反应【解决重新打开该类的文件】 进入super.service(request, response);内部一探究竟发现这个service方法做的是请求分发操作结合咱的请求方法是GET所以下一步咱是到doGet方法去一探究竟~ 再进入processRequest方法~ 进入发现**重点是doService(request, response);**那咱就进入该方法内部一探究竟吧~ 进入发现**重点是doDispatch(request, response);**那咱就进入该方法内部一探究竟吧~
二、真正的springMVC执行流程的源码分析
1、验证前端控制器接收到客户端的请求后通过处理器映射器handlerMappings根据路径urlPath去匹配选择处理器handler最终返回一个处理器执行链对象HandlerExcutionChain。
● 获取处理器映射器返回处理器执行链对象getHandler(processedRequest);方法
【咱提前了解到的springMVC的执行过程前端控制器接收请求通过处理器映射器寻找处理器返回一个处理器执行链对象】。 ● 发现了 this.handlerMappings 处理器映射器-观察它的值为
[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping40851021]【咱提前了解到的springMVC的执行过程前端控制器接收请求通过处理器映射器寻找处理器返回一个处理器执行链对象】。
● 进入 mapping.getHandler(request); 方法内部 ● 进入返回处理器对象的getHandlerInternal方法内部Object handler lookupHandler(lookupPath, request);
【咱提前了解到的springMVC的执行过程前端控制器接收请求通过处理器映射器依据路径进行匹配来寻找处理器返回一个处理器执行链对象】。
● 进入lookupHandler方法内部验证了通过处理器映射器依据路径进行匹配来寻找处理器。还观察到urlPath的值正是咱配置的处理器的路径 ---- 按照阅读源码观察步骤到这一步你已经理清楚了可以调试回去回去到 …
✿ 至此验证了SpringMVC的执行流程前端控制器接收到客户端的请求后通过处理器映射器handlerMappings根据路径urlPath去匹配选择处理器handler最终返回一个处理器执行链对象HandlerExcutionChain。 2、验证前端控制器通过处理器适配器调用处理器的方法然后处理器执行后返回模型视图对象给处理器适配器适配器再将模型视图对象返回给前端对象.
● 获取处理器适配器对象HandlerAdapter ● 进入getHandlerAdapter获取处理器适配器方法内部
看到了this.handlerAdapters 处理器映射器-观察它的值为 [org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter60038152]
非重点判断与“被修改”相关的非重点前置拦截器相关的
● 进入ha.handle方法内部观察 看到了(Controller) handler -观察它的值为 com.shan.hello.HelloController591b274 执行完((Controller) handler).handleRequest(request, response);即调用咱自己书写的处理器类的方法~返回继续观察发现ModelAndView对象观察它的值 ModelAndView [view/WEB-INF/views/welcome.jsp; model{msg你好easyMVC}] 这个深入进去设置视图名称 非重点后置拦截器 继续观察—观察到处理分发的结果深入进去观察 非重点错误异常相关的重点渲染方法
。。。。。。跟视图有关的重点。。。。。
至此验证了SpringMVC的执行流程前端控制器通过处理器适配器HandlerAdapter调用处理器HelloController的方法然后处理器执行后返回模型视图对象ModelAndView给处理器适配器适配器再将模型视图对象返回给前端控制器. 3、验证前端控制器通过视图解析器将模型视图进行解析然后将模型数据填充到View并渲染到视图然后返回响应.
非重点:国际化非重点视图名称
● 重点渲染视图 观察到返回一个模型对象根据方法调用的先后顺序先调用了view.render(mv.getModelInternal(), request, response);的mv.getModelInternal()方法需要重新深入一次
● 在渲染视图render方法内部观察到mergedModel观察它的值
{msg你好easyMVC}
非重点预响应
● 重点renderMergedOutputModel【符合咱提前了解的SpringMVC的执行流程中渲染视图的数据】 ● 深入发现是将共享数据设置到请求中去 ● 接着往下跳过非重点来到请求转发 至此验证前端控制器通过视图解析器将模型视图进行解析然后将模型数据填充到View并渲染到视图然后返回响应.