org.springframework.web.servlet.DispatcherServlet
继承结构HttpServletBean是Spring对HttpServlet最底层的抽象,在这里Spring把Servlet视作一个BeanFrameworkServlet是对HttpServletBean的进一步抽象,真正初始化一个Spring的容器(WebApplicationContext)DispatcherServlet对容器(容器用于管理组件)进行初始化以达到对组件进行逻辑调用的目
继承结构
- HttpServletBean是Spring对HttpServlet最底层的抽象,在这里Spring把Servlet视作一个Bean
- FrameworkServlet是对HttpServletBean的进一步抽象,真正初始化一个Spring的容器(WebApplicationContext)
- DispatcherServlet对容器(容器用于管理组件)进行初始化以达到对组件进行逻辑调用的目的
SpringMVC自身对于组件并未实现一套完整的管理机制,而是借用了Spring Framework核心框架中容器的概念,将所有的组件纳入到容器中进行管理。一个组件的多种行为模式可以在容器中共存,容器将负责对这些实现类进行管理。
数据结构
- 红线以上是参数配置,控制SpringMVC组件的初始化行为方式
- 红线以下是核心组件,SpringMVC的核心逻辑处理组件
DispatcherServlet是程序的入口,在web.xml中配置
在之前Servlet模式中,web.xml配置项目的所有请求-响应映射关系。项目规模扩大之后,请求-响应的映射关系全部定义在web.xml中,将造成web.xml的不断膨胀而变得难以维护。针对这一点,SpringMVC提炼一个核心的Servlet覆盖对所有Http请求的处理,也就是DispatcherServlet。
要做到能分发所有的请求,核心分发器需要做到:①能够根据一定的规则对不同的Http请求分发到不同的Servlet对象上去进行处理②能够建立起一整套完整的对所有Http请求进行规范化处理的流程(不同协议之间的转化,从Http协议到Java)。
为了做到这2点,SpringMVC所提出2点:
- 处理流程规范化 —— 将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来
- 处理流程组件化 —— 将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式
其中流程步骤为:
1)对Http请求进行初步处理,查找与之对应的Controller处理类(方法)——HandlerMapping接口(组件)
2)调用相应的Controller处理类(方法)完成业务逻辑——HandlerAdapter接口(组件)
3)对Controller处理类(方法)调用时可能发生的异常进行处理——HandlerExceptionResolver接口(组件)
4)根据Controller处理类(方法)的调用结果,进行Http响应处理——ViewResolver接口(组件)
这4个步骤对应的4个接口就是Spring的组件,而DispatcherServlet就是把这些组件串联在一起,实现分发请求的功能。那么SpringMVC要怎么管理这些组件呢?我们必须借助一个有效的手段对整个SpringMVC的组件进行定义,而这一点正是通过核心配置文件来完成的。
组件是处理流程的抽象化,因而所有组件都是接口,接口最重要意义是定义操作规范,一个接口可以有多个不同的实现类,代表的是对于相同的逻辑语义的不同解读方式。或者说一个接口的每一个不同的实现分支,代表了相同操作规范的不同行为模式。举个例子,根据Http请求查找与之对应的Controller的组件HandlerMapping的树形实现体系:
- BeanNameUrlHandlerMapping —— 根据Spring容器中的bean的定义来指定请求映射关系
- SimpleUrlHandlerMapping —— 直接指定URL与Controller的映射关系,其中的URL支持Ant风格
- DefaultAnnotationHandlerMapping —— 支持通过直接扫描Controller类中的Annotation来确定请求映射关系
- RequestMappingHandlerMapping —— 通过扫描Controller类中的Annotation来确定请求映射关系的另外一个实现类
由此可以看出,组件化(接口化)体系是SpringNVC对行为模式的扩展的有效途径,SpringMVC是一个基于组件的开发框架
更多推荐
所有评论(0)