SpringMVC入门学习(一)----Spring MVC的介绍与执行流程
1、MVC模式介绍
关于什么是MVC模式我在学习Java Web的时候写过一篇文章:MVC模式设计思想 。MVC模式的全名是Model-View-Controller,即模型(Model )-视图(View )-控制器(Controller)的缩写。首先要明确的一点是:MVC模式它不是类,也不是什么框架,它只是一种开发的设计思想。将业务逻辑、数据处理、界面显示分别抽取出来统一放到一个地方,从而使同一个程序可以使用不同的表现形式。
所以MVC的的程序分为三个核心的模块,这三个模块的详细介绍如下:
- 模型(Model):负责封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。模型层有对数据直接访问的权力,例如对数据库的访问。它不关心它会如何被视图层显示或被控制器调用,它只接受数据并处理,然后返回一个结果。
- 视图(View):负责应用程序对用户的显示,它从用户那里获取输入数据并通过控制层传给业务层处理,然后再通过控制层获取业务层返回的结果并显示给用户。
- 控制器(Controller):负责控制应用程序的流程,它接收从视图层传过来的数据,然后选择Model层中的某个业务来处理,接收Model层返回的结果并选择视图层中的某个视图来显示结果。
MVC模式在实际编程中的设计步骤:
模块 | 设计层面 | 可选框架 |
---|---|---|
模型(Model) | service+dao+entity | jdbc,hibernate,mybatis |
视图(View) | webapp页面 | jsp,thymeleaf,vue |
控制器(Controller) | controller | servlet,structs2,springmvc |
2、什么是Spring MVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。我们知道框架的目的就是帮助我们简化开发,而Spring MVC也是要简化我们日常Web开发的。SpringMVC提供了总开关DispatcherServlet;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理;动作处理器Controller接口(包含ModelAndView,以及处理请求响应对象请求和响应),配置灵活,支持文件上传,数据简单转化等强大功能。
SpringMVC现在已经成为目前最主流的MVC框架之一,并随着Spring的一直优化更新,已经将Struts2框架淘汰了,继而成为最优秀的MVC框架。SpringMVC通过一套注解,让一个简单的Java类成为处理请求的控制器,而无需实现任何接口。同时它还支持RESTful编程风格的请求。
3、Spring MVC的特点
- 轻量级,简单易学,简洁灵活
- 高效,基于请求响应的MVC框架,底层封装了Servlet
- 进行更简洁的 Web 层的开发
- 能简单的进行 Web 层的单元测试
- 与Spring兼容性好,天生与 Spring 框架集成(如 IoC 容器、AOP 等)
- 提供强大的约定大于配置的契约式编程支持
- 功能强大:支持RESTful风格、灵活的数据验证、灵活的本地化、格式化和数据绑定机制等
- 能使用任何对象进行数据绑定,不必实现特定框架的 API
- 对静态资源的支持
- 更加简单的异常处理
- 支持灵活的URL到页面控制器的映射
- 非常容易与其他视图技术集成,如 Thymeleaf、FreeMarker 等等,因为模型数据不放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用)
4、Spring MVC的执行流程(非常重要)
下图为一个较完整的SpringMVC工作执行流程图。Spring MVC的执行流程非常的重要,因为不出意外的话面试官考察SpringMVC的知识点99%都会问这个,所以我们必须对SpringMVC的执行流程非常熟悉。
补充在SpringMVC中的逻辑视图与物理视图:
- 逻辑视图:可以是ModelAndView的setViewName("success")中的success,也可以是return "success",这时设置跳转的success页面都是逻辑视图。
- 物理视图:它是实际的页面路径了,如:/WEB-INF/pages/success.jsp
具体的执行流程介绍:
- 用户在浏览器提交请求会到前端控制器DispatcherServlet进行处理。
- 前端控制器DispatcherServlet收到请求后,将请求转给处理器映射器HandlerMapping。
- 处理器映射器HandlerMapping根据request请求的URL等信息查找能够进行处理的Handler,以及相关拦截器interceptor,并构造HandlerExecutionChain执行链,然后将构造好的HandlerExecutionChain执行链对象返回给前端控制器DispatcherServlet,执行链包含一个处理器对象和一或多个拦截器。
- 前端控制器DispatcherServlet根据处理器执行链的处理器,能够找到其对应的处理器适配器HandlerAdapter;
- 处理器适配器HandlerAdapter调用相应的处理器Handler,即让我们写的具体的Controller方法执行。
- Controller处理完后返回ModelAndView给HandlerAdapter(ModelAndView表示SpringMVC的封装对象,将model和view封装在一起)。
- 处理器适配器HandlerAdapter将Controller执行结果ModelAndView返回给前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet调用视图解析器ViewReslover处理ModelAndView。
- 视图解析器ViewReslover解析后根据逻辑视图名解析成物理视图名即具体的页面地址,生成并返回具体对象View(springmvc封装对象,是一个接口)。
- 前端控制器DispatcherServlet根据对象View进行视图渲染(即将模型数据model填充至视图中)。
- 最后前端控制器DispatcherServlet向用户返回响应,至此就全部完成了。
如果上面这个图还有点不懂的话,可以参考下面这个时序图。
5、Spring MVC的核心组件说明
- DispatcherServlet:中央调度器,也称前端控制器,在MVC架构中相当于C,即控制层,它是整个流程的控制中心,由它调用其它组件处理用户的请求,中央调度器的存在降低了组件之间的耦合性,系统扩展性提高,由框架实现。
- HandlerMapping:处理器映射器,负责根据用户请求url找到要执行的Handler,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。由框架实现。
- Handler(需要程序员开发具体的Controller):处理器,Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
- HandlerAdapter:处理器适配器,通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。由框架实现。
- ViewResolver:视图解析器,View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。由框架实现。
- View(需要程序员开发jsp等页面):视图,springmvc框架提供了很多的View视图类型的支持,包括:jsp、jstlView、freemarkerView、pdfView等。一般需要我们根据业务需求开发具体的页面。
6、Spring MVC详细流程图
综上所述,总结下SpringMVC的详细流程图(图片来自网络,侵删):
参考资料: