SpringMVC运行流程图解

在这里插入图片描述

源码分析

  • 在整个SpringMVC运行流程之中,有以下几位重要角色

    1. 主角:DispatcherServlet—负责大部分工作的调用
    2. 主角的小弟之一:InternalResourceViewResolver—负责将逻辑视图转换为真实视图
    3. 小弟之二:HandlerMapping—暂时不太理解
    4. 小弟之四:HandlerAdapter—控制各种适配器将请求参数转换为目标方法的入参
  • 故事开始

  • 一个HelloWorld方法,使用@RequestMapping注解映射的请求路径为:/sayHelloWorld

  • 方法中接收一个"info"的请求参数,使用@RequestParam 注解为参数赋值.

  • 方法的返回值是一个ModelAndView 对象,要跳转的jsp页面为:helloworld.jsp

在这里插入图片描述

  • 此时页面表单中发送了一个请求给sayHelloWorld()方法

在这里插入图片描述

  • 因为此时请求的路径存在,所以程序走到了DispatcherServlet类中doDispatch()方法,在该方法中,首先进行对HandlerAdpater对象赋值

在这里插入图片描述

  • 赋值完之后,ha对象中有了许多的类型转换器,看来是要对请求参数进行类型转换

在这里插入图片描述

  • 接着走到了444行上,此时程序准备执行各个拦截器的preHandle()方法,如果一旦有一个拦截器的preHandle()方法返回false,那么程序将会直接return结束,故事就要结束了.

  • 好在并没有一个拦截器返回false
    在这里插入图片描述

  • 接着走到了448行代码上,执行了handle()方法,得到了ModelAndView对象.

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

在这里插入图片描述

  • 接着程序跳回到了 sayHelloWorld()方法这,也就是说,handle()方法就是请求的目标方法

在这里插入图片描述

  • 执行完目标方法之后,现在程序又调回到了DispatcherServlet类中的第454行
  • 程序此时准备执行拦截器的postHandle()方法

在这里插入图片描述

  • 由于此时程序类有任何异常所以正常执行到了461行,
  • 此时准备执行善后工作了
this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);

在这里插入图片描述

  • 接着进入到了processDispatchResult()方法体内,方法中一开始判断目标方法执行过程中是否产生异常进行判断,如果有异常则会重新初始化ModelAndView对象

在这里插入图片描述

  • 由于此时没有任何异常,所以到了processDispatchResult()方法中的第501行,开始执行render()方法

  • render()方法对视图进行渲染,根据本地设置的语言,获取最终的view对象,这个对象中包含着跳转的路径信息
    在这里插入图片描述

在这里插入图片描述

  • 当完成之后,开始要执行拦截器的afterCompletion()方法

在这里插入图片描述

  • 当一切结束之后,页面成功跳转到目标页面

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值