MVC层次划分简述_mvc分层-程序员宅基地

技术标签: Spring MVC  MVC层次  

MVC层次划分简述


写在前面的一段话:

首先要知道MVC三层架构之间有什么关系:

  • MVC:【 Model(数据模型) - View(视图) - Controller(控制器) 】

  • 三层架构:【 Presentation tier(展现层) - Application tier(应用层)+Date tier(数据访问层) 】

很多人都有一个误解,认为Spring MVC的M、V、C对应三层架构,其实是不对的!MVC只是三层架构中的展现层,MVC中的M是数据模型,是包含数据的对象,通常我们使用Spring MVC的时候有一个包叫Model,里面放的类就是用来和V交互的,V就是视图界面,包jsp,html,freemarker,velocity,thymeleaf等,C就是控制器了(通常用@Controller注解的类)。

而整个三层架构,其实是由Spring负责全局管理的,一般Service和Dao跟应用层和数据访问层有关。
在这里插入图片描述


早期分层:[ M - V - C ]:

MVC框架强制性的把各层的实现功能划分开,各自处理各自的任务,利于解耦和,极大的增强了代码的可读性、维护性。

  • M(Model)数据模型——与数据库交互的数据模型,进行数据相关操作
  • V(View)视图——是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来,负责收集展示数据。
  • C(Controller)控制器——收到请求后,调用模型层与数据库交互获取数据,最后将数据返回给视图(用户), 负责整体的接收数据和逻辑处理处理 HTTP 请求的任何操作所必须经过的中介

1. Model的职责

对于Model而言,最主要就是保存事物的信息,保证事物的行为和对他可以进行操作。比如,Post类必然有一个用于保存博客文章标题的title属性,必然有一个删除的操作,这都是Model的内容。以下是关于Model的几个原则:

  1. 数据、行为、方法是Model的主要内容;
  2. 实际工作中,Model是MVC中代码量最大,逻辑最复杂的地方,因为关于应用的业务逻辑也要在这里表示;
  3. 注意与Controller区分开。Model是处理业务方面的逻辑Controller只是简单的协调Model和View之间的关系Controller 和套套一样,应该越薄越好。只要是与业务有关的,就该放在Model里面。好的设计,应该是胖Model,瘦Controller

2. View的职责

其中,View部分比较明确,就是负责显示。一切与显示界面无关的东西,都不应该出现在view里面。因此,view中一般不会出现复杂的判断语句,不会出现复杂的运算过程。对于Java的Web应用而言,毫无疑问,html和JSP是view中的主要内容。如下是关于view的几个原则:

  • 负责显示界面,以HTML为主;
  • 一般没有复杂的判断语句或运算过程,可以有简单的循环语句、格式化语句。比如,博客首页的文字列表就是一种循环;
  • 从不调用Model的写方法。也就是说,View只从Model中获取数据,从不改写Model,所以我们说他们是老死不相往来的。
  • 一般没有任何准备数据处理的内容,如查询数据库等。这些一般是放在Controller里面,并以变量的形式传给视图。也就是说,视图里面要用到的数据,就是一个变量。

3. Controller的职责

对于Controller,主要是响应用户请求:决定使用什么视图、需要准备什么数据用来显示。
以下是有关Controller的设计原则:

  • 用于处理用户请求,因此,对于request的访问代码应该放在Controller里面,比如doGETdoPOST等。但仅限于获取用户请求数据,不应该对数据有任何操作或预处理,这应该放在model里面。
  • 调用model类的方法,对model进行写操作。
  • 调用视图渲染函数,形成对用户request的response
  • 一般不要有html代码等其他表现层的东西,这应该是属于view的内容。

当用户通过浏览器发送请求到视图层(view)时,控制层(controller)分发调用模型层(model),进行数据库查询,接下来模型层(model)再将数据库查询到的数据返回给控制层(controller),控制层(controller)再将其返回给视图层(view),view层通过web页面把数据信息显示给用户。
在这里插入图片描述

Yii Framework 官方文档:In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.
在设计良好的MVC应用程序中,Controller通常非常薄,可能只包含几十行代码;而Model则非常胖,其中包含负责表示和操作数据的大多数代码。


目前市面上流行的实际分层方式[ S - D(M) - V - C ]:

