MVC架构设计浅析

杨传伟

(石家庄铁道大学信息科学与技术学院,河北省,石家庄市,050043)

摘 要:本文以图书管理系统为案例(当前主流框架SpringMVC的原理来分析MVC的设计理念等),深入浅出地分析常用的WEB设计模式MVC。将从MVC的历史、MVC每一层的作用,MVC能为我们带来什么好处又存在哪些问题以及MVC的前景如何等方面结合实际项目对该架构进行分析。通过本文你将从多个层面对MVC架构设计有一个初步的认识,让你快速走近MVC设计思想,通过实际项目的剖析以及图文交互的表达方式让您轻松理解MVC架构。

关键词:MVC;SpringMVC;分层;视图;控制器;模型

0  引言

Web应用的根本都是从数据存储和检索数据并将其显示给用户。在用户更改数据之后,系统再将更新内容存储到数据存储中。因为关键的信息流发生在数据存储和用户界面之间,所以很多Web应用将数据和用户界面这两部分绑在一起,以减少编码量并提高应用程序性能。但是,这种看起来自然而然的方法有一些大问题。一是,用户界面的更改往往比数据存储系统的更改频繁得多。二是,这种情况下耦合往往会合并其他的业务逻辑。那么如何让 Web 应用程序的用户界面功能实现模块化,以便可以轻松地单独修改各个部分呢?面向对象的设计模式是Web设计经验的总结,MVC架构可以很好地解决上述问题。

1  MVC简介

MVC架构把数据处理,程序输入输出控制及数据显示分离开来,并且描述了不同部件的对象间的通信方式。使得软件可维护性,可扩展性,灵活性以及封装性大大提高;MVC(Model-View-Controller)把系统的组成分解为M(模型)、V(视图)、C(控制器)三种部件。视图表示数据在屏幕上的显示。控制器提供处理过程控制,它在模型和视图之间起连接作用。控制器本身不输出任何信息和做任何处理,它只负责把用户的请求转成针对Model的操作,和调用相应的视图来显示Model处理后的数据。三者之间关系如下图1 (MVC关系图)

图1  MVC关系图

2 为什么要使用MVC

用户界面逻辑的更改往往比业务逻辑频繁,尤其是在基于Web的应用程序中。例如,可能添加新的用户界面页,或者可能完全打乱现有的页面布局。对显示的更改,尽可能地不要影响到数据和业务逻辑。

目前大部分Web应用都是将数据代码和表示混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用需要一些额外的工作,但它带来的好处是毋庸置疑的。

2.1 提高代码重用率

最重要的一点就是多个视图可以共享同一个模型,把视图表达和底层数据分离。不论用户想要什么视图,只需要修改视图的模式,而数据可以根据接口自由传递,避免了同时修改视图和数据部分代码的困难,提高了代码的可重用性。

2.2 提高程序可维护性

因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变数据层和业务规则。例如,把数据库从MySQL移植到Oracle,或者把基于RDBMS数据源改变到LDAP,只需改变模型即可。一旦正确的实现了模型,不管数据来自哪里,视图都会正确的显示它们。MVC架构的运用,使得程序的三个部件相互对立,大大提高了程序的可维护性。

2.3 有利于团队开发

在开发过程中,可以更好的分工,更好的协作。有利于开发出高质量的软件。良好的项目架构设计,将减少编码工作量 :采用MVC结构 + 代码生成器,是大多数Web应用的理想选择。部分模型(Model)、和存储过程一般可用工具自动生成。控制(Controller)器比较稳定,一般由于架构师(也可能是有经验的人)完成;那么整个项目需要手动编写代码的地方就只有视图(View)了。在这种模式下,个人能力不在特别重要,只要懂点语法基础的人都可以编写,无论项目成员写出什么样的代码,都在项目管理者的可控范围内。即使项目中途换人,也不会有太大问题。在个人能力参差不齐的团队开发中,采用MVC开发是非常理想的。

3 基于SpringMVC的案例分析

系统采用了SpringBoot框架,而SpringBoot是对SpringMVC的扩展,本质上依然是MVC架构模式,下面将以此为例带你了解MVC的原理和实现过程。

3.1 MVC的工作流程

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架属于SpringFrameWork的后续产品,已经融合在 Spring Web Flow 中。 

MVC的工作流程: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器。

3.2 SpringMVC实现原理

先看一张原理图(图2 SpringMVC原理图)首先用户发起请求,请求被DispatcherServlet拦截,拦截之后去寻找请求对应的映射器。DispatcherServlet是核心,一切的一切都是从拦截请求开始的,当请求被拦截时,SpringMVC会根据请求,去处理请求映射关系,从而找到该请求对应的控制器,把处理器的名字返回到DispatcherServlet,而后再由DispatcherServlet找到该控制器,控制器完成的工作主要是封装数据,返回用户需要的视图,视图返回后,由DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。(获得model and view 中的数据,解析视图名字,拼接视图路径)视图解析器将解析的逻辑视图名传给DispatcherServlet。DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。

图2  SpringMVC原理图

3.3 MVC项目目录结构

在基于SpringMVC的图书管理系统中,该框架在文件目录上把MVC清晰地分为了三层目录结构,分别对应了数据模型层(完成控制层和数据库的交互,完全不用干涉视图层),控制层(通过控制器决定了视图层的用户需要得到什么数据,成为视图层和数据模型层的桥梁),视图层(专注于如何把控制层传来的数据更好的展示给用户),目录结构如下图3。

图3  SpringMVC目录结构图

3.4 MVC核心

SpringMVC乃至整个MVC架构的核心在控制层,控制层起到了承上启下,交互的作用。控制层决定了什么样的数据要传给什么样的视图,下面介绍一下SpringMVC是如何实现控制层的。

