在线咨询

深入剖析Spring Web源码(四) - DispatcherServlet的实现


Spring是一个轻量级 J2EE框架。它可以运行在任何一个 Web容器上。事实上, Spring的入口点就是实现或者继承了 Web容器规范中的 Servlet, 监听器 (Listener)和过滤器 (Filter)。这一章我们将详细讨论 Spring Web MVC架构的具体实现。

1.1    DispatcherServlet的实现

 

DispatcherServlet是一个经过多个层次最终继承自 Servlet规范中的 HttpServlet, 进而实现 Servlet规范中定义的Servlet接口。这些继承和实现组成了一个复杂的树形结构,在树形结构中的每个层次的类完成一个特定的初始化功能,服务功能或者清理资源的功能,每个层次的类之间分工合理,易于扩展。如图表 4 - 1,

 

图表 4‑1

Servlet是 Servlet规范中规定的一个服务器组件的接口,任何一个可以处理用户请求的服务器组件需要实现这个接口, Web容器就是根据 URL到 Servlet的映射派遣一个 HTTP请求到这个 Servlet组件的实现,进而对这个HTTP请求进行处理,并且产生 HTTP响应。

通用 Servlet(GenericServlet)是 Servlet的一个抽象实现。这个实现是和协议无关的。它提供了 Servlet应该具有的基础功能。例如,保存 Servlet配置,为后来的操作提供初始化参数和信息等等。

HTTP Servlet(HttpServlet)是针对 HTTP协议对通用 Servlet的实现。它实现了 HTTP协议的一些基本操作。例如,根据 HTTP请求的方法分发不同类型的 HTTP请求到不同的方法进行处理。对于简单的 HTTP方法 (HEAD, OPTIONS, TRACE)提供了通用的实现,这些实现在子类中通常是不需要重写的。而对其他的业务服务类型的方法 (GET, POST, PUT, DELETE)提供了占位符方法。子类应该有选择的根据业务逻辑重写这些服务类型方法的实现。

HTTP Servlet Bean(HttpServletBean)是 Spring Web MVC的一个抽象实现。它提供了一个特殊的功能,可以将Servlet配置的初始化参数作为 Bean的属性,自动赋值给 Servlet的属性。子类 Servlet的很多属性都是通过这个功能进行配置的。

Framework Servlet(FrameworkServlet)也是一个抽象的实现。在这个是西安层次上,它提供了加载一个对应的Web应用程序环境的功能。这个 Web应用程序环境可以存在一个根环境,这个根环境可以是共享的也可以是这个Servlet或者几个 Servlet专用的。它也提供了功能将 HTTP GET, POST, PUT, DELETE方法统一派遣到 Spring Web MVC的控制器方法进行派遣。在派遣前到处请求环境等信息到线程的局部存储。

派遣器 Servlet(DispatcherServlet)是这个继承链中最后一个类,它是 Spring Web MVC的核心实现类,它在框架Servlet中加载的 Web应用程序环境中查找一切 Spring Web MVC所需要的并且注册的组件,如果一个需要的Spring Web MVC组件没有注册,则通过缺省策略的配置创建并且初始化这些组件。在一个 HTTP请求被派遣的时候,它使用得到的 Spring Web MVC组件进行处理和响应。具体的处理和相应将在下面的章节具体分析。

资源 Servlet(ResourceServlet)是一个用来存取 Web应用中内部静态资源的一个 Servlet实现。

HTTP 请求处理器 Servlet(HttpRequestHandlerServlet)是用来派遣一个请求直接到 HttpRequestHandler的特殊的Serlvet。可以用以基于 HTTP协议的远程调用的实现。

视图绘制 Servlet(ViewRenderServlet)是用来与 Portlet集成而设计的一个实现类。

从上图可以看出,前三个类被标识为灰色,因为他们都是 Servlet规范中规定接口或者实现,并不是 Spring的实现。而后面的所有类都是 Spring Web MVC的实现类。下面的第一小节中我们讲分析 Servlet规范中对 HTTP协议的实现。第二小节则深入剖析 Spring Web MVC控制器(派遣器 Servlet)的实现。

转载请注明出处【 http://sishuok.com/article-detail.html?t=article-117&n=5256 】