谈谈我对MVC的View层实现的理解
MVC框架可以把应用清晰明了地分为三个部分:Model层–数据层,View层–视图层,Controller–逻辑层,Model层负责整合数据,View层负责页面渲染,Controller层负责实现业务逻辑。
我在这里简单说一下我对MVC框架中的View层的理解。
View层一般包含两个部分:View类和模版文件,View类并不是必需的,采用View类可以整合代码,因为有时候View层也会有一些复杂的逻辑和数据读取的操作,这些操作最好放在类(或者对象)中实现,如果直接在模版文件中实现,会让模版文件很凌乱,不利于代码复用和后期维护。
对于一个Web应用来说,整个应用的风格和页面布局需要保持一致,那么聪明的小伙伴是否联想到了代码复用?假如这个应用一共有200个页面,如何实现“只需在代码中修改一处,就可以修改所有页面的共用部分?”,这是一个非常重要的功能,要不然页面上每一个小改动都需要重复200次,其中难免出错,维护代价高昂。
代码复用的基本思想是“模块化”,每个模块只负责一小部分功能,整个应用的功能就是这些模块的排列和组合,这个思想运用在View层就可以实现上面提到的问题。
那么如何将“模块化”的思想运用在View层的实现上呢?
首先,需要分析web应用页面渲染的特点。一般的,大部分页面共用一个基本布局(基本布局之外没有web内容),在基本布局里面进行划分,比如划分为上下布局,左右布局等,然后再在划分好的小块中再进行布局划分,以此类推,直到完成一个页面的布局。因为一个Web应用的风格和大体布局是一致的,所以上面划分出来的布局中,一部分布局是可以共用的。每一次划分所产生的块都是“模块”,这些“模块”都可以复用,页面与页面之间共用的块,可以通过调用相同的“模块”来实现,需要修改的时候,只需修改“模块”即可,这样就可以达到“只需在代码中修改一处,就可以修改所有页面的共用部分”。
那么如何划分布局呢?(如何把我脑海中对页面布局的划分告诉Web应用?)
我的两种方案:
1. 在每个模块中实现对它所包含的子模块的调用。这样,只需要“手动”调取出第一个模块,就可以调取出所有它的子模块,从而完成整个页面的渲染。这个方法的缺点是“环环相扣”并且没法快速查看,如果某个模块渲染不正确,只能一级一级地往上追溯。“环环相扣”导致模块与模块之间的关系非常紧密,有悖于“模块化”的思想。
2. 为每一个页面单独设置一个布局的.xml文件,在这个文件中,规定好页面的布局划分,哪个模块包含哪些子模块就一目了然,便于快速定位问题。缺点是.xml文件的解析难度很大,解析.xml文件也非常吃性能,如果页面布局复杂,维护.xml也会非常麻烦。
我比较偏向于第2个方案,第1个方案还有一个非常致命的缺点:页面的渲染过程是逐级展开的,需要在关键节点进行“干预”,使上级模块调取合适的子模块,这也是一个难点,如果需要干预的点太多,就会非常麻烦并且非常凌乱。相比之下,方案2只需要维护.xml文件,只要编写一个完善的解析函数,就可以很好的工作,如果解析.xml文件对性能造成较大影响,可以把解析.xml后所得的布局对象或者数据结构保存在NoSQL数据库中作为缓存(毕竟页面布局不会修改的很频繁),这样可在一定程度上减轻解析.xml文件对性能的影响。
再进一步
有没有发现,上述的第2方案,“为每一个页面单独设置一个布局的.xml文件”会导致众多.xml文件中都会包含大量的重复代码,因为大部分页面的布局有很多位置是相同的或相近似的,所以可以对.xml文件作一些优化,把.xml文件中重复的部分分离出来,单独维护,这样.xml文件的内容就会清爽很多。
如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。
作 者:blog.jpdou.top
谈谈我对MVC的View层实现的理解的更多相关文章
- 微信上传文章素材—ASP.NET MVC从View层传数据到Controller层
View层: $('#btnNews').click(function() { if (!confirm('确定要提交吗?')) { return; } var frontViewData = []; ...
- 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造
第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...
- 转载《浅析MVC框架中View层的优雅设计及实例》
在基于B/S的应用程序开发中,从基本的技术分工上来说就是两大块,一是软件显示界面,另一个是程序逻辑.在N年前的脚本语言时代,无论是asp.php还是jsp,我们基本是都是把这两者柔和在一起的.尽管我们 ...
- MVC中从Controller像View层传值
MVC中的Controller不能直接的訪问View层中的控件,那么是怎样的将Controller中值传到View中,经常使用的有4种 ViewData: 是获取或设置视图的字典对象,它里面存放的是键 ...
- 浅析Yii2的view层设计
Yii2.0的view层提供了若干重要的功能:assets资源管理,widgets小组件,layouts布局... 下面将通过对Yii2.0代码直接进行分析,看一下上述功能都是如何实现的,当然细枝末节 ...
- MVC中view和controller相互传值的方法
MVC项目中,在view层如果使用前台框架,框架中会有封装好的相互传值方法.但是,那些postdata[][]方法不一定能够满足功能需求,反而一些常用的传值方法可能会刚好解决它们的不足.总结如下: 一 ...
- iOS应用架构谈(三):View层的组织和调用方案(下)
iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.下篇主要讨论做View层架构的 ...
- iOS应用架构谈(二):View层的组织和调用方案(上)
OS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.上篇主要讲View层的代码结构. ...
- iOS应用架构谈(二):View层的组织和调用方案(中)
iOS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.中篇主要讨论MVC.MVCS. ...
随机推荐
- Unusual Sequences
题意: 求解合为 y 的总体 gcd 为 x 的正整数非空序列个数. 解法: 特判一下后,原问题等价于合为 s = y/x 的整体gcd为1的正整数序列个数. 1.$ans = \sum_{\sum{ ...
- Flask01 初识flask、创建flask应用、flask启动配置
1 什么是flask Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . 百度百科:点击前往 中文文档: ...
- R: factor & list 生成和操作因子、列表
################################################### 问题:生成.操作列表 & 因子 18.4.27 怎么生成列表 list.因子 fac ...
- 第5季-小试牛刀-项目开发\阶段2-新手上路\项目-移动物体监控系统\Sprint0-产品设计与规划
lesson1---产品功能展示 先完成准备阶段,准备阶段要做的事情: a.项目经理选择团队, b.根据项目用户需求以及同类型的实物,制定产品功能列表 c.根据功能的难易程度,制定迭代周期以及在每周期 ...
- Entity Framework Code-First(10.3):Property Mappings
Property Mappings using Fluent API: Here, we will learn how to configure properties of an entity cla ...
- wpf listboxitem添加下划线
1.通过List<string>进行赋值,没有字段绑定 // 前台xaml <ListBox x:Name="list1"> <ListBox.Ite ...
- CentOS6.5内核升级FATAL: Module scsi_wait_scan not found
系统为CentOS6.5的虚拟机内核升级至版本4.6.0-1,重启后,报以下错误: Module scsi_wait_scan not found. 无法进入系统. 问题描述详见:Known Issu ...
- 2017-10-6 清北刷题冲刺班a.m
1.角谷猜想 #include<iostream> #include<cstdio> #include<cstring> #define maxn 10010 us ...
- 解读人:闫克强,Metabolic and gut microbial characterization of obesity-prone mice under high-fat diet(高脂饮食下易胖倾向小鼠的代谢和肠道微生物菌群特征分析)
单位: 上海中医药大学 蚌埠医学院 上海交通大学附属第六人民医院 夏威夷大学癌症中心 第二军医大学 技术:非靶向代谢组学,16S rRNA测序技术 一. 概述: 本研究对小鼠进行高脂饮食,根据体重增长 ...
- Hibernate的优化方案
使用参数绑定 使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存. 避免SQL注入. 尽量少使用NOT 如果where子句中包含not关键 ...