1. MVC框架简介
在介绍Spring MVC之前,先来说说什么是MVC。
(1) Model 1
在最开始的Java Web的开发中,整个Web应用几乎全部都由JSP+JavaBean组成。
JSP页面不仅要实现表现逻辑,还需要接收客户端/浏览器的请求,以及对请求进行处理并响应。
JavaBean用来和数据库进行交互。
这种模式的问题很明显,JSP职责不单一,业务逻辑和表现逻辑耦合在一起,对开发者要求高,代码可复用性低,不便于维护。
这种结构被称为Model 1。
(2) Model 2
为了解决Model 1中的问题,Model 2应运而生。
Model 2其实就是MVC模型,它由三个部分组成:
- 模型层(Model):模型层是和数据相关的部分;
- 视图层(View):视图层是和界面显示相关的;
- 控制器(Controller):控制器用来控制视图层和模型层的交互。
Model 2最传统的应用就是JavaBean + JSP + Servlet。
2. Spring MVC简介
Spring MVC是Spring提供的一个基于MVC设计模式的轻量级Web开发框架,是当前业界最主流的开发框架。
它和传统的Model 2有什么不同之处呢?
在Spring MVC中,模型层又被细分为业务层(Service)和数据访问层(DAO)。这样一来,Service层就可以通过Spring的声明式事务来操作数据访问层了,同时还可以访问NoSQL。
总的来说,Spring MVC有以下优点:
- 清晰的角色划分,比Model 2更加细化。
- 灵活的配置功能,可以把对象当作Bean,通过XML进行配置。
- 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
- 真正做到与 View 层的实现无关,它不会强制开发者使用 JSP。
- 国际化支持
- 面向接口编程
- 与Spring框架无缝集成
3. Spring MVC处理流程
Spring MVC的处理流程主要可以总结为6个组件11个步骤:
- 客户端/浏览器发送HTTP请求,请求会被送到前端控制器
DispatcherServlet处理; DispatcherServlet向处理器映射器HandlerMapping请求Handler;HandlerMapping查找到一个或多个Handler并返回一个执行链HandlerExecutionChain;DispatcherServlet将执行链中的Handler信息发送给处理器适配器HandlerAdapter;HandlerAdapter根据Handler信息找到并执行相应的Handler,也就是Controller;Handler执行完毕后会返回给HandlerAdapter一个ModelAndView对象,ModelAndView是Spring MVC的底层对象,包括Model数据模型和View视图信息;HandlerAdapter接收到ModelAndView对象后,将其返回给DispatcherServlet;DispatcherServlet接收到ModelAndView对象后,会请求视图解析器ViewResolver对视图进行解析;ViewResolver根据View信息匹配到相应的视图结果,并返回给DispatcherServlet;DispatcherServlet接收到具体的View视图后,进行视图渲染,将Model中的模型数据填充到View视图中的request域,生成最终的View;View负责将结果显示到客户端/浏览器。
看着流程比较复杂,其实用更精炼的话来说也就是这4步:
DispatcherServlet收到请求之后去HandlerMapping获取Handler;DispatcherServlet将获取到的Handler交给HandlerAdapter执行,得到返回的ModelAndView对象;DispatcherServlet将接收到的ModelAndView对象交给ViewResolver进行解析,得到返回的View;DispatcherServlet将接收到的View进行视图渲染,并响应给客户端/浏览器。
4. Spring MVC实例
说了这么多,是不是应该上手实现Spring MVC了?
呃,现在应该没多少人是直接使用Spring MVC了吧,使用Spring Boot他不香吗?
Spring Boot的spring-boot-autoconfigure包中,使用自动配置帮我们省去了很多工作(自动配置的原理,可以去看这里)。
DispatcherServlet的自动配置是通过DispatcherServletAutoConfiguration完成的,HandlerMapping、HandlerAdapter以及ViewResolver都是通过WebMvcAutoConfiguration来实现的,有兴趣的同学可以debug调试一下。
参考引用
Spring MVC【入门】就这一篇:www.jianshu.com/p/91a2d0a1e…
Spring MVC:c.biancheng.net/spring_mvc/…