一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了。

屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库和其他一些细节上的技术如何,总的来说大的框架结构都是差不多的。
说白了,也就是mvc和三层结构。

而mvc和三层结构究竟是什么关系,我曾在面试的过程中被人问过几次,也曾仔细的想过、查过这个问题,但是直到此时,我也还是不能完全确定。

只不过随着时间的积累,随着技术的沉淀,随着视野的拓宽,我大体上认同了两种说法,不管别人怎么看,我个人是觉得两种说法都有道理,欢迎对这个问题有不同看法的朋友一起讨论。

三层结构是什么,是展现层、应用层、数据访问层,这个基本上是没有太大的异议的,两种看法的来源基本上都是来自对于mvc的理解。

对于Java web应用来说,不管是B/S还是C/S,大体上都可以分成服务端和客户端两部分,只不过B/S的客户端就是公用的浏览器。

基于这种大的架构,有一种对于mvc的说法就是:

m是model,也就是和数据库相关的那些,比如实体类和dao、mapper.xml等,
对应着三层结构的数据访问层;
v是view,也就是前台的页面或者说是客户端展示给用户看的东西,也就是展现层;
而c就是controller以及service等具体的业务逻辑,对应着三层结构的应用层。

  • 1

  • 2

  • 3

  • 1

  • 2

  • 3

这种说法我觉得应该是为了对应而对应,就是要把mvc和三层结构的关系一一对应起来,因此也差不多就是一个对应一个。

或许是经验还不够多的缘故,或许本来就是这样子,反正我是觉得这种说法正确,或者更确切的说,这是大的mvc。

那么还有一种说法可能就不是像上边这样一一对应了,大体上的说法是这样的:

我们通常所说的mvc实际上只是对应了三层结构中的展现层,也就是view而已,然后v是
客户端,m是实体,c是controller。
至于三层结构中的应用层和数据访问层则是分别对应了后台代码中的service和dao。

  • 1

  • 2

  • 1

  • 2

而对于这种说法,为什么我觉得有道理呢?是因为按照这种描述,就是和前台展示直接相关的东西都放在展现层。

*比如controller要直接和url打交道,而很多时候返回给客户端的数据也会封装成对象的形式,经常就是model;也就是说不管是controller还是model,都实打实和用户看得到的部分相关,就划为了展现层。

只不过在某些时候,就比如我们现在的项目中,为了进一步的实现松耦合,我们会创建一个command类,类似于实体model,然后用model操作数据库,用command和前台打交道,道理是一样的。

而在另一方面,我们现在项目前端使用的技术是angular js,这项技术现在也说实现了前台的mvc,有controller、service,还有数据层。

因此在这种情况下,我个人就觉得,mvc本就是一个概念,重要的是一种理解,它本身的作用只是为了实现松耦合,而不是为了mvc而mvc,未必一定要有一个唯一的答案!

以下是我觉得比较好的其他理解:
来自百度百科的说法,是否是标准?

MVC(模型Model-视图View-控制器Controller)是一种架构模式,可以用它来创建在域对象和UI表示层对象之间的区分。

同样是架构级别的,相同的地方在于他们都有一个表现层,但是他们不同的地方在于其他的两个层。

在三层架构中没有定义Controller的概念。这是最不同的地方。而MVC也没有把业务的逻辑访问看成两个层,这是采用三层架构或MVC搭建程序最主要的区别。当然了。在三层中也提到了Model,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。

这是来自百度知道的说法,是否专业?

MVC和三层架构有什么区别就是MVC是最流行的三层架构中的一种框架,就是模型-视图-控制器三者分离。

MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式最早由Trygve Reenskaug在1978年提出[1] ,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。

MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。

专业人员可以通过自身的专长分组:
控制器(Controller)- 负责转发请求,对请求进行处理。 视图(View) - 界面设计人员进行图形界面设计。 模型(Model)

程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

来自来看日出的评论,我觉得有道理

无意中看到这个问题,我前段时间也想了很久,今天看到有点感触,不知道您怎么看,我一直其实有疑惑的(一个刚参加工作的新人)对于mvc的三层架构,设计理念是为了实现高内聚低耦合,您说得第一种三层结构,我觉得其实并没有达到这个低耦合的效果。

因为在应用层处理业务时,并没有将真正的业务逻辑和数据库逻辑分离开来,仅仅将视图和逻辑分离开了,并没有达到低耦合的效果,个人觉得这并不是真正的MVC。

个人的理解,mvc应该分为5层。

1.视图层(html/jsp/)等用户能看得到的信息,数据信息的开始和结束。

2.控制层(servlet/action),控制层不处理任何业务(包括业务逻辑和数据库逻辑),只为控制流程,实现跳转功能,只调用service层的结果实现跳转功能,控制层的逻辑更偏向视图层,为视图层提供服务。

3.服务层(service):专门处理业务逻辑,是控制层和DAO的中间过渡层,根据DAO层的返回结果的不同,处理不同的业务逻辑,并将结果向上返回给控制层。

4.DAO层:专门处理各种数据库逻辑,包括对数据库的CRUD,存储过程/函数各种操作,提供访问数据库的接口,DAO层更偏向于model。

