SpringMvc执行流程及底层代码流程
SpringMVC执行流程

01.客户端发送请求被我们在web.xml中配置DispatcherServlet(核心控制器)拦截;
默认执行DispatcherServlet中的
protected void doDispatch(HttpServletRequest req,HttpServletResponse resp) throws Exception{};
此方法中定义了HandlerExecutionChain mapperHandler=null;//处理器执行链
MapperHandler = getHandler(processedRequest);//根据用户的请求获取处理器执行
链;
02.核心控制器请求HandlerMapping(处理器映射器)查找需要的Handler(Controller)并返回此Handler;
进入protected HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};
//在处理器映射器中遍历查找请求的Handler
for(HandlerMapping hm:this.handlerMappings){ //handlerMappings==>List<HandlerMapping>
//hm是List<HandlerMapping>集合中的一个元素==》HandlerMapping
HandlerExecutionChain handler = hm.getHandler(req);
}
继续跟进HandlerMapping接口的实现类AbstractHandlerMapping类中的
public final HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};
Object handler = getHandlerInternal(req);//获取要执行的Handler
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler,req);
跟进getHandlerExecutionChain();
For(HandlerInterceptor interceptor : this.adaptedInterceptor){
…
chain.addInterceptor(interceptor);//添加了一些处理器拦截器
}
由此可知:处理器执行链中包含了一个即将执行的handler和一些intercpetor拦截器。
03.核心控制器DispatcherServlet调用HandlerAdapter(处理器适配器)去执行Handler;
经过以上操作,现在核心控制器已经拿到要执行的handler;
回到DispatcherServlet中的doDispather方法继续往下执行;
//获取处理器适配器,参数为处理器执行链中获取处理器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
跟进protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException{};
//handlerAdapters ==> List<HandlerAdapter>
for(HandlerAdapter ha : this.handlerAdapters){
…
If(ha.support(handler)){
return ha; //返回需要的处理器适配器 handlerAdapter
}
}
跟进 support()方法;
boolean support(Object handler);是HandlerAdapter接口中的方法;
此方法有5个实现类;默认执行3个;
在webmvc的jar包下找到DispatcherServlet.properties配置文件;
默认的处理器映射器/处理器适配器配置为:

04.Handler(Controller)执行完成后给HandlerAdapter返回ModelAndView;
返回到doDispatch方法继续往下执行;
mv = ha.handler(processedRequest,response,mappedHandler.getHandler());
跟进handler方法所属接口是HandlerAdapter;
handler() 有5个实现类;根据DispatcherServlet.properties中配置的顺序来执行;
首先进入HttpRequestHandlerAdapter,此类中的handler方法最终将handler向下转型为HttpRequestHandler类型,和我们自定义的Controller无关;
所以继续执行下一个Adapter;
然后进入SimpleControllerHandlerAdapter类中的handler方法,此方法中将handler向下转型为Controller类型,正是我们需要的!(因为我们自定义的Controller继承了AbstractController又实现了Controller接口)
观察handler方法中的代码:

分析以上方法:
01. 只有Controller类型才有handlerRequest方法

02. AbstractController实现了Controller;

返回的handleRequestInternal方法也是AbstractController中的方法;

此方法为抽象方法;观察它的实现类有:

03. 我们自定义的Controller中的方法名称是handlerRequestInternal

04.所以执行Controller的handlerRequestInternal方法就是执行HelloController中的handlerRequestInternal方法。
05.HandlerAdapter(处理器映射器)向前端核心控制器DispatcherServlet返回ModelAndView;
06.核心控制器DispatcherServlet请求ResolverView(视图解析器)进行解析,
将逻辑视图名解析成真正的视图对象View(视图可以为jsp,xml,pdf,json…);
07.视图解析器(ResolverView)向DispatcherServlet返回View,并使用ModelAndView对象模型数据对View进行视图渲染;
08.最终客户端获得响应消息。
SpringMvc执行流程及底层代码流程的更多相关文章
- 面试高频SpringMVC执行流程最优解(源码分析)
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! SpringMVC执行流程 SpringMVC概述 Spri ...
- springmvc执行流程详细介绍
1.什么是MVC MVC是Model View Controller的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet) ...
- SpringMVC执行流程简介
1.用户向服务器发送请求,请求被SpringMVC的前端控制器DispatcherServlet截获. 2.DispatcherServlet对请求的URL(统一资源定位符)进行解析,得到URI(请求 ...
- SpringMVC执行流程及源码分析
SpringMVC流程及源码分析 前言 学了一遍SpringMVC以后,想着做一个总结,复习一下.复习写下面的总结的时候才发现,其实自己学的并不彻底.牢固.也没有学全,视频跟书本是要结合起来一起, ...
- SpringMVC--从理解SpringMVC执行流程到SSM框架整合
前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...
- springMVC执行流程及原理
spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...
- (一)springMvc 底层运作流程
目录 什么是 springMvc SpringMVC的底层运作流程 什么是 springMvc springMvc 是spring 框架的一个模块,这也就意味着二者不需要通过整合层(整合包)进行整合 ...
- 2.SpringMVC执行流程
SpringMVC 执行流程: 执行流程简单分析: 1.浏览器提交请求到中央调度器 2.中央调度器直接将请求转给处理器映射器 3.处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行 ...
- SpringMVC执行流程总结
SpringMVC 执行流程: 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到请求调用处理映射器 HandlerMapping 处理映射器根据请 ...
随机推荐
- C# WPF 表单更改提示
微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏 C# WPF 表单更改提示 内容目录 实现效果 业务场景 编码实现 本文参考 ...
- 基于TCP协议Socket通信
服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...
- Secondary NameNode:它究竟有什么作用?
前言 最近刚接触Hadoop, 一直没有弄明白NameNode和Secondary NameNode的区别和关系.很多人都认为,Secondary NameNode是NameNode的备份,是为了防止 ...
- ip连接mysql时报不能连接
问题:springboot项目在用localhost连接mysql时没问题,但当localhost换成ip时出现 该问题:message from server: "Host 'DESKTO ...
- vue keep-alive 遇见 vue-router
keep-alive 遇见 vue-router ·keep-alive 是Vue内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染 ·routre-view也是一个组件,如果直接被包在kee ...
- C# 串口关闭时主界面卡死原因分析
目录 问题描述 查找原因 SerialPort类Open()方法 SerialPort类Close()方法 死锁原因 解决死锁 总结 问题描述 前几天用SerialPort类写一个串口的测试程序,关闭 ...
- spring-framework核心接口ApplicationContext
核心接口(ApplicationContext) 继承关系 继承接口: org.springframework.beans.factory.ListableBeanFactory:用于访问应用程序组件 ...
- P问题,NP问题,NPC问题学习笔记
参考:https://www.luogu.org/blog/styx-ferryman/chu-sai-bei-kao-gan-huo-p-wen-ti-np-wen-ti-npc-wen-ti-sh ...
- MongoDB地理空间(2d)索引创建与查询
LBS(Location Based Services)定位服务,即根据用户位置查询用户附近相关信息,这一功能在很多应用上都有所使用.基于用户位置进行查询时,需要提供用户位置的经纬度.为了提高查询速度 ...
- Wannafly Camp 2020 Day 1H 最大公约数 - 质因数分解,高精度
把每个质因子扒出来乱搞一下 #include <bits/stdc++.h> using namespace std; int g[505][505]; int isp[505]; str ...