天天看点

spring mvc DispatcherServlet详解之前传---前端控制器架构

前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。

spring mvc DispatcherServlet详解之前传---前端控制器架构

DispatcherServlet 作为前置控制器是web服务器的入口,是spring mvc最重要的一个类,通过它的生命周期可以加深对web服务器的理解。

servlet的生命周期

首先我们回忆一下servlet的生命周期:

Servlet生命周期分为三个阶段:【http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html】

  1,初始化阶段  调用init()方法。Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:  

    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

DispatcherServlet的结构

复习了上述知识后我们来看看DispatcherServlet的结构:

DispatcherServlet继承自抽象类:FrameworkServlet,间接继承了HttpServlet (FrameworkServlet继承自HttpServletBean,而HttpServletBean继承自HttpServlet )

Servlet的初始化

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

servlet如何处理请求:

servlet的service方法处理http请求。

FrameworkServlet.java 定义了servlet的service和destroy方法,如下所示:

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

我们知道http请求类型有七种(外加一个option选项),定义如下:

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

具体实现如下:

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

重头戏,作为请求分发器的实现:

功能:1. 把请求分发到handler(按照配置顺序获取servlet的映射关系获取handler);2. 根据servlet已安装的  HandlerAdapters 去查询第一个能处理的handler;3. handler激发处理请求

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

servlet销毁

spring mvc DispatcherServlet详解之前传---前端控制器架构
spring mvc DispatcherServlet详解之前传---前端控制器架构

小结:

本文因篇章限制,仅仅介绍了请求处理的流程,没有对代码进行深入的分析,接下来的文章将从细微处着手,分析spring的代码之美。

http://www.cnblogs.com/davidwang456/p/4090058.html