DispatcherServlet

image.png
流程:

1.用户发送请求至 前端控制器DispatcherServlet。

2.前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。

3.处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。

4.前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。

5.执行处理器(Controller,也叫后端控制器)

6.处理器Controller执行完后返回ModelAnView。

7.处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。

8.前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。

9.视图解析器ViewResolver解析后返回具体的视图View。

10.前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)

11.前端控制器DispatcherServlet响应用户。

1、在理解DispatcherServlet这个Spring MVC的核心前端控制器前,先来了解一下Servlet

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

1、 Servlet生命周期分为三个阶段:
  1,初始化阶段 调用init()方法
  2,响应客户请求阶段 调用service()方法 (用过原生Servlet写过web都知道自定义的Servlet需要继承HttpServlet类实现doPost和doGet方法,实际上HttpServlet中也是在service()方法中调用doPost和doGet方法)
  3,终止阶段 调用destroy()方法
2、Servlet初始化阶段:
  在下列时刻Servlet容器装载Servlet:
    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如下代码:
<loadon-startup>1</loadon-startup>
    2,在Servlet容器启动后,客户首次向Servlet发送请求
    3,Servlet类文件被更新后,重新装载Servlet
  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

再来看一下DispatcherServlet继承关系图

DispatcherServlet继承关系图

这边发现最原始的两个接口是ServletConfig和Servlet,另外还一个平时经常会用到的ServletContext又是什么?
1、WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用,当前web应用有且只有一个ServletContext对象

通常应用:

  • 多个Servlet通过ServletContext对象实现数据共享,通过get或者set Attribute
  • 实现Servlet的转发
  • 读取资源文件
  • 获取WEB应用的初始化参数

IOC容器就是以这样的KEY VALUE的形式保存在ServletContext的attribute里面

image.png

2、ServletConfig代表当前Servlet在web.xml中的配置信息,每个Servlet维护一个ServletConfig

通常应用:

  • String getServletName() -- 获取当前Servlet在web.xml中配置的名字
  • String getInitParameter(String name) -- 获取当前Servlet指定名称的初始化参数的值
  • Enumeration getInitParameterNames() -- 获取当前Servlet所有初始化参数的名字组成的枚举
  • ServletContext getServletContext() -- 获取代表当前web应用的ServletContext对象

最经常使用的是通过getServletConfig().getServletContext()来获取ServletContext对象


2、DispatcherServlet

DispatcherServlet是什么?它为什么在SpringMVC中起到核心作用?原因很简单:所有来自客户端的请求都会经过DispatcherServlet,由DispatcherServlet将不同的请求分发至不同的Controller,所以DispatcherServlet是一个前置控制器起的是分发来自客户端请求的作用.根据不同的配置会接收不同的请求,这在web.xml中servlet映射中可体现.如果配置的是"/*"则是所有请求都会经过DispatcherServlet

首先大致了解一下Servlet.Web容器接收到来自客户端不同类型(post,get等)的时候,实际上是所有的请求都是访问Servlet接口的service方法,在HttpServlet抽象类中实现了service方法,在service方法中判断是哪种具体的请求,再将不同的请求分发至不同的处理方法

SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程

回顾一下整个初始化过程

Spring MVC的IoC容器创建是在FrameWorkServlet.java的initWebAppliacationContext()调用,而后就是调用onRefresh(),再调用initStrategies()来初始化Sring MVC的九大组件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容