以前,很多人认为可以直接在Controller层就调用model层来进行数据库的交互。但是这是不严谨的,耦合性太强,违背了MVC的初衷,即解耦。所以随着MVC学习的深入,慢慢地又加入到了业务层Service和数据访问层Dao:

  • D(Dao)数据访问对象——与数据库建立连接,封装了对数据库的CURD操作
  • S(Service)业务逻辑模型——做一些业务逻辑地处理,并给Controller返回结果
  • V(View)视图——是展示给用户的最终页面。视图负责将数据以用户友好的形式展现出来,负责收集展示数据。
  • C(Controller)控制器——接收用户传递过来的数据,将数据封装到实体类中,调用业务逻辑模型,进行业务逻辑的处理,根据业务逻辑模型返回的结果,进行不同的视图跳转。
    在这里插入图片描述
    当请求来了,controller就会将相应的请求分发到相应的service层,在service层中再调用dao层进行数据库交互。这里的dao层其实就是之前的model层,封装了对数据库的操作。这样一来,就把业务处理逻辑从controller中分离出来,从而实现了解耦。

一个典型的页面浏览行为在程序端的流程是这样的:

在这里插入图片描述

  1. 控制器最先被调用,并被赋予外部输入
  2. 控制器根据外部输入向模型请求数据
  3. 模型从数据库获取数据并发送数据到控制器
  4. 控制器处理该数据并发送封装好的数据到视图
  5. 视图根据接到的数据最终展示页面给用户浏览

使用Java进行MVC模式开发时,数据模型往往分为两部分,即DAO(Data Access Object,数据访问对象)和Service(业务逻辑模型)。在第2步中(控制器根据外部输入向模型请求数据),控制器向模型请求数据时,并不是直接向DAO请求数据,而是通过Service向DAO请求数据。这样做的好处是,可以将业务逻辑与数据库访问独立开,为将来系统更换数据保存介质(如目前系统使用文件系统存储数据,将来可以更换为使用数据库存储,又或者是现在使用了MySQL存储数据,将来更换为Oracle或是Mysql等)提供了很大的灵活性。另外,由工具层(util),实体类层(model/po/pojo)被其他层调用,为其提供服务。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38129062/article/details/88787397

智能推荐

python opencv resize函数_python opencv 等比例调整(缩放)图片分辨率大小代码 cv2.resize()...-程序员宅基地

文章浏览阅读1.3k次。# -*- coding: utf-8 -*-"""@File : 200113_等比例调整图像分辨率大小.py@Time : 2020/1/13 13:38@Author : Dontla@Email : [email protected]@Software: PyCharm"""import cv2def img_resize(image):height, width = image...._opencv小图等比例缩放

【OFDM、OOK、PPM、QAM的BER仿真】绘制不同调制方案的误码率曲线研究(Matlab代码实现)-程序员宅基地

文章浏览阅读42次。对于这些调制技术的误码率(BER)研究是非常重要的,因为它们可以帮助我们了解在不同信道条件下系统的性能表现。通过以上步骤,您可以进行OFDM、OOK、PPM和QAM的误码率仿真研究,并绘制它们的误码率曲线,以便更好地了解它们在不同信道条件下的性能特点。针对这些调制技术的BER研究是非常重要的,可以帮助我们更好地了解这些技术在不同信道条件下的性能表现,从而指导系统设计和优化。6. 分析结果:根据误码率曲线的比较,分析每种调制方案在不同信噪比条件下的性能,包括其容忍的信道条件和适用的应用场景。_ber仿真

【已解决】Vue的Element框架,日期组件(el-date-picker)的@change事件,不会触发。_el-date-picker @change不触发-程序员宅基地

文章浏览阅读2.5w次,点赞3次,收藏3次。1、场景照抄官方的实例,绑定了 myData.Age 这个值。实际选择某个日期后,从 vuetool(开发工具)看,值已经更新了,但视图未更新。2、尝试绑定另一个值: myData,可以正常的触发 @change 方法。可能是:值绑定到子对象时,组件没有侦测到。3、解决使用 @blur 代替 @change 方法。再判断下 “值有没有更新” 即可。如有更好的方法,欢迎评论!..._el-date-picker @change不触发