5.数据模型层:专门封装数据原始模型(javabean/DTO),本身不提供任何对数据库的操作,只提供接口供DAO层调用数据。 从上到下依次为视图层,控制层,服务层,DAO层,数据模型层。 个人理解,新人刚入门,有错误的地方希望指出共同学习。

我对来看日出的回复如下:

实际上,我个人现在的观点是,我觉得我说的两种都有道理,而你说的这一种也有道理,只看出发点是什么,能不能说通。

你的这种说法,应该是实际开发时的代码结构,后端通常有model、dao、service、controller,但是现在的前端,就比如我们用的angular js,实际上也分成了数据模型层、servie层、controller层、html展示层。

因此,我的理解是,网上常见的mvc解释应该是针对之前整个系统架构比较简单的情况,而现在前后端各种架构和技术都复杂起来了,可能便不能再这样简单的对应。

也就是说,我说的两种实际上对于现在的情况可能都不对了。

随着工作时间的增长,我对这个问题的看法一直在变,或许就是那句“看山是山,然后看山不是山,然后看山是山”,理解性的东西,本来就会随着个人的阅历增长而变化,今天觉得对的可能明天就觉得错了。

所以,归根结底,我觉得可以回到主题:我觉得对错不重要,重要的是能不能说通,是不是自己的理解,对也好,错也罢,能说的有理有据就够了,因为理解会变。

觉得本文有帮助?请分享给更多人

关注「猿助猿」成就顶级开发

java中的mvc三层结构究竟有什么关系相关推荐

  1. Java三层结构的概念_Java中的mvc和三层结构究竟是什么关系

    原标题:Java中的mvc和三层结构究竟是什么关系 一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了. 屈指一算,手 ...

  2. java中的mvc和三层结构究竟是什么关系

    一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了. 屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库 ...

  3. Java中使用MVC三层架构做登陆验证

    这里主要的内容是有关Java中MVC三层架构 目录 原始的登陆验证 分层改进(每个代码都是登录和验证两个功能) 使用分层想法做登陆验证 User类 表现层 业务层 持久层 原始的登陆验证 原始的登陆验 ...

  4. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  5. asp.net MVC三层结构代码生成器

    asp.net MVC三层结构代码生成器 一.使用MVC开发的朋友都有一个苦恼,那就是三层结构大量重复代码比较鸡肋,写之无味,不写不行.最近也是从网上找了一些资料,自己又简单加工下,完善了该工具. 1 ...

  6. java语言如何跳转界面_在java中spring mvc页面如何跳转,详细图解

    众所周知,java编程语言的应用在当今社会必不可少,它是当下人们提升自己充实自身的重要选择.所以,今天主要来为大家介绍java的入门知识,在 java中spring mvc页面如何跳转,通过详细的图片 ...

  7. 用java设计一个二叉树类的结构,在JAVA中实现的二叉树结构

    在JAVA中实现的二叉树结构 [日期:2008-12-16] 来源:IT专家网 作者:竹一 [字体:大 中 小] * * 讲解: * 二个方法函数,一个寻找关键字--searchkey 另一个是插入一 ...

  8. JSPEL表达式MVC三层结构综合案例

    文章目录 JSP 1,JSP 概述 2,JSP 快速入门 2.1 搭建环境 2.2 导入 JSP 依赖 2.3 创建 jsp 页面 2.4 编写代码 2.5 测试 3,JSP 原理 4,JSP 脚本 ...

  9. JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...

    本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...

最新文章

  1. Flutter开发之名篇及demo收录
  2. [YTU]_2619 (B 友元类-计算两点间距离)
  3. 北京出台快递业价格行为规则 不得收取未予标明的费用
  4. VS2019如何修改字体大小
  5. 效率:标记语言:markdown
  6. mysql alisql_初次安装aliSql
  7. ckPlayer播放器嵌入页面时报错CKobject is not defined解决方案
  8. window的渊源、发展过程、趋势
  9. 用Markdown来创建待办事项
  10. 计算机表格做八折怎么辛,原来古人的书信常用语那么美
  11. Jetty容器SSL证书的安装
  12. 项目构建工具--webpack
  13. U3d引擎崩溃、异常、警告、BUG与提示总结及解决方法
  14. 卸载wps后office图标无法显示(亲测有效)
  15. 内外网安全文件摆渡如何实现自动化?
  16. 开源100天,OneFlow送上“百天大礼包”:深度学习框架如何进行性能优化?
  17. 食物链(种类并查集)
  18. 主编编辑器如何在文章下方插入往期回顾?
  19. mysql中如何求出学生人数,mysql中如何查询同时参加计算机考试和英语考试的学生人数...
  20. 解决kindeditor编辑器因为flash机制导致的图片批量上传按钮看不见的问题

热门文章

  1. 树的应用 —— 树的存储
  2. javaSE基础测试之第二次周考
  3. 孟广禄上演全本《铡美案》
  4. ICT 2017 | 斑马网络郝飞:当汽车走进智联网时代
  5. 基于Blod的ajax进度条下载实现
  6. @RequestMapping中的produces的作用和使用方式
  7. 财报解读:创维集团2022年业绩表现凸显韧性,新能源业务将大有作为
  8. mysql 查所有的用户_MySQL查看所有用户 - MySQL 系列教程
  9. 【考试】2023年5月软件设计师考试感受
  10. Matlab上位机开发