SpringMVC与三层架构

news2024/11/24 15:25:03

目录

    • 一、SpringMVC
      • 1.1 概述
      • 1.2 SpringMVC核心组件
      • 1.3 SpringMVC工作原理
      • 1.4 统一异常处理
    • 二、三层架构
    • 三、MVC与三层架构
      • 3.1 三层架构与MVC的关系
      • 3.2 SSM与三层架构的对应关系

一、SpringMVC

1.1 概述

MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
请添加图片描述
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  • View: 视图,为用户提供使用界面,与用户进行交互。
  • Model: 模型承载数据,对用户提交请求进行计算的模块,分为两类:
    • 数据承载bean,数据承载bean是指实体类专门承载业务数据的,比如Student,User。
    • 业务承载bean,业务处理bean是指Service或者Dao对象,专门处理用户的请求的。
  • Controller:控制器,用来将用户请求转发给相应的Model进行处理,并且根据Model的计算结果向用户提供相应的响应。

想要真正理解 Spring MVC,我们先来看看 Model 1 和 Model 2 这两个没有 Spring MVC 的时代。
Model 1 时代
很多学 Java 后端比较晚的朋友可能并没有接触过 Model 1 时代下的 JavaWeb 应用开发。在 Model1 模式下,整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。这个模式下 JSP 即是控制层(Controller)又是表现层(View)。显而易见,这种模式存在很多问题。比如控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;再比如前端和后端相互依赖,难以进行测试维护并且开发效率极低。
在这里插入图片描述

Model 2 时代
学过 Servlet 并做过相关 Demo 的朋友应该了解“Java Bean(Model)+ JSP(View)+Servlet(Controller) ”这种开发模式,这就是早期的 JavaWeb MVC 开发模式。

  • Model:系统涉及的数据,也就是 dao 和 bean。
  • View:展示模型中的数据,只是用来展示。
  • Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。
    在这里插入图片描述

Model2 模式下还存在很多问题,Model2 的抽象和封装程度还远远不够,使用 Model2 进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是,很多 JavaWeb 开发相关的 MVC 框架应运而生比如 Struts2,但是 Struts2 比较笨重。

Spring MVC 时代
随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的 Web 层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。

1.2 SpringMVC核心组件

  • DispatcherServlet:核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping:处理器映射器,根据 uril去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • HandlerAdapter:处理器适配器,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;
  • Handler:请求处理器,处理实际请求的处理器。
  • ViewResolver:视图解析器,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

1.3 SpringMVC工作原理

Spring MVC 工作流程:
在这里插入图片描述

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 返回给请求者(浏览器)

1.4 统一异常处理

推荐使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice + @ExceptionHandler 这两个注解 。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
    @ExceptionHandler(BaseException.class)
    public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) {
      //......
    }

    @ExceptionHandler(value = ResourceNotFoundException.class)
    public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {
      //......
    }
}

这种异常处理方式下,会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被@ExceptionHandler 注解修饰的方法进行处理。

ExceptionHandlerMethodResolver 中 getMappedMethod 方法决定了异常具体被哪个被 @ExceptionHandler 注解修饰的方法处理异常。

@Nullable
	private Method getMappedMethod(Class<? extends Throwable> exceptionType) {
		List<Class<? extends Throwable>> matches = new ArrayList<>();
    //找到可以处理的所有异常信息。mappedMethods 中存放了异常和处理异常的方法的对应关系
		for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {
			if (mappedException.isAssignableFrom(exceptionType)) {
				matches.add(mappedException);
			}
		}
    // 不为空说明有方法处理异常
		if (!matches.isEmpty()) {
      // 按照匹配程度从小到大排序
			matches.sort(new ExceptionDepthComparator(exceptionType));
      // 返回处理异常的方法
			return this.mappedMethods.get(matches.get(0));
		}
		else {
			return null;
		}
	}

从源代码看出:getMappedMethod()会首先找到可以匹配处理异常的所有方法信息,然后对其进行从小到大的排序,最后取最小的那一个匹配的方法(即匹配度最高的那个)。

二、三层架构

三层架构是指:视图层view,服务层service,持久层Dao,通常也叫(表示层UI,业务逻辑层BLL,数据访问层DAL)它们的功能是:

  • view层: 用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面
  • service层:实现业务的主要逻辑,是系统架构中体现核心价值的部分。
  • Dao层:有时候也称为是持久层,其功能主要是负责数据库的访问。可以访问数据库、二进制文件、文本文件等。简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