为了方便管理,控制层被进一步分解出服务层(Service)这一层主要负责数据的获取,Controller层只需要去调用Servie层获取数据,而不需要既关注数据又关注视图。结构如图4所示:

图4 SpringMVC Controller层结构图

4 MVC的优点和不足

4.1 MVC的优点

MVC的优点体现在以下几个方面:

(1) 有利于团队开发分工协作和质量控制,降低开发成本。

(2) 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。

(3) 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。

(4) 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

(5) 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

4.2 MVC的不足

MVC的不足体现在以下几个方面:

(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

(2)视图对模型数据的访问效率低。视图可能需要多次调用Model才能获得足够的显示数据。

(3)完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。 同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。

参考文献:

[1] SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】

https://www.cnblogs.com/rainbow-1/p/15616020.html

[2] SpringMVC执行原理

  https://www.cnblogs.com/rainbow-1/p/15610933.html

[3] MVC架构在Asp.net中的应用和实现

https://www.cnblogs.com/yanyao/articles/4836583.html

有摘录、非原创、侵联删。

MVC架构设计浅析(WEB网页开发)的更多相关文章

  1. 论MVC架构设计及其应用

    论MVC架构设计及其应用 张紫诺1 (1. 位石家庄铁道大学,河北 石家庄 050000) 摘要:随着信息化建设的发展,人们愈发需要考虑采用一种良好的架构实现快速构建企业应用程序的目标.而MVC架构正 ...

  2. MVC模式设计的Web层框架初识

    struts是个什么东西? struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类 ...

  3. 上海洋码头(www.ymatou.com)急招技术人才(职位:互联网软件开发工程师,.NET网站架构师,Web前端开发工程师,高级测试工程师,产品经理)

    对公司招聘职位有兴趣的童鞋可以把简历发送到zhangzhiqiang@ymatou.com,我们HR会快速给你答复. 互联网软件开发工程师 岗位职责: 1.参与洋码头各个平台(www.ymatou.c ...

  4. .NET桌面程序集成Web网页开发的多种解决方案

    系列目录     [已更新最新开发文章,点击查看详细] B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm.WPF客户端程序依然具有很实用的价值,如设计类软件 Au ...

  5. MySQL架构设计谈:从开发规范、选型、拆分到减压(转)

    作者介绍 李辉,原新浪爱彩票运维负责人,常用网名:门牙没了.曾主导新浪爱彩票的MySQL运维工作.培训合伙人.资深讲师,中国科学院大学在读研究生(大数据方向),擅长大型项目的关系型数据库运维和管理,现 ...

  6. Spring MVC 架构的java web工程如何添加登录过滤器

    发布到外网的web工程必须添加登录过滤器来阻挡一些非法的请求,即只有登录的用户才能对web工程进行请求,否则无论请求什么资源都需要调整到登录页面进行登录操作.这时就需要用到过滤器,其实非常简单,只需要 ...

  7. MVC架构介绍—查询功能的开发

    select和from语句 注意:select和from可以不设置,默认情况下: select获取映射表的所有字段: from获取实体映射表的表名:如果设置select则必须设置frorm,但是允许仅 ...

  8. MVC架构设计——EF-Code First

    详情参考:http://www.cnblogs.com/guomingfeng/archive/2013/05/28/mvc-ef-repository.html

  9. 第七周技术博客发表 web网页开发

    a<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org ...

  10. 第五周技术博客发表 web 网页开发

    <html><head> <title> HTML</title></head><body > <h1>会员注册界面 ...

随机推荐

  1. 【Map】【List】【数组】获得两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [1,2,2 ...

  2. html+css:小米顶部菜单+二级菜单

    1.源码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  3. 开源大语言模型作为 LangChain 智能体

    概要 开源大型语言模型 (LLMs) 现已达到一种性能水平,使它们适合作为推动智能体工作流的推理引擎: Mixtral 甚至在我们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能可以轻易的得 ...

  4. windows 上 ffmpeg 库的安装

    真复杂啊 安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装 一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点 ...

  5. vs 工程中替换 Qt 静态库

    上篇介绍了如何编译 Qt 静态库 编译 windows 上的 qt 静态库 这篇介绍如何替换已有的 Qt 静态库,比如 Qt5.15.0 有很多 bug,我们不得不提升 Qt 版本来避免 bug 导致 ...

  6. 重点:递归函数,数学模块,随机模块---day14

    1.递归函数 自己调用自己的函数是递归函数 递:去 归:回 一去一回叫作递归 简单递归 def digui(n): print(n,'<==1==>') if n > 0: digu ...

  7. 【LeetCode哈希表#5】四数相加II(map)

    四数相加II 力扣题目链接(opens new window) 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + ...

  8. 矩池云 | GPU 分布式使用教程之 Pytorch

    GPU 分布式使用教程之 Pytorch Pytorch 官方推荐使用 DistributedDataParallel(DDP) 模块来实现单机多卡和多机多卡分布式计算.DDP 模块涉及了一些新概念, ...

  9. 【Azure 应用服务】更新镜像后并重启应用服务,部署日志始终没有出现加载新镜像成功的日志

    问题描述 在App Service中部署镜像文件,发现镜像一直没有部署,重启App Service服务也无效果. DockerFile如下: FROM crunchgeek/php-fpm:7.0 # ...

  10. XSS漏洞原理整理

    一.通常使用XSS脚本来获取浏览器版本信息,alert(navigator.userAgnet )  ,浏览器的UserAgent是可以伪造的,比方火狐或者很多扩展都可以屏蔽或者自定义浏览器发送的Us ...