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执行流程及底层代码流程的更多相关文章

  1. 面试高频SpringMVC执行流程最优解(源码分析)

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! SpringMVC执行流程 SpringMVC概述 Spri ...

  2. springmvc执行流程详细介绍

    1.什么是MVC MVC是Model View Controller的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet) ...

  3. SpringMVC执行流程简介

    1.用户向服务器发送请求,请求被SpringMVC的前端控制器DispatcherServlet截获. 2.DispatcherServlet对请求的URL(统一资源定位符)进行解析,得到URI(请求 ...

  4. SpringMVC执行流程及源码分析

    SpringMVC流程及源码分析 前言 ​ 学了一遍SpringMVC以后,想着做一个总结,复习一下.复习写下面的总结的时候才发现,其实自己学的并不彻底.牢固.也没有学全,视频跟书本是要结合起来一起, ...

  5. SpringMVC--从理解SpringMVC执行流程到SSM框架整合

    前言 SpringMVC框架是SSM框架中继Spring另一个重要的框架,那么什么是SpringMVC,如何用SpringMVC来整合SSM框架呢?下面让我们详细的了解一下. 注:在学习SpringM ...

  6. springMVC执行流程及原理

    spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...

  7. (一)springMvc 底层运作流程

    目录 什么是 springMvc SpringMVC的底层运作流程 什么是 springMvc springMvc 是spring 框架的一个模块,这也就意味着二者不需要通过整合层(整合包)进行整合 ...

  8. 2.SpringMVC执行流程

    SpringMVC 执行流程: 执行流程简单分析: 1.浏览器提交请求到中央调度器 2.中央调度器直接将请求转给处理器映射器 3.处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行 ...

  9. SpringMVC执行流程总结

    SpringMVC 执行流程: 用户发送请求至前端控制器 DispatcherServlet DispatcherServlet 收到请求调用处理映射器 HandlerMapping 处理映射器根据请 ...

随机推荐

  1. Life is Strange:《奇异人生》

    “生活就是一个陌生人”

  2. grid 布局(2)

    目录 grid 布局(2) grid区域属性 网格线名称 grid-template-areas 属性 grid-auto-flow 容器内子元素的属性 grid 布局(2) grid区域属性 网格线 ...

  3. Linux 命令之 linux 四剑客

    Linux命令-- 四剑客 一:Linux命令 之 AWK 符号:^ 开头 $ 结尾 awk 是一种处理文本的语言,一个强大的文本分析命令! 1:提取文件中的每行的第二个 提取前文本中内容为  命令: ...

  4. 数据库中的sql语句总结

    初识SQL   1. 什么是SQL:结构化查询语言(Structured Query Language). 2. SQL的作用:客户端使用SQL来操作服务器.   > 启动mysql.exe,连 ...

  5. easyUI footer 的格式渲染

    网上好多的例子,但是自己使用的情况下还是出现bug.比如以下代码: var myview = $.extend({}, $.fn.datagrid.defaults.view, { renderFoo ...

  6. MySQL数据库优化(一)

    1.1.1. 慢查询日志当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中.默认不开启.采样的时候手工开启.可以帮助我们找出执行慢的 SQL 语句查看慢 SQL 日志是否启用(on 表示启 ...

  7. java学习笔记之IO编程—File文件操作类

    1. File类说明 在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作( ...

  8. cmdb实现三种方式

    为什么要做CMDB? 1.实现运维自动化,CMDB是实现运维自动化的基石 2.之前做资产统计的时候,使用execl来统计,为了年底资产审计方便 3.运维日常工作繁琐, 4.运行环境不统一 Agent方 ...

  9. 项目部署到tomcat,验证部署成功

    1.假设你已经知道打war包放上去了tomcat 下的webapps下 2. bin->启动startup.bat 3.浏览器中启动 http://ip:port    这个port是tomca ...

  10. 机器学习作业(八)异常检测与推荐系统——Matlab实现

    题目下载[传送门] 第1题 简述:对于一组网络数据进行异常检测. 第1步:读取数据文件,使用高斯分布计算 μ 和 σ²: % The following command loads the datas ...