SpringMVC工作原理(源码分析)

Spring源码分析

我以下呢 就模拟一个请求 从代码上 简单说说 SpringMVC一个请求得流程

先来个图


当一个请求(request)过来,进入DispatcherServlet中,里面有个方法叫 doDispatch方法 里面包含了核心流程

源码如下:

然后往下看:(DispatcherServlet.java)

mapperHandler是  HandlerExecutionChain (处理器调用链) 

HandlerExecutionChain 包含了 处理器对象 以及和处理器相关的 拦截器。 有目标方法 和 Handler


HandlerMapping 获取HandlerExecutionChina对象 源码的1120行(DispatcherServlet.java)。

这里 1115行的 Handlermapping 定义了请求到处理器之间的映射   请求找到处理器 就需要用到HandlerMapping


上面的代码执行完 后 又返回到 932行 继续执行 

这里将出现三种 情况:

一、当请求的url路径不存在时(没有对应的requestmapping注解方法)

如果发的请求的映射是空的。返回的HandlerExecutionChain  mappedHandler对象为空表示没有对应的映射 执行noHandlerFound方法


经过这个方法  表示没有页面 并且 会进入404 错误页面。

二、 当请求的路径url不存在时(没有对应的requestmapping注解方法),applicationcontext.xml中存在以下注解时:

经过上面的配置 则 getHandler()  不是null 因为 加上以上的配置,会调用SimpleUrlHandlerMapping 去寻找本地的静态资源,如css js 等 但是 同样的路径不存在 跳转到404页面


三、如果存在映射,继续执行之后的代码:

 执行到上面这行:

HandlerAdapter(Handler适配器)

这个类 进行了 很多操作,比如表单到实体Bean的赋值,通过Binner进行了 数据的绑定。

继续执行:954行

这里呢 底层 调用了拦截器的 PreHandle方法,如图:

然后继续执行 到 代码 959行(DispatcherServlet.java)

这里呢就返回了一个ModelAndView,如果所示.

随后代码继续执行  调用了 拦截器的 PostHandler方法 ,然后调用 ProcessDispatchResult方法,如下图:

继续执行

然后继续执行 一直到 代码的 1027行(DisPatcherServlet.java)

这里就是已经在渲染视图了render() 方法

这里 通过在applicationcontext.xml中配置的视图解析器 进行了引用 然后将页面进行了转发,

上面的 rd.forward 就是进行了转发  然后整个流程就已经走完了!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值