讲完SpringBoot之后,我们再来看SpringMVC
什么是MVC
MVC英文是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计规范。本质上也是一种解耦。
核心思想是用一种业务逻辑、数据、界面显示分离的方法,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。
•视图(view):为用户提供使用界面,与用户直接进行交互。 •模型(model):代表一个存取数据的对象或JAVA POJO(Plain Old Java Object,简单java对象)。它也可以带有逻辑,主要用于承载数据,并对用户提交请求进行计算的模块。模型分为两类,一类称为数据承载 Bean,一类称为业务处理Bean。所谓数据承载 Bean是指实体类(如:User类),专门为用户承载业务数据的;而业务处理 Bean 则是指Service或 Dao 对象,专门用于处理用户提交请求的。
•控制器(controller):用于将用户请求转发给相应的Model进行处理,并根据Model的计算结果向用户提供相应响应。它使视图与模型分离。
注:实际上,Plain Ordinary Java Object 并不是一个正式的术语,通常是对 Plain Old Java Object 的误称或变体表达。由于“Plain Old Java Object”有时被误写为“Plain Ordinary Java Object”,但它们指的是同一概念。
定义:POJO 是一种普通的 Java 对象,不继承或实现任何特殊的 Java 框架、库或规范。它们通常只是具有属性(字段)和简单方法(如 getter 和 setter 方法)的类,没有任何特定的依赖或特殊的行为。这个术语通常用于区分与特定框架或技术绑定的复杂 Java 对象,如 EJB(Enterprise JavaBeans)对象。
目的:是强调普通的 Java 对象与复杂的、框架绑定的对象的区别。
流程步骤: 1.用户通过View 页面向服务端提出请求,可以是表单请求、超链接请求、AJAX 请求等 2.服务端 Controller 控制器接收到请求后对请求进行解析,找到相应的Model,对用户请求进行处理Model处理; 3.将处理结果再交给 Controller(控制器其实只是起到了承上启下的作用); 4.根据处理结果找到要作为向客户端发回的响应View页面,页面经渲染后发送给客户端。
什么是SpringMVC
简单而言,Spring MVC是Spring在Spring Container Core和AOP等技术基础上,遵循上述Web MVC的规范推出的web开发框架,目的是为了简化Java栈的web开发。
Spring Web MVC 是一种基于Java 的实现了Web MVC 设计模式的请求驱动类型的轻量级Web框架,即使用了MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。
Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。
MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的 Web 层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。
SpringMVC 三层架构
java SpringMVC的工程结构一般来说分为三层,自下而上是Modle层(模型,数据访问层)、Cotroller层(控制,逻辑控制层)、View层(视图,页面显示层),其中Modle层分为两层:dao层、service层,MVC架构分层的主要作用是解耦。采用分层架构的好处,普遍接受的是系统分层有利于系统的维护,系统的扩展。就是增强系统的可维护性和可扩展性。
对于Spring这样的框架,(View\Web)表示层调用控制层(Controller),控制层调用业务层(Service),业务层调用数据访问层(Dao)。
一、模型层(Model)
模型层是SpringMVC架构中的最底层,主要负责数据处理和业务逻辑的实现。模型层通常分为两层:DAO层和Service层。
-
DAO层:DAO层即数据访问层(Data Access Object),也称为持久层,负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的。在DAO层中,我们可以使用JDBC、MyBatis、Hibernate等技术进行数据库操作。
Spring DAO 使得 JDBC,Hibernate 或 JDO 这样的数据访问技术更容易以一种统一的方式工作。这使得用户容易在持久性技术之间切换。它还允许您在编写
代码时,无需考虑捕获每种技术不同的异常。
-
Service层:Service层即业务层,用来实现业务逻辑。业务层在业务处理时可能会依赖持久层,Service层可以调用DAO层进行数据操作,并返回数据对象DO(Data Object)或业务对象BO(Business Object)。BO通常由DO转化、整合而来,可以包含多个DO的属性,也可以是只包含一个DO的部分属性。Service层的设计使得业务逻辑与数据访问逻辑相分离,提高了代码的可维护性和可扩展性。
二、控制层(Controller)
控制层是SpringMVC架构中的中间层,主要负责处理用户发送的请求,并调用模型层的相关方法进行数据处理。控制层通常使用@Controller注解进行标识,并使用@RequestMapping注解来映射请求路径。在控制层中,我们可以使用@Autowired注解将Service层注入进来,从而实现对业务逻辑的调用。
三、视图层(View)
视图层是SpringMVC架构中的最上层,主要负责数据的展示。视图层通常使用JSP、Thymeleaf等模板引擎进行页面的渲染。在SpringMVC中,视图层与控制层之间通过ModelAndView对象进行数据传输。当控制层处理完请求后,会将结果封装到ModelAndView对象中,并返回给视图层进行渲染。
在实际开发中dao层要先定义出自己的操作标准即标准接口,就是为了解耦合。
软件设计原则:高内聚低耦合。
高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间
的联系程度越高,则内聚性越高,即 "高内聚"。
低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。
单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利用后期的维护。
经典的MVC三层架构
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
SpringMVC的处理流程
Spring MVC 的核心组件有哪些
记住了下面这些组件,也就记住了 SpringMVC 的工作原理。
-
DispatcherServlet
:核心的中央处理器,负责接收请求、分发,并给予客户端响应。 -
HandlerMapping
:处理器映射器,根据 URL 去匹配查找能处理的Handler
,并会将请求涉及到的拦截器和Handler
一起封装。 -
HandlerAdapter
:处理器适配器,根据HandlerMapping
找到的Handler
,适配执行对应的Handler
; -
Handler
:请求处理器,处理实际请求的处理器。 -
ViewResolver
:视图解析器,根据Handler
返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给DispatcherServlet
响应客户
SpringMVC 工作原理
Spring MVC 原理如下图所示:
流程说明(重要):
-
客户端(浏览器)发送请求,
DispatcherServlet
拦截请求。 -
DispatcherServlet
根据请求信息调用HandlerMapping
。HandlerMapping
根据 URL 去匹配查找能处理的Handler
(也就是我们平常说的Controller
控制器) ,并会将请求涉及到的拦截器和Handler
一起封装。 -
DispatcherServlet
调用HandlerAdapter
适配器执行Handler
。 -
Handler
完成对用户请求的处理后,会返回一个ModelAndView
对象给DispatcherServlet
,ModelAndView
顾名思义,包含了数据模型以及相应的视图的信息。Model
是返回的数据对象,View
是个逻辑上的View
。 -
ViewResolver
会根据逻辑View
查找实际的View
。 -
DispaterServlet
把返回的Model
传给View
(视图渲染)。 -
把
View
返回给请求者(浏览器)