流程:
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继承关系图
这边发现最原始的两个接口是ServletConfig和Servlet,另外还一个平时经常会用到的ServletContext又是什么?
1、WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用,当前web应用有且只有一个ServletContext对象。
通常应用:
- 多个Servlet通过ServletContext对象实现数据共享,通过get或者set Attribute
- 实现Servlet的转发
- 读取资源文件
- 获取WEB应用的初始化参数
IOC容器就是以这样的KEY VALUE的形式保存在ServletContext的attribute里面
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的九大组件。