前身今世

Spring MVC是一种基于 MVC设计模式 , 请求-响应模型 的 轻量级Web框架

  • 易用性
  • 兼容性
  • 扩展性

本文主要从 容器关系 , 核心分发器 和 抽象与扩展

容器关系

建立在Spring基础之上,与Spring无缝融是Spring MVC的重要优势。区别于Struts等非Spring族Web框架,Spring MVC能够天然地享受Spring带来的IOC,AOP,热部署等特性。Spring本身的容器设计已经高度抽象,并且获得巨大成功,Spring MVC的容器设计充分地站在了Spring巨人的肩膀上,将Spring容器和Spring MVC的Servlet容器关联起来,如下图。

springmvc 视图解析器 前缀配置 springmvc视图解析器原理_MVC

在典型的Spring MVC应用中,会有两种ApplicationContext,一种是从applicationContext.xml里加载的父容器(root ApplicationContext) ,另一种是从servlet-context.xml里加载的 子容器(dispatcher ApplicationContext)子容器可以访问到所有父容器中的信息,而父容器访问不到子容器的信息。父容器使得各个子容器的能够共享一些bean,而各个子容器之间又做到隔离。共享的父容器中,一般会放置后台业务逻辑相关的bean,如一些service类,DAO类,数据源等,而各个子容器会放置web请求-相应相关的类,也就是controller,viewResolver等。 共享与裁剪

核心分发器

DispatcherServlet作为Spring MVC核心分发器

The Spring Web model-view-controller (MVC) framework is designed around a DispatcherServlet

和其他请求驱动的Web框架一样,Spring MVC也是围绕一个 将前端请求分发到相应控制器

整个请求-响应过程包括处理器(Controller),处理器映射器(HandlerMapping),处理器适配器(HandlerAdaptor),视图解析器(View Resolver),视图(View)等的流转,整个流程如下所示:

springmvc 视图解析器 前缀配置 springmvc视图解析器原理_xml_02

主要分为7个步骤:

  1. 用户请求 —> DispatcherServlet,核心分发器收到请求后自己不进行处理,而是作为统一访问点,进行全局的流程控制。
  2. DispatcherServlet —> HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易对映射策略进行扩展。
  3. DispatcherServlet —> HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器。
  4. HandlerAdapter —> Handler,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据、逻辑视图名)。
  5. ModelAndView的逻辑视图名 —> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易扩展其他视图技术。
  6. View —> 渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,可以支持各种模板渲染引擎。
  7. 返回响应给用户

我们可以看到各个组件在MVC模式的协同下工作,整个系统架构又清晰又简洁。

抽象和扩展

Spring MVC是一个基于著名的 "Open-Close"即开闭原则

"Open for extension…" A key design principle in Spring Web MVC and in Spring in general is the "Open for extension, closed for modification" principle.

围绕着DispatcherServlet的 每个组件都是抽象接口

springmvc 视图解析器 前缀配置 springmvc视图解析器原理_xml_03