PCL学习:滤波—Projectlnliers投影滤波_projectinliers-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏8次。Projectlnliersclass pcl: : Projectlnliers< PointT >类 Projectlnliers 使用一个模型和一组的内点的索引,将内点投影到模型形成新的一个独立点云。关键成员函数 void setModelType(int model) 通过用户给定的参数设置使用的模型类型 ,参数 Model 为模型类型(见 mo..._projectinliers

未处理System.BadImageFormatException”类型的未经处理的异常在 xxxxxxx.exe 中发生_“system.badimageformatexception”类型的未经处理的异常在 未知模块。 -程序员宅基地

文章浏览阅读2.4k次。“System.BadImageFormatException”类型的未经处理的异常在 xxxx.exe 中发生其他信息: 未能加载文件或程序集“xxxxxxx, Version=xxxxxx,xxxxxxx”或它的某一个依赖项。试图加载格式不正确的程序。此原因是由于 ” 目标程序的目标平台与 依赖项的目标编译平台不一致导致,把所有的项目都修改到同一目标平台下(X86、X64或AnyCPU)进行编译,一般即可解决问题“。若果以上方式不能解决,可采用如下方式:右键选择配置管理器,在这里修改平台。_“system.badimageformatexception”类型的未经处理的异常在 未知模块。 中发生

PC移植安卓---2018/04/26_电脑软件移植安卓-程序员宅基地

文章浏览阅读2.4k次。记录一下碰到的问题:1.Assetbundle加载问题: 原PC打包后的AssetBundle导入安卓工程后,加载会出问题。同时工程打包APK时,StreamingAssets中不能有中文。解决方案: (1).加入PinYinConvert类,用于将中文转换为拼音(多音字可能会出错,例如空调转换为KongDiao||阿拉伯数字不支持,如Ⅰ、Ⅱ、Ⅲ、Ⅳ(IIII)、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ..._电脑软件移植安卓

随便推点

聊聊线程之run方法_start 是同步还是异步-程序员宅基地

文章浏览阅读2.4k次。话不多说参考书籍 汪文君补充知识:start是异步,run是同步,start的执行会经过JNI方法然后被任务执行调度器告知给系统内核分配时间片进行创建线程并执行,而直接调用run不经过本地方法就是普通对象执行实例方法。什么是线程?1.现在几乎百分之百的操作系统都支持多任务的执行,对计算机来说每一个人物就是一个进程(Process),在每一个进程内部至少要有一个线程实在运行中,有时线..._start 是同步还是异步

制作非缘勿扰页面特效----JQuery_单击标题“非缘勿扰”,<dd>元素中有id属性的<span>的文本(主演、导演、标签、剧情-程序员宅基地

文章浏览阅读5.3k次,点赞9次,收藏34次。我主要用了层次选择器和属性选择器可以随意选择,方便简单为主大体CSS格式 大家自行构造网页主体<body> <div class='main' > <div class='left'> <img src="images/pic.gif" /> <br/><br/> <img src="images/col.gif" alt="收藏本片"/&_单击标题“非缘勿扰”,元素中有id属性的的文本(主演、导演、标签、剧情

有了这6款浏览器插件,浏览器居然“活了”?!媳妇儿直呼“大开眼界”_浏览器插件助手-程序员宅基地

文章浏览阅读901次,点赞20次,收藏23次。浏览器是每台电脑的必装软件,去浏览器搜索资源和信息已经成为我们的日常,我媳妇儿原本也以为浏览器就是上网冲浪而已,哪有那么强大,但经过我的演示之后她惊呆了,直接给我竖起大拇指道:“原来浏览器还能这么用?大开眼界!今天来给大家介绍几款实用的浏览器插件,学会之后让你的浏览器“活过来”!_浏览器插件助手

NumPy科学数学库_数学中常用的环境有numpy-程序员宅基地

文章浏览阅读101次。NumPy是Python中最常用的科学数学计算库之一,它提供了高效的多维数组对象以及对这些数组进行操作的函数NumPy的核心是ndarray(N-dimensional array)对象,它是一个用于存储同类型数据的多维数组Numpy通常与SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,用于替代MatLabSciPy是一个开源的Python算法库和数学工具包;Matplotlib是Python语言及其Numpy的可视化操作界面'''_数学中常用的环境有numpy

dind(docker in docker)学习-程序员宅基地

文章浏览阅读1.1w次。docker in docker说白了,就是在docker容器内启动一个docker daemon,对外提供服务。优点在于:镜像和容器都在一个隔离的环境,保持操作者的干净环境。想到了再补充 :)一:低版本启动及访问启动1.12.6-dinddocker run --privileged -d --name mydocker docker:1.12.6-dind在其他容器访问d..._dind

推荐文章

热门文章

相关标签