三层架构的出现是为了降低耦合度,在这里,使用面向抽象编程,也就是上层对下层的调用,直接通过接口来完成,下层对上层的真正服务提供者是下层实现的接口实现类,实现类是可以更换的,这就实现了层间的解耦合。

实际项目中的包命名结构,其实就是三层架构的体现:

xxx:代表公司名称yyy:代表项目名称
com.xxx.yyy.daodao层接口
com.xxx.yyy.dao.impldao层实现
com.xxx.yyy.serviceservice层接口
com.xxx.yyy.service.implservice层实现
com.xxx.yyy.webweb层
com.xxx.yyy.util工具包
com.xxx.yyy.domainjavabean

三、MVC与三层架构

3.1 三层架构与MVC的关系

三层架构与MVC毫无关系。 之所以这样说,是因为它们二者使用范围不同:三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决B-S应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。之所以我们会混淆,是因为在进行web开发时两者会同时使用。

在三层架构设计中,表示层可由MVC设计模式中的视图和控制器来实现,而业务逻辑层和数据访问层则组成MVC设计模式中的模型的实现。因此,在实际的应用中,都是采用三层架构来搭建系统的框架,而表示层与业务逻辑层和数据访问层的交互则是通过MVC设计模式来实现。
在这里插入图片描述

3.2 SSM与三层架构的对应关系

SSM,即Spring、SpringMVC与Mybatis的统称。

  • Spring:是整个应用的大管家,整个应用中所有的bean的生命周期行为,都是由Spring来管理的,就是说整个应用中所有的对象的创建,初始化,销毁,以及对象之间关联的关系维护,都是由Spring来进行管理。
  • SpringMVC:作为view的实现者,它的controller作为整个应用的控制器,完成用户请求的转发和对用户的响应。
  • Mybatis:作为Dao的实现者,完成数据库的增删改查等功能。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单元测试用例分组 demo

文章目录 目标1、使用 Category 进行用例分组&#xff08;1&#xff09;设置用例组&#xff08;2&#xff09;编写测试类&#xff0c;case设置对应的用例组&#xff08;3&#xff09;编写执行类&#xff08;4&#xff09;查看运行结果&#xff08;5&#xff09;联系项目 2、参数…

一文搞懂IS-IS报文通用格式

报文格式 IS-IS报文是直接封装在数据链路层的帧结构中的。PDU可以分为两个部分&#xff0c;报文头和变长字段部分。其中头部又可分为通用头部和专用头部。对于所有PDU来说&#xff0c;通用报头都是相同的&#xff0c;但专用报头根据PDU类型不同而有所差别。 IS-IS的PDU有4种类…

Crond计划任务与用户权限提升

目录 一、Crond计划任务 二、用户权限提升 一、Crond计划任务 1&#xff09;一次性任务&#xff1a; at实现&#xff0c;atd服务 查看atd服务的状态&#xff1a;systemctl status atd 书写at任务之前要查看系统时间&#xff1a;date或者hwclock 案例&#xff1a; at ti…

git教程(第一次使用)

一、gitee和github区别 二、git使用 下载地址 windows&#xff1a;https://gitforwindows.org/ mac&#xff1a;http://sourceforge.net/projects/git-osx-installer/ 1.git初次运行前的配置 &#xff08;1&#xff09;配置用户信息 git config --global user.name "…

C#调用百度翻译API自动将中文转化为英文,按行转换

我们可以使用百度翻译API获取到翻译结果 翻译API地址&#xff1a; http://api.fanyi.baidu.com/api/trans/vip/translate 一、新建窗体应用程序TranslatorDemo&#xff0c;将默认的Form1重命名为FormTranslator。 窗体FormTranslator设计器如图&#xff1a; 窗体设计器源代码…

最强“双非”!所有专业爆冷!最低273分上岸!

一、学校及专业介绍 深圳大学&#xff08;Shenzhen University&#xff09;&#xff0c;简称“深大”&#xff0c;位于广东省深圳市。入选广东省高水平大学重点建设高校&#xff0c;粤港澳高校联盟成员单位。深圳大学于1983年经中华人民共和国国务院批准创办。北京大学援建中文…

