Spring MVC 快速入门(三)深入理解Spring MVC 思想

“对扩展开放”是Spring Web MVC框架一个重要的设计原则,而对于Spring的整个完整框架来说,其设计原则则是“对扩展开放,对修改闭合”。

Spring Web MVC核心类库中的一些方法被定义为final方法。作为开发人员,你不能覆写这些方法以定制其行为。当然,不是说绝对不行,但请记住这条原则,绝大多数情况下不是好的实践。

关于该原则的详细解释,你可以参考Seth Ladd等人所著的“深入解析Spring Web MVC与Web Flow”一书。相关信息在第117页,“设计初探(A Look At Design)”一节。或者,你可以参考:

  • Bob Martin所写的“开闭原则(The Open-Closed Principle)”(PDF)

你无法增强Spring MVC中的final方法,比如AbstractController.setSynchronizeOnSession()方法等。请参考10.6.1 理解AOP代理一节,其中解释了AOP代理的相关知识,论述了为什么你不能对final方法进行增强。

由于 Spring MVC 结构比较复杂,所以学习的时候也要掌握学习方法。首先要明确 Spring MVC 是一个工具,既然是工具,那么我们就需要先掌握工具的使用方法,不要陷入细节中,深入浅出,慢慢通过实际运用来加深对其的理解。

Spring MVC 执行流程分析

从刚才的Spring MVC入门程序中,我们大致明白了代码的书写过程,但是对Spring MVC每个元素的执行过程不太清楚,接下来我们分析Spring MVC的执行流程。

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第1张图片
(1)整个过程始于客户端发出一个HTTP请求,Web应用服务器接收到这个请求。如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),则Web容器将该请求转交给DispatcherServlet处理。

(2)DispatcherServlet接收到这个请求后,将根据请求的信息(包括 URL、HTTP方法、请求报文头、请求参数、Cookie等)调用处理器映射器HandlerMapping。

(3)处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。可将HandlerMapping看作路由控制器,将Handler看作目标主机

(4)当DispatcherServlet 根据HandlerMapping得到对应当前请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter 是Spring MVC的框架级接口,顾名思义,HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用。

(5)处理器完成业务逻辑的处理后将返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和模型数据信息。

(6)ModelAndView中包含的是“逻辑视图名”而非真正的视图对象,DispatcherServlet借由ViewResolver完成逻辑视图名到真实视图对象的解析工作。

(7)当得到真实的视图对象View后,DispatcherServlet就使用这个View对象对ModelAndView中的模型数据进行视图渲染。

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第2张图片

(8)最终客户端得到的响应消息可能是一个普通的HTML页面,也可能是一个XML或JSON串,甚至是一张图片或一个PDF文档等不同的媒体形式。

Spring MVC接口API

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第3张图片
Spring MVC 涉及到的组件有 DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下面对各个组件的功能说明如下。

(1) DispatcherServlet (不需要程序员开发)

中央调度器,也称为前端控制器,在 MVC 架构模式中充当控制器 C,DispatcherServlet是整个流程的控制中心,由它调用诸如处理器映射器、处理器适配器、视图解析器等其它组件处理用户请求。中央调度器的存在降低了组件之间的耦合度。

(2) HandlerMapping (不需要程序员开发)

处理器映射器,负责根据用户请求找到相应的将要执行的 Handler,即处理器。即用于完成将用户请求映射为要处理该请求的处理器,并将处理器封装为处理器执行链传给中央调度器。

(3) HandlAdapter(不需要程序员开发)

处理器适配器,通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。中央调度器会根据不同的处理器自动为处理器选择适配器,以执行处理器。

(4) Handler (需要程序员开发),即 Controller

处理器,也称为后端控制器,在 DispatcherServlet 的控制下 Handler 调用 Service 层对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况下需要程序员根据业务需求自己开发 Handler。

(5) ViewResolver (不需要程序员开发)

视图解析器,负责将处理结果生成 View 视图,ViewResolver 首先将逻辑视图名解析为物理视图名,即具体的页面地址,再生成 View 视图对象。最后将处理结果通过页面形式展示给用户。

(6) View (需要程序员开发 jsp 页面)

SpringMVC 框架提供了很多的 View 视图类型。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

通常,我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,而省去了大段的xml配置

默认配置

第一个 SpringMVC 的程序已经可以正确运行了。但发现一个问题:在流程介绍中所述的重要的处理器映射器、处理器适配器、视图解析器等,都在哪里,不用做配置吗?

当然不是!这些内容均在 DispatcherServlet 的默认配置 DispatcherServlet.properties 文件中被定义。这个文件与 DispatcherServlet 类在一个包下,而且是当 Spring 配置文件中没有指定配置时使用的默认情况。

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第4张图片

从上面的内容可知,这些组件的默认配置如下:

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第5张图片

控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
  • 控制器负责解析用户的请求并将其转换为一个模型。
  • 在Spring MVC中一个控制器类可以包含多个方法,共用视图

Spring MVC 快速入门(三)深入理解Spring MVC 思想_第6张图片
可以发现,我们的两个请求都可以指向一个视图,但是页面结果的结果是不一样的,从这里可以看出视图是被复用的,而控制器与视图之间是弱偶合关系。

  • 在Spring MVC中,对于Controller的配置方式有很多种

你可能感兴趣的:(spring,spring,mvc,java)