一件事,要知其然往往很简单,要知其所以然通常不是那么容易,就如最近重新巩固spring的过程中,就觉得还有许多问题其实并不是十分明了。
屈指一算,手头上做过的正式项目也有了四五六七个了,不管用的数据库和其他一些细节上的技术如何,总的来说大的框架结构都是差不多的。
说白了,也就是mvc和三层结构。
而mvc和三层结构究竟是什么关系,我曾在面试的过程中被人问过几次,也曾仔细的想过、查过这个问题,但是直到此时,我也还是不能完全确定。
只不过随着时间的积累,随着技术的沉淀,随着视野的拓宽,我大体上认同了两种说法,不管别人怎么看,我个人是觉得两种说法都有道理,欢迎对这个问题有不同看法的朋友一起讨论。
三层结构是什么,是展现层、应用层、数据访问层,这个基本上是没有太大的异议的,两种看法的来源基本上都是来自对于mvc的理解。
对于java web应用来说,不管是B/S还是C/S,大体上都可以分成服务端和客户端两部分,只不过B/S的客户端就是公用的浏览器。
基于这种大的架构,有一种对于mvc的说法就是:
m是model,也就是和数据库相关的那些,比如实体类和dao、mapper.xml等,对应着三层结构的数据访问层;
v是view,也就是前台的页面或者说是客户端展示给用户看的东西,也就是展现层;
而c就是controller以及service等具体的业务逻辑,对应着三层结构的应用层。
这种说法我觉得应该是为了对应而对应,就是要把mvc和三层结构的关系一一对应起来,因此也差不多就是一个对应一个。
或许是经验还不够多的缘故,或许本来就是这样子,反正我是觉得这种说法正确,或者更确切的说,这是大的mvc。
那么还有一种说法可能就不是像上边这样一一对应了,大体上的说法是这样的:
我们通常所说的mvc实际上只是对应了三层结构中的展现层,也就是view而已,然后v是客户端,m是实体,c是controller。
至于三层结构中的应用层和数据访问层则是分别对应了后台代码中的service和dao。
而对于这种说法,为什么我觉得有道理呢?是因为按照这种描述,就是和前台展示直接相关的东西都放在展现层。
比如controller要直接和url打交道,而很多时候返回给客户端的数据也会封装成对象的形式,经常就是model;也就是说不管是controller还是model,都实打实和用户看得到的部分相关,就划为了展现层。
只不过在某些时候,就比如我们现在的项目中,为了进一步的实现松耦合,我们会创建一个command类,类似于实体model,然后用model操作数据库,用command和前台打交道,道理是一样的。
而在另一方面,我们现在项目前端使用的技术是angular js,这项技术现在也说实现了前台的mvc,有controller、service,还有数据层。
因此在这种情况下,我个人就觉得,mvc本就是一个概念,重要的是一种理解,它本身的作用只是为了实现松耦合,而不是为了mvc而mvc,未必一定要有一个唯一的答案!
欢迎有其他理解的朋友留言交流!