这两张图大家应该都不陌生。

从图上来看就是:一个请求过来,front controller根据具体的请求路径分派到具体的controller,具体的controller处理请求并把处理结果返回给front Controller,front Controller 再把model、view结合起来最终返回给用户。

spring mvc 中的DispatcherServlet的角色就是front controller,DispatcherServlet的类图及接口具体如下图

我们知道一个servlet的生命周期

1初始化阶段 调用init()方法
2响应客户请求阶段  调用service()方法
3终止阶段  调用destroy()方法

所有的处理会放到service方法的实现中,FrameworkServlet里面实现了service()方法,同时在service()里面调用了一个抽象方法doService(),DispatcherServlet实现了doService()方法。简单理解DispatcherServlet在服务起来的时候会执行doService()方法,

大家可以看下DispatcherServlet的源码,比较容易理解:

首先看下类的结构图如下:

1、当服务启动的时候,调用servlet的init方法【此处是HttpServletBean的init方法】,HttpServletBean的init方法中调用了initServletBean方法
2、FrameworkServlet实现了initServletBean方法,这个方法调用initWebApplicationContext()执行上下文Bean初始化
3、FrameworkServlet.initWebApplicationContext方法首先获取自己的双亲上下文(也就是ContextLoaderListener初始化成功的WebApplicationContext);然后创建或者获取当前Servelet的WebApplicationContext
4、WebApplicationContext执行configureAndRefreshWebApplicationContext()方法进行上下文容器初始化【在configureAndRefreshWebApplicationContext方法里构造bean工厂和容器里bean的创建】

以上是init处理的情况,init结束后,来看下service:

1、servlet的init结束后,调用service方法,FrameworkServlet实现了service方法,覆盖了父类HttpServlet
2、FrameworkServlet的service方法会调用doService,DispatcherServlet实现了doService方法【父类的抽象方法doService】
3、doService方法中调用了doDispatch方法。
4、mappedHandler = getHandler(processedRequest, false);通过该方法的处理,根据handlermapping找到具体的HandlerExecutionChain。然后执行HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());最终找到具体的HandlerAdapter
5、mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
6、HandlerAdapter是配到合适的handler然后处理,之后得到ModelAndView对象
7、拿到ModelAndView对象进行处理,最终返回用户具体的页面

第四步可以结合下面的图:

下面这张图是根据handlermapping找到具体的HandlerExecutionChain

第五步结合如下图片来看:

spring mvc 原理(快速理解篇)的更多相关文章

  1. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  2. Spring MVC 原理探秘 - 容器的创建过程

    1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...

  3. Spring MVC 教程,快速入门,深入分析

    http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: ...

  4. spring MVC原理

    spring MVC原理   Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...

  5. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  6. Spring MVC原理及配置

    Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...

  7. Spring MVC原理及实例基础扫盲篇

    近期 项目中刚接触了SpringMVC,就把这几天看的跟实践的东西写出来吧. 一.首先,先来了解一下SpringMVC究竟是个什么样的框架? Spring Web MVC是一种基于Java的实现了We ...

  8. Spring MVC 教程,快速入门,深入分析(转载)

    作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download    (本文使用是的 ...

  9. Spring MVC 教程,快速入门,深入分析[1-11]

    资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar     作者:赵磊 博客:http://elf8848.iteye.com   ...

随机推荐

  1. requests接口自动化-动态关联text/html格式

    动态关联,前一个接口返回的值为后一个接口请求的参数. # 动态关联 import requests def test_cookies(): # 以百度为例 r_baidu=requests.get(' ...

  2. Charles抓包工具断点修改返回内容

    在测试过程中,往往需要让服务器返回指定的内容,测试一些特殊情况.例如列表内容为空.数据异常的情况等.如果通过操作服务器配合构造相应的数据会比较麻烦,甚至不好构造数据.此时,可以使用Charles的断点 ...

  3. 1.3redis小结--配置php reids拓展

    1.执行php文件 输出phpinfo();  <?php phpinfo(); 2.根据PHPinfo的信息确定需要下载的 php_redis.dll , php_igbinary.dll 版 ...

  4. [原创]配置php+nginx 时遇到的”file not found","access denied"奇怪问题的解决过程

    在centos 7中按照我的随笔转载文章"[转载]CentOS 下安装LEMP服务(Nginx.MariaDB/MySQL和PHP)"安装好后,结果无法显示phpinfo()信息, ...

  5. Springboot --- Bug集

    一. 启动springboot报错:找不到或无法加载主类 解决:直接选中项目,在ecplise选中"project",点击clean 清理项目再运行 问题解决. 二.报错:Fail ...

  6. Vue使用axios post方法发送json数据报415Unsupported Media Type

    1.Vue使用axios post方法发送json数据 <template> <el-aside> <el-form ref="form" :mode ...

  7. tomcat启动程序报错

    1.问题 23-Apr-2021 10:53:38.897 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.de ...

  8. transformers---BERT

    transformers---BERT BERT模型主要包括两个部分,encoder和decoder,encoder可以理解为一个加强版的word2vec模型,以下是对于encoder部分的内容 预训 ...

  9. change or reset WSL password

    change or reset WSL password To change or reset your password, open the Linux distribution and enter ...

  10. TypeScript中将函数中的局部变量“导出”的方法

    首先是在模块a.js中声明一个可导出(export)的数据结构,例如: export class ModelInfo{ id: string; name:string; } 其次是在模块b中声明可导出 ...