基于MVC的Web框架设计与应用

2021-03-31 08:56亓雪冬韩立峰
微型电脑应用 2021年3期
关键词:子类设计模式视图

亓雪冬, 韩立峰

(中国石油大学(华东)信息化建设处, 山东 青岛 266580)

0 引言

随着Web业务需求的不断增长,MVC设计模式和基于MVC的Web框架被持续研究和关注,如冉启武等[1]设计了基于MVC模式的教学管理电子信息系统;张翠翠等[2]研究了基于MVC的试卷生成及主观题判卷算法;王俊芳等[3]研究和应用了基于MVC模式的ThinkPHP框架;Majida Laaziri等[4]评估了Laravel、Smfony和CodeIgniter三种PHP Web框架并对其性能进行了测试;Andri Sunardi等[5]对比了Laravel和Slim两种PHP Web框架并研究了在自由职业者项目监控系统中的应用效果。众多研究表明,MVC模式通过对应用的分层和解耦,减少了架构设计的复杂性,增加了代码的灵活性和可重用性;而MVC Web框架通过提供基础框架模型和类库,减少了Web应用开发中的重复代码,提高了开发效率和可维护性。

本文在研究MVC设计模式的基础上,分析了Web应用的一般性需求,提出了MVC Web框架的设计思路,并基于该框架设计实现了程序设计实训Web系统。

1 MVC设计模式

MVC设计模式最初于上世纪80年代诞生于Smalltalk语言中,近年来被广泛应用于Java EE、Web等平台的软件开发中。MVC全称为Model-View-Controller,Model指数据模型,View指视图(用户界面),而Controller则指控制器。MVC的目的是将Model和View分离,从而使同一个程序可以使用不同的表现形式。MVC强制使应用程序的输入、处理和输出分开设计,将程序主体分离为模型、视图、控制器3个核心部件,实现功能的解耦。模型-视图-控制器三者间的关系,如图1所示。

图1 MVC架构示意图

控制器接受用户的输入并调用模型和视图去完成用户的需求,它本身不做任何处理,也不输出任何数据。单击Web页面中的超链接和发送HTML表单时,它只是接收请求并决定调用哪个模型去处理请求,然后再确定用哪个视图来显示返回的数据,相当于模型和视图的粘合逻辑。

模型表示数据和业务规则,它返回的数据是中立的,与数据格式无关,因此一个模型能够为多个视图提供数据,减少了代码的重复性。

视图为用户提供一种展示和操作数据的方式。不同的视图代表多个不同的用户界面。实际的处理操作发生在模型部分而不是视图部分。在Web应用程序,视图通常由HTML元素、模板标记语言以及模型返回的数据共同组成。

2 基于MVC的Web框架设计

2.1 整体架构

本文设计的Web框架遵循MVC设计模式,核心类包括控制器基类Controller、模式基类Model、用于生成视图的模板类Template和工具类Request。整体架构,如图2所示。

图2 整体架构设计图

控制器基类Controller逻辑上依赖于类Model和类Template,内部包含了Model和Template的实例,其目的是粘合这两个类的功能,选择合适的Model获取数据,并选择合适的模板生成视图。模式基类Model包含了操纵数据的基本业务逻辑,如查找、保存、更新和删除数据等方法。模板类Template内部封装了第三方的模板引擎Smarty,实现内存数据到HTML格式视图的转换。工具类Request实现了Web请求数据的封装、请求的派发等功能,将Web请求转发到指定的控制器。

该架构将Controller与Model的业务逻辑层作为应用的主要开发区域,上层应用程序只需继承Controller和Model,根据业务实际需求实现对应子类UserControl和UserModel,即可完成业务逻辑开发。

2.2 Web请求入口设计

index.php为Web请求的入口地址。Web请求到达后,index.php首先将Web请求中携带的各种数据进行封装以便后续使用;接下来将Web请求派发到指定控制器,由控制器完成对请求的后续处理。

Requset:: dispatch()方法实现了控制器调度,其思路为:

(1) 从Web请求的Get数据中提取ct和ac两个参数的值,这两个参数表示执行处理的控制器Controller以及控制器的具体操作Action;

(2) 将预设的控制器文件目录、上一步操作中提取的控制器名称以及字符串“.php”三部分合成控制器类文件完整路径,使用require语句包含该控制器类;

(3) 创建该控制器的实例,并调用实例中参数ac所指的Action方法,完成控制器调度。

