本材料属于“企业发展导论”系列。之前文章关于人脉拓展关于软件架构关于HTTP/HTTPS关于Maven的基础知识关于 Servlets编写一个简单的网页应用关于servlet容器在本文中我们将了解一种叫做MVC的东西。我们将讨论什么是MVC介绍其历史探讨MVC中体现的基本理念和概念逐步了解如何将应用拆分为模型模块、视图模块和控制器模块使用Spring Boot编写一个小型网页应用并以Spring MVC为例了解数据如何从Java代码传输到HTML页面。 要理解这些材料你需要熟悉设计模式尤其是观察者和立面。熟悉HTTP请求和响应了解HTML基础知识并了解Java注释是什么。 拿杯咖啡和零食放松一下。我们开始吧。MVC的历史MVC的理念由特里格维·雷恩斯考格在1970年代末于施乐帕洛阿尔克研究中心工作时提出。那时操作计算机需要学位和不断研读大量文献。 Reenskaug 与一组非常优秀的开发者共同完成的任务是简化普通用户与计算机的交互。有必要创造一方面极其简单易懂的工具另一方面又能使计算机和复杂应用能够控制。 Reenskaug曾参与开发“适合各年龄段儿童”的笔记本电脑团队——Dynabook以及由Alan Kay领导的SmallTalk语言。 那时友好界面的概念被确立了。在许多方面Reenskaug及其团队的工作影响了IT领域的发展。 这里有一个有趣的事实虽然不直接适用于MVC但说明了这些发展的重要性。 艾伦·凯说“当我第一次接触苹果时是在1984年Mac已经上市《新闻周刊》联系我问我对Mac的看法。我说Mac是第一台足够好、值得被批评的个人电脑。所以在2007年宣布iPhone后他把它拿给了我并递给了我。他说艾伦这部电影好到值得批评吗我说史蒂夫把它做成像平板电脑那么大你就能统治世界。” 三年后2010年1月27日苹果推出了9.7英寸对角线的iPad。换句话说史蒂夫·乔布斯几乎完全遵循了艾伦·凯的建议。 Reenskaug的项目持续了10年。但关于MVC的第一篇出版物是在又过了十年后才曝光的。Martin Fowler多本软件架构书籍和文章的作者提到他是用Smalltalk的一个可工作版本学习MVC。 由于长期没有关于MVC的原始资料以及其他多种原因这一概念出现了大量不同的解释。 因此许多人认为MVC是一种设计模式。较少见的是MVC被称为复合模式或是多个模式的组合协同工作以创建复杂的应用程序。 但如前所述MVC实际上主要是一套架构理念/原则/方法可以用不同的模式以多种方式实现...... 接下来我们将探讨MVC概念中蕴含的主要思想。MVC基本理念与原则VC是一套用于构建具有用户界面的复杂信息系统的架构理念和原则MVC 是 Model-View-Controller 的缩写免责声明MVC不是设计模式。MVC 是一套用于构建具有用户界面的复杂系统的架构理念和原则。但为了方便起见为了避免反复说“一组建筑理念......”我们会参考MVC模式。 先从简单的开始。“模型-视图-控制器”这两个词背后隐藏着什么 在使用MVC模式开发带有用户界面的系统时你需要将系统划分为三个部分。它们也可以被称为模块或组件。你可以怎么称呼它们但要把系统分成三个部分。每个组件都有其用途。模特。第一个组件/模块称为模型。它包含了应用的所有业务逻辑。View。系统的第二部分是视野。该模块负责向用户显示数据。用户看到的所有内容都是由视图生成的。控制者。这条链的第三环是控制器。它包含负责处理用户操作的代码所有用户操作都在控制器中处理。 模型是系统中最独立的部分。独立到它对视图和控制器模块一无所知。该模型非常独立开发者几乎对视角和控制器一无所知。 视图的主要目的是以用户可接受的格式提供模型信息。该观点的主要限制是不能以任何方式改变模型。 控制器的主要作用是处理用户操作。用户通过控制器对模型进行修改。更准确地说是对存储在模型中的数据。 这是你之前在课程中看到的示意图从这些中我们可以得出一个合乎逻辑的结论。复杂的系统需要被划分为模块。 让我们简要介绍实现这种分离的步骤。第一步。将应用的业务逻辑与用户界面分离MVC的主要思想是任何具有用户界面的应用都可以分为两个模块一个负责实现业务逻辑的模块另一个是用户界面。 第一个模块将实现应用的主要功能。该模块是系统的核心应用的领域模型在此实现。在MVC范式中该模块为字母M即模型。 第二个模块实现了整个用户界面包括向用户显示数据和处理用户与应用交互的逻辑。 这种分离的主要目标是确保系统的核心在MVC术语中称为“模型”能够独立开发和测试。 完成这种分离后应用程序的架构如下步骤2使用观察者模式使模型更加独立并同步用户界面这里有两个目标实现模型更大的独立性同步用户界面以下示例将帮助你理解用户界面同步的含义。 假设我们在网上购买电影票查看影院的可用座位数。与此同时可能还有别人在买电影票。如果这位观众比我们先买票我们希望看到我们考虑的演出时间内座位数有所减少。 现在让我们来思考如何在程序中实现这一点。假设我们有系统的核心模型和界面购票网页。 两个用户同时在剧院里选择座位。 第一位用户购买了一张票。网页需要向第二位用户展示此事。 这怎么可能发生 如果我们从核心更新接口那么核心我们的模型将依赖于接口。在开发和测试模型时我们必须考虑各种界面更新方式。 为此我们需要实现观察者模式。这种模式允许模型向所有监听者发送变更通知。作为事件监听者或观察者用户界面接收通知并进行更新。 一方面观察者模式让模型在不了解任何变化的情况下告知界面视图和控制器发生了变化从而保持独立性。另一方面它使用户界面能够同步。步骤3将界面分为视图和控制器我们继续将应用划分为模块但现在在层级结构中更低层级。在这一步用户界面我们在第一步中将其拆分为独立模块被拆分为视图和控制器。 在视角和手柄之间划清界限很难。如果我们说视图是用户所看到的而控制器是允许用户与系统交互的机制你可能会指出一个矛盾。 控制元件比如网页上的按钮或手机屏幕上的虚拟键盘基本上是手柄的一部分。但它们对用户来说和视图的任何部分一样清晰可见。 我们真正讨论的是功能分离。用户界面的主要任务是促进用户与系统的交互。这意味着该接口只有两个功能能够输出并方便地显示系统信息给用户输入用户数据和命令向系统传达这些功能决定了用户界面应如何划分为模块。 最终系统架构如下这就是我们如何得出由三个模块组成的应用分别是模型、视图和控制器。 让我们总结一下根据MVC范式的原则系统必须被划分为多个模块。最重要且独立的模块应是模型。模型是系统的核心。应该可以独立于用户界面开发和测试。为此在分割的第一步我们需要将系统拆分为模型和用户界面。然后利用观察者模式我们增强模型的独立性并同步用户界面。第三步是将用户界面划分为控制器和视图。接收用户数据到系统所需的一切都在控制器里。向用户传递信息所需的一切都在视图中。在你喝热巧克力之前还有一件重要的事要讨论。关于视图和控制器如何与模型交互通过控制器输入信息用户可以更改型号。 或者至少用户会更改模型数据。当用户通过界面元素通过视图接收信息时用户实际上是在接收关于模型的信息。 这是怎么发生的视图和控制器通过什么方式与模型交互毕竟视图的类不能直接调用模型类的方法来读写数据。否则我们就无法说模型是独立的。 模型是一组密切相关的类视图和控制器都不应访问这些类。 为了将模型与视图和控制器连接我们需要实现门面设计模式。模型的立面是模型与用户界面之间的一层视图通过它接收方便格式化的数据控制器通过调用立面上的必要方法来更改数据。 最终一切看起来是这样的MVC我们能获得什么MVC范式的主要目标是将业务逻辑模型的实现与其可视化视图分离。 这种分离增加了代码重复使用的可能性。 MVC的好处最明显的是我们需要以不同格式呈现相同数据。例如以表格、图表或图表的形式使用不同视图。同时在不影响视图实现方式的前提下我们可以改变对用户操作点击按钮、数据录入的响应方式。 如果你遵循MVC的原则可以简化软件开发提高代码可读性并提升可扩展性和可维护性。 在“企业开发导论”系列的最后一篇文章中我们将探讨使用Spring MVC构建的MVC实现。第八部分。让我们用Spring Boot编写一个小型应用程序