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. P4075 [SDOI2016]模式字符串

    总结 P4075 [SDOI2016]模式字符串 题目描述 给出n个结点的树结构T,其中每一个结点上有一个字符,这里我们所说的字符只考虑大写字母A到Z,再给出长度为m的模式串s,其中每一位仍然是A到z ...

  2. .NET Core 初次上手Swagger

    安装NuGet 程序包=>Swashbuckle.AspNetCore 在  Startup.ConfigureServices  方法里添加注册生成器 //注册Swagger生成器,定义一个和 ...

  3. 重启监听卡在connecting to的问题

    问题描述:lsnrctl start启动监听起不来,一直卡在connecting to半天 1.[oracle@orcl ~]$ lsnrctl start 一直卡半天,就是连不上,按照以前的解决办法 ...

  4. gulp常用插件之wiredep使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 wiredep这是一款gulp插件,能够将js.css文件自动插入到html中. 更多使用文档请点击访问wiredep工具官网. Bower是一个 ...

  5. PAT (Advanced Level) Practice 1055 The World's Richest (25 分) (结构体排序)

    Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...

  6. Linux的文件、目录权限管理

    查看文件夹的详细信息 [root@s25linux ~]# ll /tmp总用量 4drwxr-xr-x. 2 root root   6 2月 17 11:00 hehe   #文件夹 解读它的信息 ...

  7. CTS、CLS、CLR

    CTS.CLS和CLR是.NET框架的3个核心部分,下面分别对它们进行介绍. 1)CTS  Common Type System CTS即通用类型系统,它定义了如何在.NET Framework运行库 ...

  8. Canvas如何绘制精美的图?

    一.Canvas的基本使用 首先在使用Canvas一般先在<body>中添加: <canvas id="></canvas> 然后使用Js进行获取canv ...

  9. maven依赖报红的一些解决办法

    使用IDEA集成maven管理项目依赖时,经常出现更改pom文件后maven依赖列表并未更改,且依赖报红,此时建议检查maven配置文件maven仓库是否下载好jar包,如果未下载好jar包文件夹内会 ...

  10. Qt多线程实现思路二

    建立一个继承于Qobject的类myThread 在类myThread中定义线程处理函数不必是思路一里的run(); 在窗口类中开辟一个自定义线程myThread的指针对象myT = new myTh ...