springMVC源码解读

web.xml找到前端控制器:DispatcherServlet
继承关系
可以看到底层是HttpServlet,最底层为Servlet,所以我们找service方法
service方法
找到FrameworkServlet的service
在这里插入图片描述
要不走父类(HTTPServlet)的service,要不走processRequest方法;
我们知道,HTTPServlet最终调用的是doget或者dopost之类的方法,而FrameworkServlet重新了这些方法,最终还是调用了processRequest方法;
在这里插入图片描述
processRequest调用了doService方法:这个方法是个抽象方法
找到他的实现类DispatcherService:它重写了这个方法
这个方法前面都是添加请求域和一些关于日志的方法
到最后调用了doDispatch方法:
在这里插入图片描述
这个方法便是springmvc执行服务的顶层方法:在这里插入图片描述
这个方法往下走
在这里插入图片描述
先看处理器映射器:
在这里插入图片描述
第一次调用getHandler传入的是一个processedRequest,
这个processedRequest调用了一个方法checkMultipart
在这里插入图片描述
我们可以看到,这个方法,其实也是一些判断和日志相关代码,最终返回的还是HttpRequest。
在这里插入图片描述
所以这里可以忽略;
再看看调用的这个方法;
这个方法遍历了一个handlerMappings
在这里插入图片描述
这个是一个HandlerMapping的list集合,存放了所有的handlerMapping(处理器映射器),
再回去看getHandler方法,他经过一轮判断以后,再回来调用自己,并将HttpRequest传入,这个request里面就可以得到请求信息:
在这里插入图片描述
这里可以看到request的uriMB封装了处理器方法的信息;
在这里插入图片描述
在看处理器适配器:
处理器适配器调用方法getHanderAdapter传入处理器映射器,这个时候处理器映射器已经封装好处理器方法了;
在这里插入图片描述
归根溯源,这个request其实是一开始servlet的service方法传入的,之后的各种封装都是一系列的判断,处理器映射器归根结底是通过请求的uriMB得到的处理器方法;
现在处理器映射器和处理器适配器都找到了,这样就可以通过方法名反射来执行方法;

再往下看,得到请求方法判断,然后执行下面代码:
这里得到一个long类型的值,暂时不知道是干嘛的,
在这里插入图片描述
再往下走,这里通过HttpRequest、HttpResponse、处理器映射器得到ModelAndView(模型视图)
在这里插入图片描述
在这里插入图片描述
再往下走
在这里插入图片描述
这里点进去,进行一系列判断以后调用了render方法;

在这里插入图片描述

这个方法里面通过视图名称得到视图解析器,最后调用render方法渲染视图
在这里插入图片描述

在这里插入图片描述
这个render是个抽象方法,找到他的实现类AbstractView,实现类重写方法:
在这里插入图片描述
最后调用renderMergedOutputModel方法,这个方法也有很多实现类,如下:
在这里插入图片描述
可以以各种方式返回视图:
其中转发:
在这里插入图片描述

重定向:
在这里插入图片描述
在这里插入图片描述
返回json字符串:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

整个流程:
用户发送请求,tomcat加载web.xml,web.xml调用前端控制器(DispatcherServlet,通过层层的继承最终调用的实际上是Servlet的service的),
前端控制器
通过getHandler(HttpRequest)得到处理器映射器;
通过getHandlerAdapter(HanderMapping)得到处理器适配器;
通过处理器适配器的handle(HttpRequest,HttpResponse,HanderMapping)方法的到模型视图;
处理器映射器通过HttpRequest带入的uriMB得到处理器的方法,传给处理器适配器判断是否可执行后执行,最后通过通过模型视图调用render渲染视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值