模板引擎在MVC设计模式视图层中的应用.pdf
http:/-1-模板引擎在模板引擎在 MVC 设计模式视图层中的应用设计模式视图层中的应用 王君健1,宋茂强2 1 北京邮电大学计算机科学与技术学院,北京(100876)2 北京邮电大学软件学院,北京(100876)E-mail: 摘摘 要:要:设计模式提高了软件设计过程和编码过程的复用度,提高了软件开发的效率。MVC就是设计模式中非常经典的一个。本文分析了一个开源的模板引擎库 Teng,讨论了此模板库在 MVC 设计模式视图层中的实际应用。关键词关键词:模式,MVC,模板,Teng 1.引引 言言 模式是一条由三部分组成的规则,它表示了一个特定环境、一个问题和一个解决方案之间的关系。每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。将设计模式引入软件设计和开发过程的目的在于充分利用已有的软件开发经验,这是因为设计模式通常是对于某一类软件设计问题的可重用的解决方案。设计模式的最终目标就是帮助人们利用熟练的软件设计师的集体经验,来设计出更加优秀的软件。MVC 是非常经典的一个设计模式,全称是 Model-View-Controller,即模型-视图-控制器。它是 20 世纪 80 年代为编程语言 Smalltalk-80 发明的一种软件设计模式,至今已经被广泛使用。MVC 的视图层是用户与系统交互的界面,主要是用于用户数据的输入,并向用户展示结果。输入与返回界面在内容本质上是相同的,但是由于用户对界面的要求语言、界面颜色或是显示方式不同,如果每个相应的配置都设计一个界面,那么就需要若干个界面,而且由于这些界面在内容本质上是相同的,只是显示方式不同,设计上就会产生很大的冗余,进而影响到编码。如何把显示方式和显示内容分开控制呢?模板正是解决此问题的一种方法。我们可以把内容做成模板,显示作为配置信息,最后,页面生成器用模板和配置信息一起生成满足用户特定要求的界面,展现在用户眼前。2.MVC 设计模式设计模式 MVC 把应用程序分成 3 个核心模块:模型(Model)、视图(View)和控制器(Controller),它们分别担当不同的任务1。如图 1 所示。http:/-2-图 1 MVC 设计模式 2.1 视图视图 视图是用户看到并与之交互的界面。视图向用户展示用户所关心的业务数据,也能够接收用户输入的数据,但是,视图并不能进行任何实际的业务流程处理。视图可以向模型查询业务数据,但不能直接改变模型中的业务数据。视图还能够接收模型发出的业务数据更新事件,从而对用户界面进行同步更新。2.2 模型模型 模型是应用程序的主体部分。模型表示业务数据和业务逻辑。一个模型能为多个视图提供业务数据。同一个模型可以被多个视图重用。2.3 控制器控制器 控制器接收用户的数据并调用模型和视图去完成用户的请求。当用户在试图上选择按钮或菜单时,控制器接收请求并调用相应的模型组件去处理请求,然后调用相应的视图来显示模型返回的数据。2.4MVC 处理过程处理过程 首先用户在视图提供的界面上发出请求,视图把请求转发给控制器,控制器调用相应的模型来处理用户请求,模型进行相应的业务逻辑处理,并返回数据。最后控制器调用相应的视图来显示模型返回的数据2。3.模板引擎模板引擎 由于在设计模式的应用中使用模板的思想还不是特别广泛,所以开源的模板库并不多见。本文讨论一个用 C+语言编写的模板库Teng3。Teng 严格地把应用逻辑与显示逻辑区分开来,后台程序取得所要呈现给用户的数据并把它们提供给模板引擎,显示页面设计者写出模板。最后,模板引擎选择相应的模板,把用户数据插入到显示页面的相应位置,再根 View 显示模型的业务数据 接收用户请求 把请求传给控制器 Model 包含业务数据 响应数据查询 处理业务逻辑 通知视图业务数据更 Controller 接受用户请求 调用相应模型响应请求 选择视图展示结果 http:/-3-据配置设置显示页面的一些属性,生成页面,展现给用户。后台程序设计者和页面设计者需要注意的就是数据结构的一致性。3.1 模板的语法特性模板的语法特性 模板的语法与 HTML 语法有些相似,都是由这两个符号括起来的标签,标签里面的由模板引擎进行解释,标签外面的原样输出。语法如表 1 所示。表 1 语法表 符号 说明 举例 注释 模板嵌套,可多级嵌套 段落格式化的开始 段落格式化的结束 其中 value 的可选值有:nowhite,删除这段中所有空格 onespace,把这段中所有的空格合成一个。striplines,删除段中行首和行尾的空格,空行除外。joinlines,删除段落中下一行行首的空格或一个空行。nowhitelines,删除段中空行 noformat,结束当前的格式化。hello world 应用程序中数据的引用 引用结束$variable 条件表达式,由条件来控制输出内容 b?hello world !定义变量 使用变量 使用表达式 =、+、!、&、&操作符,包括关系、算术、逻辑、位运算符 3.2 模板引擎的数据结构模板引擎的数据结构 模板的数据结构是由三个类组织起来的:Fragment_t,FragmentList_t,and FragmentValue_t。FragmentValue_t 是数据结构表中最基本的一项,它包括两个成员变量:一个是字符串型的 value(string value),它表示存储的数据;一个是 FragmentList_t 型指针(FragmentList_t*nestedFragments),如果为空,则此 FragmentValue_t 就是一个数据单元,如果非空,则http:/-4-FragmentValue_t 是一个指向一个 FragmentList_t 的指针。FragmentList_t 是 一 个 vector 数 组,数 组 元 素 是 Fragment_t 型 指 针(public vector),它的作用是存储一系列 Fragment_t 型指针。Fragment_t 是 一 个 map 映 射,把 段 名 字 和 段 值 映 射 起 来(public map)。图 2 模板引擎的数据结构示意图 这三个类组织成一个类似于树形的数据结构,把数据存储进去,待要使用时由模板引擎从中读取。其数据结构示意图如图 2 所示。3.3 模板生成函数模板生成函数 模板生成函数作为类 Teng 的一个成员函数存在着。在得到所用模板名称、待输出数据和各配置信息后,由这个函数提供标准输出。函数原型:int generatePage(const string&templateFilename,const string&skin,const string&dataDefinition,const string&dictionary,const string&language,const string&configuration,const string&contentType,const string&encoding,const TengFragment_t&data,TengWriter_t&writer,TengError_t&err)下面依次说明各参数意义:templateFilename-模板参数。skin-模板外观参数,在一组模板外观中选择特定外观的一个。dataDefinition-数据定义。dictionary-数据字典参数,用来支持多语言。Language-语言参数,在一组数据字典中选择特定语言的一个。Configuration-配置文件名称。contentType-输出内容的类型。Encoding-用于字符串操作函数。data-由上述数据结构封装的数据。writer输出设备。err错误日志。R1 R2 R3 null R4 R5 R6 http:/-5-4.模板在视图层中的应用模板在视图层中的应用 上一节对模板的介绍,阐述了模板的语法结构、封装数据的数据结构和界面生成函数。在这一节中,将通过在应用中详细地介绍整个模板引擎的工作原理,使读者更加深入的了解其思想。4.1 模板语法与模板语法与 HTML 语法共生语法共生 模板引擎有过滤的功能,只有满足其自身语法特性的行才会被解释和执行,其他不满足行的一律原样输出。正因为此,模板的语句和 html 语句才能互相嵌套,各自完成相应的功能。在编写页面文件时,只要在相应位置加入所需的模板语法即可。例如:Teng Template example$rnum$rnum 前三行和最后一行由于是 HTML 语句,模板引擎不会对其处理。中间三行是模板语法,它们表示的意思是,在 frag 段中寻找名为 variable 的变量,并把值输出,有几个输出几个,每一个输出占一行。4.2 后台程序写入数据后台程序写入数据 后台程序对应着 MVC 模型的 Model 模块,由其把数据从数据库或是文件中取出来,再由控制器模块把数据按照特定的组织形式装入与 View 模块交互的数据结构中。例如:Fragment_t rootFragment;FragmentList_t&rowList=rootFragment.addFragmentList(row);for(int i=0;i 2;+i)row.addVariable(rnum,i);for(int j=0;j 2;+j)Fragment_t&col=row.addFragment(col);col.addVariable(cnum,j);首先,定义一个根段 rootFragment,在其上插入一个名为 row 的子段;第一层循环中,在 row 上加上一项后进入第二层循环;第二层循环中,在 row 上再加入 col 子段,并在其上加入两项 cnum。最后,控制器层调用模板生成函数,把模板、数据和配置信息一起作为参数传递给函数,由函数生成最后展现在用户眼前的界面。最后生成的界面的格式为 Teng Template example http:/-6-0 0 1 1 0 1 5.结语结语 本文在详细的介绍了一种由 C+语言编写的模板引擎-teng 的语法特性、数据结构和生成器接口后,结合着项目开发,阐述了模板引擎在 MVC 设计模式中视图层的应用。引入了模板后,使得数据的获取和数据的展现分开实现,还融入了多语言、多配置信息等优秀的特点,使得设计更加灵活多变。相信这一技术特点能有更为广泛的应用。参考文献参考文献 1(美)沙洛维,(美)特罗特 Design patterns explained:a new perspective on object-oriented design 人民邮电出版社 2006 年 2 莫勇腾 深入浅出设计模式 清华大学出版社 2006 年 3 http:/ Application of Template Engine in the View Layer of the MVC Design Pattern Wang Junjian1,Song Maoqiang2 1School of Computer Science and Technology of BUPT,Beijing(100876)2School of Software Engineering of BUPT,Beijing(100876)Abstract Design pattern enhances the repeatable use of both the designing procedure and the coding procedure of software,therefor,it takes a high efficiency of the developing of software.The pattern called MVC is a quite classical one.In this paper,an open-resource template library teng is analyzed,and the application of the template library teng with view layer in MVC is discussed.Keywords:pattern,MVC,template,Teng