Spring MVC简介

159 阅读3分钟

1. MVC框架简介

在介绍Spring MVC之前,先来说说什么是MVC。

(1) Model 1

在最开始的Java Web的开发中,整个Web应用几乎全部都由JSP+JavaBean组成。

image.png

JSP页面不仅要实现表现逻辑,还需要接收客户端/浏览器的请求,以及对请求进行处理并响应。
JavaBean用来和数据库进行交互。

这种模式的问题很明显,JSP职责不单一,业务逻辑和表现逻辑耦合在一起,对开发者要求高,代码可复用性低,不便于维护。

这种结构被称为Model 1。

(2) Model 2

为了解决Model 1中的问题,Model 2应运而生。

Model 2其实就是MVC模型,它由三个部分组成:

  • 模型层(Model):模型层是和数据相关的部分;
  • 视图层(View):视图层是和界面显示相关的;
  • 控制器(Controller):控制器用来控制视图层和模型层的交互。

Model 2最传统的应用就是JavaBean + JSP + Servlet。

image.png

2. Spring MVC简介

Spring MVC是Spring提供的一个基于MVC设计模式的轻量级Web开发框架,是当前业界最主流的开发框架。

它和传统的Model 2有什么不同之处呢?

image.png

在Spring MVC中,模型层又被细分为业务层(Service)和数据访问层(DAO)。这样一来,Service层就可以通过Spring的声明式事务来操作数据访问层了,同时还可以访问NoSQL。

总的来说,Spring MVC有以下优点:

  • 清晰的角色划分,比Model 2更加细化。
  • 灵活的配置功能,可以把对象当作Bean,通过XML进行配置。
  • 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
  • 真正做到与 View 层的实现无关,它不会强制开发者使用 JSP。
  • 国际化支持
  • 面向接口编程
  • 与Spring框架无缝集成

3. Spring MVC处理流程

Spring MVC的处理流程主要可以总结为6个组件11个步骤: image.png

  1. 客户端/浏览器发送HTTP请求,请求会被送到前端控制器DispatcherServlet处理;
  2. DispatcherServlet向处理器映射器 HandlerMapping请求Handler;
  3. HandlerMapping查找到一个或多个Handler并返回一个执行链HandlerExecutionChain
  4. DispatcherServlet将执行链中的Handler信息发送给处理器适配器HandlerAdapter
  5. HandlerAdapter根据Handler信息找到并执行相应的Handler,也就是Controller;
  6. Handler执行完毕后会返回给HandlerAdapter一个 ModelAndView对象,ModelAndView是Spring MVC的底层对象,包括Model数据模型和View视图信息;
  7. HandlerAdapter接收到ModelAndView对象后,将其返回给DispatcherServlet
  8. DispatcherServlet接收到ModelAndView对象后,会请求视图解析器ViewResolver对视图进行解析;
  9. ViewResolver根据View信息匹配到相应的视图结果,并返回给DispatcherServlet
  10. DispatcherServlet接收到具体的View视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的View
  11. View负责将结果显示到客户端/浏览器。

看着流程比较复杂,其实用更精炼的话来说也就是这4步:

  1. DispatcherServlet收到请求之后去HandlerMapping获取Handler
  2. DispatcherServlet将获取到的Handler交给HandlerAdapter执行,得到返回的ModelAndView对象;
  3. DispatcherServlet将接收到的ModelAndView对象交给ViewResolver进行解析,得到返回的View;
  4. DispatcherServlet将接收到的View进行视图渲染,并响应给客户端/浏览器。

4. Spring MVC实例

说了这么多,是不是应该上手实现Spring MVC了?
呃,现在应该没多少人是直接使用Spring MVC了吧,使用Spring Boot他不香吗?

Spring Boot的spring-boot-autoconfigure包中,使用自动配置帮我们省去了很多工作(自动配置的原理,可以去看这里)。

DispatcherServlet的自动配置是通过DispatcherServletAutoConfiguration完成的,HandlerMappingHandlerAdapter以及ViewResolver都是通过WebMvcAutoConfiguration来实现的,有兴趣的同学可以debug调试一下。

参考引用

Spring MVC【入门】就这一篇:www.jianshu.com/p/91a2d0a1e…
Spring MVC:c.biancheng.net/spring_mvc/…