spring mvc 原理(快速理解篇)


这两张图大家应该都不陌生。
从图上来看就是:一个请求过来,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 原理(快速理解篇)的更多相关文章
- Spring MVC 原理探秘 - 一个请求的旅行过程
1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...
- Spring MVC 原理探秘 - 容器的创建过程
1.简介 在上一篇文章中,我向大家介绍了 Spring MVC 是如何处理 HTTP 请求的.Spring MVC 可对外提供服务时,说明其已经处于了就绪状态.再次之前,Spring MVC 需要进行 ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
- spring MVC原理
spring MVC原理 Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- Spring MVC原理及配置
Spring MVC原理及配置 1. Spring MVC概述 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得 ...
- Spring MVC原理及实例基础扫盲篇
近期 项目中刚接触了SpringMVC,就把这几天看的跟实践的东西写出来吧. 一.首先,先来了解一下SpringMVC究竟是个什么样的框架? Spring Web MVC是一种基于Java的实现了We ...
- Spring MVC 教程,快速入门,深入分析(转载)
作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download (本文使用是的 ...
- Spring MVC 教程,快速入门,深入分析[1-11]
资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com ...
随机推荐
- ecshop首页调用团购说明
要在首页调用购买. 发现在首页还不能直接调用团购说明.查看了一下代码发现要修改下才能调 打开根目录的 index.php 文件找到 $sql = 'SELECT gb.act_id AS group_ ...
- Jmeter系列(35)- 设置JVM内存
场景 单台机器的下JMeter启动较大线程数时可能会出现运行报错的情况,或者在运行一段时间后,JMeter每秒生成的请求数会逐步下降,直到为0,即JMeter运行变得很"卡",这时 ...
- 修改MAC系统下默认PHP版本(解决自带版本和环境版本冲突)
https://www.jianshu.com/p/d080d06557be 更改环境变量来修改默认的php版本 新建一个.bas_profile文件并编辑 vim ~/.bash_profile 然 ...
- mumu模拟器使用
连接mumu模拟器 启动mumu模拟器 执行命令:adb connect 127.0.0.1:7555(windows系统推荐使用gitbash) 安装app Gitbash下执行:adb insta ...
- 鸿蒙内核源码分析(线程概念篇) | 是谁在不停的折腾CPU? | 百篇博客分析OpenHarmony源码 | v21.06
百篇博客系列篇.本篇为: v21.xx 鸿蒙内核源码分析(线程概念篇) | 是谁在不断的折腾CPU | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调 ...
- P7854-「EZEC-9」GCD Tree【构造】
正题 题目连接:https://www.luogu.com.cn/problem/P7854 题目大意 给出\(n\)数字的一个序列\(a\). 现在要求构造一棵树,使得对于任意的\((x,y)\)都 ...
- Jmeter压测学习3---通过正则表达式提取token
上一个随笔记录的是用json提取器提取token,这个随笔记录用正则表达式提取token 一.添加正则表达式 登录右击添加->后置处理器->正则表达式提取器 正则提取器参数说明: 要检查的 ...
- pytest环境准备与入门
前言pytest 是 python2 默认自带的,python3 的版本 pytest 框架独立出来了,需用 pip 安装.以下为 python3.7版本为例 pytest是python的一种单元测试 ...
- AngularJS的简单实用
Angular Js 的初步认识和使用 一: 1.模块化 定义模块和控制器 ng-app="myapp" controller=&qu ...
- Xamarin Android使用自签名证书
背景 项目中后台web服务部署成https服务时,需要使用SSL证书,如果我们不使用公共的CA时,怎么办? 不仅如此,因为是小项目,App应用主要是小范围使用,此时只有IP地址,根本没有域名,怎么办? ...