如何正确应用Web MVC架构模式分离表示层和模型层耦合关系
ccwgpt 2024-11-22 11:35 17 浏览 0 评论
软件项目实训及课程设计指导——如何正确地应用Web MVC架构模式分离表示层和模型处理层耦合关系
1、MVC体系架构设计模式是用来帮助系统设计人员控制"变化"的一种设计模式
MVC体系架构设计模式是上世纪80年代在Smalltalk-80中出现的一种软件设计模式,
尽管它源于桌面程序(Desktop),但现在也被广泛地应用于B/S模式的Web应用程序开发中。
但如果希望传统的MVC模式能够继续应用于B/S模式的Web应用程序开发中,需要进行完善和扩展,从而产生出Web MVC模式的概念。因此,本文中所涉及的MVC更准确地定义应该称为Web MVC——在B/S模式的Web应用程序设计和开发中应用MVC架构模式。
(1)MVC架构体系设计中的三个元素——模型、视图和控制器
基于MVC架构体系设计的软件应用系统可以分解为模型、视图和控制器三个组成部分,它们分别对应于应用系统中的业务逻辑和数据、用户界面、用户请求处理和数据同步等功能实现。
1)模型(Model)是软件应用系统程序的主体部分,它表示软件应用系统中的业务数据或者业务逻辑。在J2EE系统平台中的"模型"可以采用如下两种方式来实现:其一是采用JavaBean组件实现——封装数据的实体JavaBean和业务逻辑处理功能的JavaBean;其二是应用EJB组件实现——会话Bean处理业务逻辑,实体Bean封装和存取数据。
2)视图(View)是软件应用系统程序中与用户界面相关的部分,是最终用户看到并与之相互交互的系统界面。
3)控制器(Controller)主要是根据最终用户在操作使用软件应用系统时的输入,控制用户界面内的数据显示状态和更新模型对象的状态,最终达到保持视图的显示结果与模型状态的一致性。
(2)应用MVC体系架构设计模式可以分离"视图"和"模型"之间的耦合关系
应用MVC的设计理念来观察一个企业软件应用系统,在软件应用系统中的"用户界面"(视图)发生变动的可能性是最大的,而控制部分(控制)的变动则次之,业务逻辑部分(模型)一般是相对比较稳定的。
如下示图为读者都很熟悉的即时通讯QQ软件,为了满足不同的应用环境中的用户需要,分别提供如下的三种版本:PC版本、Web浏览器版本和移动App版本,但这三个不同版本的主要差别表现在界面(视图变化),而后台服务器端相关的通讯则应该是统一和一致的程序(模型稳定)。
因此,为业务逻辑编写的功能实现代码不应该和反映用户界面的功能实现代码相互混杂在一起,而是应该尽可能地独立和分离,并由系统中的控制器组件来担当两者交互的中介。
而应用MVC体系架构设计模式可以分离软件应用系统中的"视图"和"模型"之间的耦合关系,从而可以重用一个稳定的"模型"而分别提供不同应用环境下的"视图"。因此MVC体系架构设计模式是用来帮助软件应用系统设计人员控制"变化"的一种设计模式。
2、Web MVC(也就是 J2EE平台中的"JSP Model Two构架模式"的升级)体系架构设计模式
(1)Web MVC体系架构设计模式的产生
在1999年2月的JavaWorld大会上,由Govind Seshadri博士提出了Web MVC体系架构设计模式(Govind Seshadri在 Understanding JavaServer Pages Model 2 architecture 一文中清楚地指出了JSP Model 2是一种 MVC 模式。)。它是对Smalltalk-80中的MVC的改进和完善,以适用于基于Http协议的Web软件应用系统的体系架构设计中。
由于Http协议是无状态的,因此在Web应用系统中如果继续沿用传统的MVC体系架构设计模式(也就是Smalltalk-80中的MVC),则其中的"模型"和"视图"之间不能直接应用Observer模式(观察者设计模式)进行状态改变的通知——也就是传统的MVC不适用于Web浏览器的应用环境中。
因此,有必要对传统的MVC体系架构进行改造和完善以适用于Web软件应用系统的体系架构设计中。
(2)Web MVC体系架构设计模式中的控制器如何设计实现
要将传统的MVC体系架构设计模式改造以适用于Web浏览器的应用环境,需要对其中的"控制器"进行修正和完善——在Web浏览器的应用方式下将改由J2EE Servlet组件实现"模型"和"视图"之间的"代理"以承担MVC体系架构设计模式中的控制器角色——它调度"模型"组件和通知"视图"组件更新显示(当然,在JSP页面中可以通过转发forward或重定向redirect等形式的响应输出实现)。
如下示图为Web MVC体系架构设计模式中的"视图"、"控制器"和"模型"三者之间的交互关系示图。
3、MVC体系架构设计模式能够分离表示层逻辑和业务层逻辑
为了能够提高软件应用系统中表现层组件的可维护性,不应该将涉及系统中的业务功能方面的程序代码与完成显示功能的HTML标签或者服务器端标签(如JSP标签等)混合在一起。否则,当开发人员需要更改Web页面内容或者扩展Web页面的新功能时,将会带来很大的修改工作量,甚至会破坏原有软件应用系统的稳定性。
如下示图所示的JSP页面(*.jsp文件)中包含有大量的Java程序代码和服务器端的JSP标签(未附录显示),这样的JSP页面是不容易维护和功能扩展的。
MVC体系架构设计模式最大的价值体现在,它倡导分离软件应用系统中的表示层和业务处理层之间的耦合关系。因此,应用MVC体系架构设计模式可以解决上述的问题,它是达到分离"模型"和"视图"之间的耦合关系的一种架构模式,从而可以保证系统表示层组件只负责显示功能而不再直接藕合有功能实现的代码。
而当软件应用系统需要提供对另一种形式的客户端支持时——也就是"视图"发生调整,软件应用系统的设计和开发人员只需要重新设计一套新的表示层组件,而软件应用系统的核心业务功能和数据访问操作功能则无需进行任何的变化和修改——读者可以参考"PC版本"、" Web浏览器版本"和"移动App版本"这三个不同版本的QQ程序的实现示例。
4、支持MVC架构体系设计模式的开源框架——Struts2应用框架
(1)Struts2应用框架是源自于Webwork的一个MVC框架
Struts2应用框架是由一组相互协作的Java程序类、J2EE Servlet和JSP标签等元素所构成,它们组成一个可重用的 Web MVC的体系系统架构。
在技术实现的本质上,Struts2应用框架其实是对WebWork框架的升级,因此也就同样具有与WebWork2相同的特性——前置拦截器(Interceptor)、运行时表单属性验证、类型转换,强大的表达式语言(OGNL,the Object Graph Notation Language)和控制反转IoC(Inversion of Control)容器等。
(2)Struts2应用框架中的"控制器"不再采用Servlet组件承担
在Struts2应用框架在的"视图"部分继续采用标准的JSP页面,"模型"组件也继续应用普通的JavaBean组件承担,但其中的"控制器"则不再采用标准的Web MVC模式中的J2EE Servlet组件承担,而是由"前端控制器"组件和"后端业务控制器"组件两者相互配合完成控制调度的功能。
其中的"前端控制器"组件主要完成对Web请求的预处理,并调用相关的请求处理的"后端业务控制器"Action组件中对应的功能方法;而"后端业务控制器"组件则根据所接收到的Web请求的类型分别调用"模型"组件中不同的业务功能方法,完成最终的功能处理,并将处理的结果返送到相关的"视图"表现层JSP页面中显示输出。
如下示图为Struts2应用框架中的"前端控制器" 组件和"后端业务控制器"组件之间的结构关系示图,其中的拦截器组件完成系统通用的功能实现,为基于Struts2应用框架的软件应用系统提供统一的功能服务。
而其中的ActionProxy类(其实是一个接口,最终应用的是它的功能实现类)为"后端业务控制器"组件的代理类(应用了代理设计模式),通过在"前端控制器" 组件和"后端业务控制器"组件之间添加一个ActionProxy代理类的主要目的是分离"前端控制器" 组件和"后端业务控制器"组件之间耦合关系,从而可以保证"后端业务控制器"组件能够脱离J2EE Servlet容器的应用环境,有利于对"后端业务控制器"组件的单元测试和J2EE Servlet容器外的开发实现。
5、支持MVC架构体系设计模式的开源框架——Spring MVC组件
(1)Spring框架也提供有对MVC架构体系设计模式的具体实现
Spring框架中的MVC组件可以使用多种不同的表示层实现技术(在Spring MVC组件中内置了对JSP、Velocity模版和XSLT等以及其它视图实现技术的支持),同样也是"请求-驱动"类型的MVC框架并且是围绕前端控制器DispatcherServlet组件而设计的。如下示图为Spring框架中的MVC组件的"视图"和"控制器"相互交互的结构示图。
但在Spring MVC中能够应用控制反转技术促进软件应用系统中的表示层和模型层组件之间的松耦合,同时也能够应用面向切面(AOP)编程的技术支持,从而允许通过分离应用的业务逻辑与系统服务。
(2)Spring MVC组件的主要技术特性
1)轻量和非侵入式:从大小与开销两方面而言,Spring应用框架都应归属为轻量级。此外,Spring应用中的对象不依赖于Spring本身的特定类。
2)控制反转:Spring应用框架通过控制反转(IoC)的技术促进了松耦合。
3)面向切面(AOP):Spring包含对面向切面编程的丰富支持,从而分离应用的业务处理逻辑与系统功能服务。
4)基础功能服务:Spring应用框架也提供了很多基础功能服务和相关的技术支持,如事务管理、持久性框架集成等等以及控制器、验证器、命令对象、表单对象、模型对象、Servlet分发器、处理器映射、视图解析器等等。
项目实训及课程设计指导——Web表示层典型功能实现的应用实例
项目实训及课程设计——如何合理地设计软件应用系统Web表示层
- 上一篇:Java-MVC三层架构
- 下一篇:英国留学生毕业论文写作框架
相关推荐
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
-
1、安装iView新框架,支持VUE3npminstallview-ui-plus2、编辑src/main.js,添加以下内容,导入js和css到项目importViewUIPlusfrom...
- 万能前端框架uni app初探03:底部导航开发
-
前言本节我们使用uniapp的底部导航功能,点击不同tab会显示不同页面,这个功能在实际项目开发中几乎是必备的。一、基础知识1.tabBar如果应用是一个多tab应用,可以通过tabBar配...
- Rust Web 开发框架,前端你可以选择哪个?
-
Rust构建一切。在如今流行的语言中,Rust可谓是将构建和高效作为自己优美的身姿在大众视野中脱颖而出。它是一门赋予每个人构建可靠且高效软件能力的语言。它有什么特性呢?高性能。Rust速度惊人且内...
- 连载:前端开发中纠结的Javascript框架(上)
-
如今,前端开发有着许许多多的框架和库。其中一些好用,一些却不尽人意。通常我们会习惯性运用某一概念,模块或句法。事实上,并没有什么万能工具。这篇文章是关于未来框架的发展趋势——那就是没有框架!我从以下几...
- 前端开发框架的演进架构:提升用户体验和开发效率
-
前端开发框架是现代Web应用开发的重要工具,它不仅可以帮助开发者构建复杂的用户界面,还能够提升用户体验和开发效率。随着Web技术的不断发展,前端开发框架也在不断演进,为开发者提供了更丰富、更高效的工具...
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
-
为了要处理超高分辨率医疗图像数据,Google开发了一种空间数据分区(SpatialPartition)技术,在不牺牲图像分辨率的条件下,分析超高分辨率图像。Google使用Mesh-TensorF...
- 大模型安全挑战加剧:框架层漏洞成新靶心
-
近日,360数字安全集团发布了一份关于大模型安全漏洞的报告,揭示了当前大模型及围绕其构建的框架和应用中存在的严重安全问题。报告显示,360近期研究发现了近40个大模型相关的安全漏洞,其中既包括二进制内...
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
-
机器之心报道编辑:陈萍经过5个月的更新迭代,Keras3.0终于来了。「大新闻:我们刚刚发布了Keras3.0版本!」Keras之父FrancoisChollet在X上激动的...
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
-
导读:本文对TensorFlow的框架和基本示例进行简要介绍。作者:本杰明·普朗什(BenjaminPlanche)艾略特·安德烈斯(EliotAndres)来源:华章科技01TensorFlo...
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
-
鱼羊发自凹非寺量子位|公众号QbitAI终于,谷歌出面回应“TensorFlow遭弃”传闻:我们将继续致力于将TensorFlow打造为一流机器学习平台,与JAX并肩推动机器学习研究。这段时...
- 2025 年的PHP :现代 Web 开发的强大引擎
-
程序员还在吐槽PHP过时?2025年的PHP8.4直接封神了。看看最近更新的属性钩子、强类型系统,加上Laravel这些框架,老语言早就脱胎换骨。十年前说PHP弱类型容易崩代码的,现在脸疼不?联合类...
- 前端内卷终结者?htmx如何让开发者告别200行JS只做一个按钮
-
当你用React写一个点赞按钮需要引入3个状态管理库、编写80行JSX和120行钩子函数时,htmx只需要一行HTML:<buttonhx-post="/like"hx-sw...
- NativePHP桌面版V1.0正式发布(元气桌面电脑版下载)
-
导读:各位小伙伴,使用PHP构建桌面级系统的利器,NativePHP来了。概述NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用...
- PHP Laravel框架底层机制(php基本框架)
-
当然可以,Laravel是最受欢迎的PHP框架之一,以优雅的语法和丰富的生态而闻名。尽管开发体验非常“高端”,它的底层其实是由一系列结构清晰、职责分明的组件构成的。下面我从整体架构、核心流程、...
- PHP框架之Laravel框架教程:2. 控制器、路由、视图简单介绍
-
2.控制器、路由、视图简单介绍我们先建立控制器,目录是:app/Http/Controllers,新建控制器Ding.php,代码如下:Ding.php:<?phpnamespaceA...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- VUE3前端开发入门系列教程二:使用iView框架辅助开发
- 万能前端框架uni app初探03:底部导航开发
- Rust Web 开发框架,前端你可以选择哪个?
- 连载:前端开发中纠结的Javascript框架(上)
- 前端开发框架的演进架构:提升用户体验和开发效率
- Google应用Mesh-TensorFlow框架,让CNN也能处理超高分辨率图像
- 大模型安全挑战加剧:框架层漏洞成新靶心
- Keras 3.0正式发布:可用于TensorFlow、JAX和PyTorch
- TensorFlow和Keras入门必读教程(tensorflow与keras版本对应)
- 谷歌官方回应“TensorFlow遭弃”:还在投资开发,将与JAX并肩作战
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- ppt框架 (48)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)