DispatcherServlet

DispatcherServlet_第1张图片
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文件中的之间添加如下代码:
1
    2,在Servlet容器启动后,客户首次向Servlet发送请求
    3,Servlet类文件被更新后,重新装载Servlet
  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

再来看一下DispatcherServlet继承关系图

DispatcherServlet_第2张图片
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容器的子容器)创建过程

DispatcherServlet_第3张图片
回顾一下整个初始化过程

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

你可能感兴趣的:(DispatcherServlet)