`
netbabe
  • 浏览: 24327 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

由浅入深:自己动手开发模板引擎——解释型模板引擎(一)

阅读更多

受到群里兄弟们的竭力邀请,终于决定来分享一下.NET下的模板引擎开发技术。本系列文章将会带您由浅入深的全面认识模板引擎的概念、设计、分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎。关于模板引擎的概念,我去年在百度百科上录入了自己的解释(请参考:模板引擎)。老陈曾经自己开发了一套网鸟Asp.Net模板引擎,虽然我自己并不乐意去推广它,但这已经无法阻挡群友的喜爱了!

与置换型模板引擎不同的是,解释型模板引擎包含了一个专用解释器,有了解释器的存在就可以支持一些更加复杂而严谨的语法。熟悉设计模式的朋友此时此刻应该能够回想起来“解释器模式”,它是将一些业务封装成一个或多个命令,然后通过一个复杂的解释器(Interpreter)来解析执行来满足生产需求的。实际上,解释型模版引擎就是一个较为复杂的解释器模式的实现而已。具体到模板引擎技术上来,解释器的工作任务实际上就小了很多。按照数据封装模式的不同,解释型模板引擎分为命令解释器和反射解释器两个大类。

命令解释器

还记得置换型模板引擎中,我们在最后曾经处理了一个较为负载的Label“{CreationTime:yyyy年MM月dd日 HH:mm:ss}”吗?实际上,这个就是命令解释器的一种实现。此Label中的format部分可以看作是CreationTime的一个命令。有了命令,我们可以让Label去做更多的事情,这是显而易见的。

命令也可以理解为指令。

为了更加能够说明这个问题,我们先将我们要处理的模板复杂化一点,如下:

  1. <!--#include file="_Page_Header.shtml" -->
  2. <ul>
  3. <li>博主姓名:陈彦铭</li>
  4. <li>创建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>
  5. <li>粉丝数量:{FunsCount:D4}</li>
  6. </ul>
  7. <!--#include file="_Page_Footer.shtml" -->

除了我们已经熟悉的{xxx}标签之外,我们又增加了一个文件包含指令“<!--#include file="_Page_Header.shtml" -->”。这个指令是标准的SHTML语法,意思就是将其他文档中的模板合并到当前的指令位置,如此我们便可以实现代码重用。尤其对于HTML开发来说,使用SHTML包含语法,还可以在诸如Dreamweaver等IDE中实现“所见即可得”的效果。

关于如何实现包含指令,我们将在后续章节中具体介绍。

反射解释器

接触了指令之后,其实我们还是不够满足,因为到目前为止,我们的模板只能做简单的标签置换,这个相当不给力。比如有些内容我们想让它根据情况输出,那么就需要条件语句的效果,再如我们经常会遇到列表等情况,此时要是能有个迭代语句岂不是很给力?难道我们要编写一堆的Label1、Label2、Label3?

有需求,是好事情!咱们是做技术的,为需求而生,为满足需求而战,没有需求,技术就都只是浮云!

为什么条件语句和迭代语句要使用反射来实现,因为在编写这篇文章之前,老陈已经决定了用反射来实现这些机制,无论您是否喜欢!Hah..

我们再次将模板语法复杂化如下:

 1 <!--#include file="_Page_Header.shtml" -->
2 <ul>
3 <li>博主姓名:陈彦铭</li>
4 <li>创建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>
5 <li>粉丝数量:{FunsCount:D4}</li>
6 </ul>
7 <hr />
8 <m:if test="{articles.Count > 0}">
9 <ul>
10 <m:foreach item="article" collection="articles">
11 <li><a href="{article.Url}">[{article.Category}] {article.Title}</a></li>
12 </m:foreach>
13 </ul>
14 </m:if>
15 <!--#include file="_Page_Footer.shtml" -->

现在有木有感觉到某种给力呢?虽然这不是最给力的……

概念

虽然,我们只增加了两种语法,而且不多,看起来也貌似并不复杂,但这背后将会牵扯到方方面面的问题,代码解析的难度进一步增加。我们有必要了解一下后面可能使用到的一些概念。

  • 元素:即Element。它是组成模板的最基本的元素,派生出标签、表达式、Tag等。
  • 标签:即Label。形如{item},或{item.getTitle()}等,标签不能嵌套使用,但标签内的语法可以较为复杂;
  • 表达式:即Expression。比如标签大括号之间的内容,我们从本节课开始将其称之为表达式,表达式是可以运行、计算的,例如我们可以输入较为复杂的标签:{item.x * item.y}
  • 运算符:有了表达式,那么我们就需要一些运算符支持,例如上述{item.x * item.y}中的 * 运算符
  • Tag:我们将Tag定义为形如<m:if></m:if><m:else/>这样的表示形式,它的主要作用是提供流程控制支持;
  • 特性:既然有Tag了,那么我们就需要特性,即Attribute,概念与xml/html中的Attribute一致,它通常为Tag提供可选参数;
  • 指令:即Command,其格式类似于Tag,只不过开始和结束标记被我们替换为xml/html的注释格式,形如:<!--#include file="_Page_Footer.shtml"-->

这里我列出的概念可能还不够完整,随着课程的演进,我们再一一认识他们!

再次提醒:如果之前的课程您没有掌握,请一定多多研究、体会,如果有问题可以随时通过评论提问,我会尽力解答!希望大家都能够真正的看懂、学会!

优点

解释型模板引擎可以支持更加复杂的语法、指令,能够满足更多的需求。同时由于它不像编译型模板引擎那样会受到运行时环境的限制,解释型模版引擎用途非常广泛。

缺点

但是它有一个很大的缺陷就是其内部使用了反射机制,虽然我们也试图对反射进行优化(请参考:浅谈.NET反射机制的性能优化),但这并不能完全解决反射带来的一系列问题,这就意味着在某些场合它无法获得令人满意。

小结

本课仅作为解释型模板引擎的一个引子,也是我写博过程中的一个缓冲。

在解析本课提出的两个模板代码的时候,您需要认真的体会我们之前的课程并学会它们,否则越往后面您就会越发的感觉到吃力!

为了自己,不要偷懒!学习是自己的,不学就一定不是自己的!


解释型模板引擎在我归纳的三大类模板引擎当中是难度最高的,我会细心的完成每一节课程,进度会比较慢,大家一定要耐着性子!我们的目标是看懂、学会、掌握,而不是直接应用它们!话说,楼主这一番苦心,大家是否表示赞同呢?

分享到:
评论

相关推荐

    SQLServer2012王者归来——基础、安全、开发及性能优化

    资源名称:SQL Server 2012王者归来——基础、安全、开发及性能优化内容简介:本书由浅入深,全面细致地讲述了SQL Server 2012的功能特性和开发应用。从SQL Server数据库基础到数据库安全,再到SQL Server开发及...

    由浅入深——Java 2自学教程 配书光盘.rar

    《由浅入深——Java 2自学教程》是一本旨在帮助初学者逐步掌握Java编程语言的书籍。配书光盘中的“由浅入深——Java 2自学教程 配书光盘.rar”压缩包文件,包含了书中所有工程素材和源码,这对于读者实践和理解Java...

    由浅入深——Java 2自学教程.rar

    《由浅入深——Java 2自学教程》是一本针对初学者至中级程序员精心编写的Java编程指南。这本书深入浅出地介绍了Java语言的核心概念和技术,旨在帮助读者掌握Java编程的基础,逐步提升到中高级水平。以下是根据书名、...

    由浅入深学C语言——基础、进阶与必做430题.崔久,蒋欣(带详细书签)

    第2篇是C语言技术进阶,包括数组、指针、函数、结构型、共用型、枚举型和用户自定义类型;第3篇是C语言高级应用,包括算法、预编译命令、文件和图形,以及预处理命令等内容;第4篇是C语言开发案例,详细讲解了C语言...

    由浅入深——Java 2自学教程

    由浅入深——Java 2自学教程

    由浅入深学C语言——基础、进阶与必做430题.pdf

    ### 由浅入深学C语言——基础、进阶与必做430题 #### 知识点概览 1. **C语言基础** - C语言的起源与发展 - C语言的特点与优势 - C语言的应用领域 2. **C语言开发环境搭建** - 对硬件系统的基本要求 - 对软件...

    [野火EmbedFire]《STM32库开发实战指南——基于野火霸道开发板》—20211109.pdf

    ### STM32库开发实战指南——基于野火霸道开发板 #### 关于本项目与野火 本项目是由野火团队推出的《STM32库开发实战指南》,旨在为学习者提供一套完整、实用且深入浅出的STM32开发教程。野火作为一个知名的嵌入式...

    1-中学趣味编程校本教材的开发与试用——Scratch信息技术教材开发案例

    - **建构主义理论**:认为学习是一个主动构建知识的过程,学生需要通过自己的探索和实践来获得知识。 - **计算思维理论**:旨在培养学生的逻辑思维能力和问题解决能力,使其能够运用计算机科学的方法来解决问题。 #...

    搜索引擎——原理、技术与系统(附作者课堂录音及讲稿)

    全书分三篇共13章内容,从基本工作原理概述,到一个小型简单搜索引擎具体细节的实现,进而详细讨论了大规模分布式搜索引擎系统的设计要点及其关键技术;最后介绍了面向主题和个性化的Web信息服务,阐述了中文网页...

    【由浅入深】windows驱动开发技术详解教程 pdf笔记下载

    《由浅入深》Windows驱动开发技术详解教程是一份针对初学者精心编撰的资源,旨在帮助读者逐步掌握Windows驱动程序开发的核心技能。这本笔记不仅涵盖了基础理论,还提供了丰富的实例,使得学习过程更加直观和实践化。...

    Web前端开发技术——HTML、CSS、JavaScript

    内容编排结构合理,由浅入深、循序渐进地引导读者快速入门,并能提高初级及以上读者的实际应用水平,让读者能够快速适应岗位的需求。 全书共分为15章。第1章Web前端开发技术综述; 第2章HTML基础; 第3章格式化文字...

    hibernate开发实例源码,由浅入深众多实例

    标题"hibernate开发实例源码,由浅入深众多实例"表明这是一份关于Hibernate框架的编程实践资料,涵盖了从基础到高级的各种示例。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者在数据库上操作对象...

    由浅入深玩转华为WLAN——3 WLAN配置示例.zip_becomehgv_truthk3n_华为

    本文将基于“由浅入深玩转华为WLAN——3 WLAN配置示例.zip”这个压缩包文件,深入探讨华为WLAN的配置知识。 首先,我们了解WLAN的基本概念。无线局域网是利用无线通信技术构建的局域网,通过无线接入点(Access ...

    自己动手写操作系统(含源代码).part2

    本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需...

    英集思——机器人说明

    ### 英集思——机器人说明 #### 公司概况 上海英集斯自动化技术有限公司是一家专注于智能机器人研发与生产的高新技术企业。公司致力于为教育和科研领域提供一系列高性能、多功能的智能机器人产品。其产品线丰富多样...

Global site tag (gtag.js) - Google Analytics