初识Spring MVC
一、什么是MVC?
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。就是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
- Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
- View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
- Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。Controller相当于定义了一堆的方法,不同的方法处理不同的客户端请求;最主要的工作就是接收客户浏览器的请求,并把请求向后转发调度。
最典型的MVC就是JSP + servlet + javabean的模式。
补充:前端页面展示用JSP,后端处理服务的时候用Servlet,封装的与数据库表相对应的实体类即javabean。现在前后端分离,公司中主要用的架构是——Spring Boot + VUE。
二、Spring MVC的概念
1、SpringMVC的介绍
从上面这个Spring的整体架构图,我们可以发现Spring MVC并不是一个单独的框架,而是Spring框架的一部分,是基于Java实现的一个轻量级web框架。
学习SpringMVC框架最核心的就是DispatcherServlet的设计,掌握好DispatcherServlet是掌握SpringMVC的核心关键。
2、SpringMVC的优点
模式清晰,各模块之间解耦,通过各模块间的协同合作来处理前后端的交互。
3、SpringMVC的实现原理
springmvc的mvc模式:
SpringMVC的具体执行流程:
当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
1、DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求,DispatcherServlet接收请求并拦截请求。
2、HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据请求url查找Handler。
3、返回处理器执行链,根据url查找控制器,并且将解析后的信息传递给DispatcherServlet
4、HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
5、执行handler找到具体的处理器
6、Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
7、HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
8、DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
9、视图解析器将解析的逻辑视图名传给DispatcherServlet。
10、DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图,进行试图渲染
11、将响应数据返回给客户端
注意:以上的都是概念层面的东西,暂时不理解没关系,当我们熟练使用Spring MVC之后,有了相关的web开发经验之后再来看上面的理论东西,会有不一样的感受的。
三、Spring MVC的使用——基于注解
上面我们了解了Spring MVC的概念层面的理论知识,下面我们进行实际应用层面的操作。
补充:我们只演示如何通过注解来使用Spring MVC,注解简单快捷。我们不再演示通过XML文件的配置,因为用xml会很繁琐,实际中根本没人使用xml来进行开发。
以下操作基于IDEA开发演示,Eclipse进行开发有很多细节点是不一样的。
1、新建普通的Maven项目
2、添加web模块支持
右击项目名,可以发现一个选项如下:添加所需要支持的模块
此时在出现的功能区勾选Web Application模块支持即可:
然后我们就能发现在我们的项目目录结构下出现了一个新的目录
此时我们就能够在此目录结构下进行web开发了。
3、添加pom依赖
添加Spring框架以及web模块和mvc模块的支持
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<