2.3 控制器设计

控制器设计包含两个层次,Controller基类和UserController子类。基类中包含Model和Template的实例,方便粘合模式和视图。但基类中并未实现任何Action方法,这部分留给子类根据业务逻辑具体实现。

2.4 视图模板设计

控制器完成业务逻辑后,将调用模板类Template,将返回的数据和指定的模板合成视图,向用户展示Web应用界面。Template类基于第三方的模板引擎Smarty,模板文件使用Smarty的语法,扩展名为tpl。Template类公开了assign和display两个方法,assign将控制器返回的数据替换入模板,display根据模板语言对模板进行解释,生成最终的视图。

2.5 模式设计

模式的设计围绕操纵和处理数据展开。在业务系统中,数据表现为关系数据库中的关系(表);然而在软件设计中,数据表现为内存中的对象。为了实现关系与内存对象之间的数据转换,本文在模式层设计了轻量级、可扩展的对象-关系映射(Object/Relation Mapping,简称ORM)机制,相关设计类,如图3所示。

图3 模式部分类图

DbManager是直接操纵数据库的抽象基类,connect属性表示数据库连接对象,config属性表示数据库配置字符串,getData方法用于执行Select语句返回数据,runSql方法用于执行Insert、Delete、Update等SQL语句。子类MySQL和SQLServer是DbManager针对这两种常用数据库的具体实现,这使得模式可以支持多种数据库。

3 Web框架的应用

基于MVC Web框架,笔者设计实现了程序设计实训Web系统。实训课程中,学生需要小组合作共同完成一个实训项目,一个小组提交一份电子作业,教师根据小组中每个成员的工作量来评定成绩。根据项目需求,系统核心功能确定为用户管理、小组管理和作业管理3个主要模块。用户管理模块主要提供注册、登录和账号管理等功能;小组管理模块主要提供小组的建立和删除、小组查询、组员加入和退出等功能;作业管理模块中,面向教师的功能为作业发布、作业批改和成绩导出,面向组长的功能为接收作业、分配子任务和提交作业,面向组员的功能为接收子任务、提交子任务等。

上文设计的MVC Web框架提供了支撑Web系统的关键基础功能,并且将系统逻辑结构划分为模式、视图和控制器三部分,开发时只需对各部分进行必要的扩展和补充即可,这种方式极大简化了Web系统的开发。

在控制器方面,针对用户管理、小组管理和作业管理等模块分别实现了UsersController、TeamsController和Projects Controller3个控制器子类。每个控制器内部可实现了一系列Action(功能),如用户管理控制器UsersController,内部实现了UserRegister、UserLogin、RemoveUser、EditUser等Action。Web请求中,通过指定ct(Controller)和ac(Action)两个参数,可以调用指定控制器的指定功能,处理用户请求。

对于每一个Action,均要设计与之匹配的专用模式子类。模式子类继承自Model父类,提供了处理和访问此Action所需的特定数据的能力。例如对于登录Action和分配子任务Action,分别设计了LoginModel和SubtaskModel两个子类,LoginModel用于处理登录相关数据,SubtaskModel用于处理子任务划分相关数据。

另外还需为每一个Action设计对应的视图模板,以展示用户界面。例如对于登录Action和分配子任务Action,分别设计了Login.tpl和SubtaskModel.tpl两个视图模板。这两个Action的用户界面,如图4所示。

图4 程序设计实训Web系统部分界面(上图为登录界面,下图为分配子任务界面)

4 总结

MVC设计模式通过将应用程序分离为模式-视图-控制器3个部分,实现了对应用的分层和解耦,提高了软件设计的灵活性。分层结构使得MVC具有耦合性低、重用性高、便于部署、易于测试等优点。本文基于MVC模式自主设计开发了一套高效率、可扩展的轻量级Web框架,并在该框架的基础上设计实现了程序设计实训Web系统。实践表明,本文的MVC Web框架为Web应用开发提供了关键技术支撑,简化了开发工作,提高了开发效率,增强了应用系统的稳定性和可靠性。

猜你喜欢
子类设计模式视图
“1+1”作业设计模式的实践探索
卷入Hohlov算子的某解析双单叶函数子类的系数估计
三维协同设计模式下的航天项目管理实践与展望
Java面向对象编程的三大特性
交通机电工程设计模式创新探讨
5.3 视图与投影
视图
Java类的继承
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图