笛卡尔积文本的python处理

一 背景 大致背景是这样的&#xff0c;笔者在做数据处理时&#xff0c;遇到一个棘手的事情&#xff0c;主要遇到如下字符串拼接变动的场景&#xff0c;场景主要为&#xff0c;需要考虑如下两张表的组合&#xff1a; 表1-原始文本样式 序号文本样式1A变量B2A变量C3A变量CD4E变…

Promise详细版

promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱&#xff1a; //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…

RocketMQ Learning(一)

目录 一、RocketMQ 0、RocketMQ的产品发展 1、RocketMQ安装 1.1、windows下的安装 注意事项 1.2、Linux下的安装 1.3、源码的安装 1.4、控制台 2、消息发送方式 2.1、发送同步消息 2.2、发送异步消息 2.3、单向发送 3、消息消费方式 3.1、负载均衡模式&#xff0…

生活小妙招之UE custom Decal

因为这几年大部分时间都在搞美术&#xff0c;所以博客相关的可能会鸽的比较多&#xff0c;阿巴阿巴 https://twitter.com/Tuatara_Games/status/1674034744084905986 之前正好看到一个贴花相关的小技巧&#xff0c;正好做一个记录&#xff0c;也在这个的基础上做一些小的拓展…

子集——力扣78

文章目录 题目描述法一 迭代法实现子集枚举题目描述 法一 迭代法实现子集枚举 class Solution {public:vector<int> t;vector<vector<

【C++基础】友元总结一些坑

友元类 友元类&#xff08;Friend Class&#xff09;是一种在C中用于实现类之间访问权限的特殊机制。通过友元类&#xff0c;一个类可以允许另一个类访问其私有成员&#xff0c;甚至可以使另一个类成为其友元&#xff0c;使其能够访问所有成员&#xff0c;包括私有成员。这种机…

[HDLBits] Exams/m2014 q4f

Implement the following circuit: module top_module (input in1,input in2,output out);assign out (!in2)&in1; endmodule

gma 2 教程(二)数据操作:5. 多维科学数据

多维科学数据定义 如下图所示&#xff0c;gma将多维栅格定义为N&#xff08;>1&#xff09;个普通栅格数据集&#xff08;DataSet&#xff09;1组&#xff08;记录多维数据信息的&#xff09;元数据组成的多数据集&#xff08;MultiDataSets&#xff09;。   注&#xff1…

Leetcode.2146 价格范围内最高排名的 K 样物品

题目链接 Leetcode.2146 价格范围内最高排名的 K 样物品 rating : 1837 题目描述 给你一个下标从 0 0 0 开始的二维整数数组 g r i d grid grid &#xff0c;它的大小为 m x n &#xff0c;表示一个商店中物品的分布图。数组中的整数含义为&#xff1a; 0 表示无法穿越的一…

伪原创小发猫怎么样【php源码】

大家好&#xff0c;小编为大家解答初学者自学python哪本书好的问题。很多人还不知道自学python需要什么基础&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广…

TCP三次握手、四次握手过程,以及原因分析

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥手&…

vs code remote ssh: Resolver error: Error: Got bad result from install script

今天像往常一样&#xff0c;打开 windows 11&#xff0c;使用 vs code 远程连接服务器 ubuntu 20&#xff0c;但是遇到了一个错误&#xff1a;Resolver error: Error: Got bad result from install script。 ok&#xff01;&#xff01;&#xff01;开始 Bing &#xff01;&…

.Net C# 免费PDF合成软件

最近用到pdf合成&#xff0c;发现各种软件均收费啊&#xff0c;这个技术非常简单&#xff0c;别人写好的库一大把&#xff0c;这里用到了PDFsharp&#xff0c;项目地址Home of PDFsharp and MigraDoc Foundation 软件下载地址 https://download.csdn.net/download/g313105910…

OBD针脚定义参考

OBD定义的一种标准的参考&#xff0c;不同的车场有不同的定义&#xff0c;貌似没有统一。 在某宝上看到的ODB转db9的不同的线序&#xff1a; 1&#xff09;1/2/3/6几个针脚都是一样的&#xff0c;分别上下针脚对应。 2&#xff09;其中一种4/5/7/8也是上下对应的&#xff1b;另…