摘 要: 分析了MVC描述的软件模型,通过一个基于PHP语言并结合XML和XSL技术的MVC架构的设计实例讨论了MVC模式设计的方法。
关键词: MVC架构 控制器 视图 模型
1 MVC描述的软件模型
MVC是Model-View-Controller(模型-视图-控制器)的缩写,它把一个应用的处理流程分成模型层、视图层和控制层,这三层结构之间的关系如图1所示。
模型层(也称业务层)用于处理程序逻辑。它的任务是管理应用程序域的行为和数据,响应来自控制层的状态指令,把原有数据按照业务逻辑转换成指定意义的数据提供给视图层显示。
视图层用于把表示模型数据、逻辑关系和状态的信息以特定的形式表现在用户界面上。视图层的显示信息来自模型层,同一个模型可以对应多个视图。
控制层用于处理用户与软件的交互操作。控制层通知模型和视图做出相应的状态改变,使模型和视图协调工作。
2 MVC模式设计
MVC的目的是增加代码的重用率,减少数据表达、数据描述和应用操作的耦合度,从而提高软件的可维护性、扩展性和灵活性。MVC模式把界面表现和逻辑控制语句强制分离,解决了页面设计和程序开发中的工作交错与冲突,并解决了由于商业逻辑嵌入造成程序不可重用而且很难维护的问题。
本文设计了一个基于PHP语言、XML和XSL模板技术的MVC架构的Web应用系统。
2.1 代码结构
在系统中每一个页面被定义为一个Action,可以通过网址http://servername/index.php?action=actionname来访问页面。控制器中定义了每一个Action对应的模型和视图,它们之间的对应关系如图2所示。
表1为系统的基础代码结构,除少量的静态页面放在htdocs目录下外,其余的程序都放在PHP的库文件目录下。
在这个代码结构中,模型、视图和控制器三部分分别放置在不同目录中。其中,视图层包括显示模板(XSL)和页面操作控制(JS)二部分,模型层包括业务逻辑处理类库(Action Class)、数据输出处理(Action Execute)和PHP基础类库(PHP Class)三部分。因此,在系统中各部分的开发由不同的角色来完成,角色之间的工作交错和冲突可以减少,使系统程序升级和维护的思路也更加明晰。
2.2 系统实现
在系统中,客户端浏览器中呈现的是系统的视图部分,而模型和控制器则是透明的。当Web 服务器接收到客户提交的HTTP请求后,交给服务器中的控制器来处理。控制器按照请求中的Action信息,从系统配置中提取此Action的映射表,并把此请求映射到相应的处理模型;处理模型进行业务逻辑处理,处理完后返回状态更新的请求并将XML格式的数据结果给控制器;控制器根据结果选择相应视图模板并合成视图返回给客户。程序架构如图3所示。
2.2.1 控制层的实现
在这个系统中,控制器主要有以下四个作用。
(1)根据Action名称从数据库的映射表中找到处理此Action的模型信息、视图模板和此视图的用户操作控制信息。
(2)调用模型处理Action请求。
(3)合成业务逻辑处理返回的XML格式的数据信息和XSL视图模板为HTML的文件,并返回给客户端。
(4)在接收到一个业务逻辑处理模型返回的状态更新请求后,调用一个新的业务逻辑处理模型处理此请求。
控制器主要包括二个文件:includes/prepend.inc和includes/controller/controller.inc。 prepend.inc文件被设定为自动增加在被访问的文件前,因此这个文件非常适合作为控制器的主文件;Controller.inc中主要是控制器中的处理函数。这二个文件的代码如下。
prepend.inc
<?
include_once(″/action/configure/db.conf″);//数据库连接对象
include_once(″/control/controller.inc″);//控制器
…
$actionobj=getaction($action); //获得Action信息
if($actionobj[″model″] !=″″){
//调用model处理action请求信息
include_once($actionobj[″model″]);
eval(″\$modelobj=execute_″.$actionobj[″action″].″( );″);
if($modelobj[″type″]==″xmldata″){//返回html
//输出xml和xsl合成的html数据
echo xmlpraser($modelobj[″data″],$actionobj[″view″]);
}else if($modelobj[″type″]==″state″){ //请求更新状态
header(″Location:?″.$modelobj[″data″]); //交新模型处理
exit;
}
}else{//直接调用View输出}
?>
controller.inc:
<?
****得actionobj的信息****
function getaction($action){
global $dbobj,$conn,$result_id; //数据对象,连接,结果集
//从数据库中检索action对象信息
$sqlstr=″select*from t_action where action=′″.$action.″′″;
$result_id=$dbobj->exec($conn,$sqlstr);
if($dbobj->fetch_row($result_id)){
$actobj[″action″]=$action;
//action的处理模型名称
$actobj[″model″]=$dbobj->result($result_id,″model″);
//action的视图模板信息
$actobj[″view″]=$dbobj->result($result_id,″template″);
//其他控制参数
}else{ … }
return $actobj;
}
//****解析xml和xslt****
function php_scheme_get_all($Processor,$Schema,$RestUri){
$url=$Schema .′:′. $RestUri;
return file_get_contents($url);
}
function xmlpraser($data,$xslpath){
global $SYS_INCLUDEPATH;
$parser=xslt_create( ); //初始化解析对象
xslt_set_scheme_handlers($parser,array(′get_all′=>
′php_sheme_get_all′)); //设置处理方式
$parms[″_xml″]=″<?xml version=\″1.0\″ encoding=\″gb2312\
″?>″ . $data; //合成xml格式数据
$parms[″_xsl″]=file_get_contents($SYS_INCLUDEPATH.
″\\″ . $xslpath); //读取xsl模板文件
$result.=xslt_process($parser,′arg:/_xml′,′arg:/_xsl′,
NULL,$parms); //合成视图
xslt_free($parser); //释放解析对象
return $result;
}
?>
2.2.2 模型层的实现
模型是系统的数据核心。此系统中模型层主要包括三部分内容。
(1)业务逻辑处理。业务逻辑处理又可以分为二类:一类是抽象出来的业务逻辑,被封装成一个个PHP类;另一类是对某一具体Action的逻辑处理。
(2)PHP的基础类库。此部分与业务逻辑无关,描述的是对任何一类的应用系统中都要使用的公共函数类,这些类可以被其他程序调用。
(3)数据输出处理,把PHP数据转换成XML格式输出。
按照控制器的定义,每一个Actionname都要调用一个命名为execute_actionname( )的函数,这个函数会返回Action的处理结果。处理结果有二种情况:一种是返回XML格式的数据;一种是返回要求系统更新状态的状态值。一个典型的模型处理器程序结构如下:
<?
include_once(″/action/tool/tools.inc″); //工具系统的基础类
function gettoollist($toolid){ //获得工具信息
//指定要获得的工具信息
$params=array(″toolname″,″part_no″,″quantity″);
$toolobj=new toolinfo; //创建toolinfo类实例
$toolstinfo=$toolobj->GetToolListinfo($toolid,$params);
return $toolsinfo; //返回工具列表信息
}
function getxml($toolsinfo){ //转换工具信息为xml格式
while(list($id,$toolarray)=each($toolsinfo[″data″])){
$xmlstr.=″<items>″;
while(list($key,$value)=each($toolarray)){
$xmlstr.=″<″ .$key. ″>″.$value.″</″.$key.″>″;
}
$xmlstr.=″</items>″;
}
return $xmlstr;
}
function execute_tool_toollist( ) { //工具列表action的处理函数
$toolinfo=gettoollist($toolid); //工具信息
if($toolinfo[″state″]){ //输出xml格式数据
$rtnobj[″type″]=″xmldata″;
$rtnobj[″data″]=getxml(($toolinfo);
}else{ //跳转到错误处理页面
$rtnobj[″type″]=″state″;
$rtnobj[″data″]=″errorhandle″;
}
return $rtnobj;
}
?>
2.2.3 视图层的实现
视图是系统与客户交互的窗口。在Web应用系统中,视图是指客户最终看到的HTML页面。为了使页面具有风格统一、整齐、可配置的特点,系统一般都会采用模板技术。此系统即使用了XSL模板技术。系统中的视图层包括二部分:一部分是放在/includes/template目录下的XSL模板;另一部分是放在/htdocs目录下的js和css文件。最后,由控制器来完成合成视图的任务。
2.3 系统适应性
从整个系统的设计结构可以看出,系统的业务逻辑和显示是分离的:首先由网页设计人员和程序员共同确定需要的数据项和Action名称,在控制器中添加此Action;之后,网页设计人员设计各个显示模板;程序人员完成相应的模型处理程序。这样的设计方法有利于对系统的维护和功能扩展。
在MVC系统中处理用户需求的思路非常明确。视图的修改和模型处理的修改基本上是独立的,无论是在系统开发时期还是在系统维护时期,网页设计人员和程序员都可以更加专注于自己的任务。系统中的模型可以是自包含的,由于与控制器和视图相分离,所以很容易改变程序的数据层和业务规则。例如把数据库从 Mysql移植到Oracle上只需改变数据库连接模型即可;而把界面显示从HTML改为Flash或WAP只需改变视图显示和相应控制器即可。一旦正确地实现了模型,视图将会正确地加以显示。这样,系统维护的成本和项目的开发风险都被大大降低。
3 结束语
MVC设计思想中的三部分是相互独立的,既可以通过不同的技术实现,也可以运行在不同的基础平台上。随着更多新技术的出现,还可以创造出更多的应用方式。所以MVC设计模式的确是一个创建优秀软件的途径。
本文所描述的只是MVC应用系统开发的一个基础模式。模型和视图严格分离的模式相对混合模式,对开发和设计人员的要求要高一些,但更容易进行错误控制。此外,在实际的应用中,开发者还要结合各应用项目的业务需要进行详细的设计规划,认真考虑应用的额外复杂性。只有把这些想法融进到架构中,才能增加应用的可拓展性。只有把握这一点,MVC模式才会使得应用系统更加健壮、更加灵活和更容易扩展。
分享到:
相关推荐
MVC架构是一种广泛应用于Web...综上所述,基于MVC架构的Web应用系统设计可以有效地组织和分离Web应用开发中的不同关注点,利用PHP语言和XML、XSL技术,开发者可以构建一个结构清晰、维护性高、易于扩展的Web应用系统。
基于MVC架构的小学社团申请系统设计 本文将介绍基于MVC架构的小学社团申请系统设计,旨在解决中学社团管理中存在的问题。本系统采用B/S架构,客户端实现社团列表的查看、申请和审核结果的查询,服务端实现社团上线...
##### 3.3 MVC模式系统设计与实现 **Struts与MVC**:Struts是一个基于MVC模式的开源框架,广泛应用于Java Web应用的开发。通过Struts框架,可以轻松地实现MVC模式的各种功能,如用户请求处理、视图渲染等。 - **...
【基于MVC模式的投票系统】是一个典型的Web应用程序设计,它采用了Model-View-Controller(模型-视图-控制器)架构模式。这种模式在IT行业中广泛应用于开发动态、交互式的Web应用,因为它能够清晰地分离业务逻辑、...
【基于Mvc3架构简单留言薄】是一个Web应用程序项目,它使用Microsoft ASP.NET MVC3框架来构建一个基础的在线留言板功能。MVC(Model-View-Controller)是一种设计模式,广泛应用于Web开发,它将应用程序的业务逻辑、...
这些特性使得PHP成为构建Web应用的理想选择,尤其是在面向对象编程和MVC架构的应用中。 ##### 2.2 传统的PHP嵌入式开发 在PHP发展的早期阶段,代码通常是直接嵌入到HTML文档中。虽然这种方法简单直接,但在Web应用...
Struts是一个用于Java Web应用的开源框架,它基于MVC设计模式,为开发人员提供了一套标准化的方法来构建Web应用。Struts框架简化了开发过程,使得开发人员能够更专注于业务逻辑而不是架构细节。 1. **Struts的优点*...
10. **系统集成**:除了核心的MVC架构,系统可能还包括用户认证、权限管理、日志记录、错误处理等辅助功能,这些都是构建一个完整、健壮的超市管理系统所必需的。 通过深入学习和分析这个基于MVC的超市管理系统源码...
在实际应用中,开发团队需要根据业务需求和现有技术栈对这个PHP MVC架构的电商系统进行定制和调整,例如优化数据库查询、增强前端用户体验、集成第三方支付接口等。同时,良好的文档和社区支持也是评估开源项目的...
这个Java学生管理系统是基于MVC架构实现的,用于管理学生信息。系统可能包括如下功能: 1. **学生信息管理**:添加、删除、修改和查询学生的基本信息,如姓名、学号、专业等。 2. **成绩管理**:录入、查看、修改...
【基于MVC的PHP框架】是一种常见的Web应用开发模式,它将应用程序的逻辑分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种架构设计旨在提高代码的可读性、可维护性和模块化。在PHP世界里...
本系统“PHP基于MVC学生信息查询管理系统”是一个采用Model-View-Controller(MVC)设计模式构建的项目,专为初学者设计,旨在提供一个基础的数据库交互和网页展示的平台,帮助学习者理解并掌握PHP编程以及MVC架构。...
### 基于PHP面向对象的自定义MVC框架高级项目...通过学习,开发者不仅能够掌握MVC架构的核心概念,还能学会如何利用PHP语言的特点高效地开发Web应用。希望本教程能够帮助大家提升技能水平,在实际工作中更加游刃有余。
AMP-PHP是一个专门为Web应用程序设计的轻量级MVC(Model-View-Controller)框架,它基于PHP语言,旨在提供高效、简洁且可扩展的开发环境。AMP是Accelerated Mobile Pages的缩写,通常用于优化网页在移动设备上的加载...
通过学习和分析萌格网的源码,学生可以深入理解PHP和MySQL的结合使用,掌握MVC架构的设计思想,以及如何构建一个完整的Web应用。这对于提升PHP编程技能,以及理解Web开发流程都是非常有帮助的。
4. **MVC(Model-View-Controller)架构**:这是一种常见的Web应用设计模式,有助于分离业务逻辑、数据处理和用户界面。 5. **文件上传和下载**:PHP如何处理用户上传的文件,以及如何提供文件下载功能。 6. **...
【在线问卷调查系统设计】 本课程设计的主要任务是构建一个基于Web的在线问卷调查系统,旨在提供一个平台,使得系统管理人员能够设计匿名调查表,收集数据,并以图表形式展示统计结果。系统允许同时进行多个问卷...
标题中的“一个基于MVC模式简单Web应用,实现远程浏览系统文件”揭示了这个项目是使用Model-View-Controller(MVC)架构设计的一个Web应用程序,它的主要功能是让用户能够远程访问并浏览服务器上的文件系统。MVC模式...
- Blog系统设计 - 模型设计 - 视图构建 - 控制器实现 5. **总结与展望** 通过以上分析,我们可以看到,MVC模式在PHP Web开发中的应用不仅提高了代码的可读性和可维护性,还促进了团队协作,使得复杂的Web项目变...