65.9K
CodeProject 正在变化。 阅读更多。
Home

KudzuASP:KudzuASP 模板简介

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2007 年 12 月 11 日

CPOL

5分钟阅读

viewsIcon

13691

downloadIcon

154

将 KudzuASp 模板引擎用于经典 ASP

背景

在编写和修改了许多经典的 ASP 网站后,我厌倦了处理经典的 ASP 编程固有的业务规则与表示层缺乏分离的问题。我编写了 KudzuASP 来解决这个问题。

引言

在本文中,我们将探讨 KudzuASP 模板引擎的用法。KudzuASP 是一个用于经典 ASP 的模板引擎,旨在通过将业务规则和逻辑与表示层分离来简化网站的构建。它通过将尽可能多的 HTML 移到模板文件中来实现这一点。

Using the Code

如果您曾经用经典的 ASP 编写过网页,您可能知道管理向客户端浏览器输出表示的代码是多么令人沮丧。一旦您将业务规则和逻辑与程序控制、数据和 HTML 表示结合在一起,它会很快变得混乱。即使在 ASP 页面底部精心组织的也很混乱。事实上,这是应用程序中最难维护的部分。除了 CSS 之外,更改 ASP 应用程序的外观可能是一场噩梦!

我将向您展示一种清理 ASP 代码页面并比您想象的更容易地更改站点外观的方法。这是通过使用带标签的 HTML 文档作为模板,以及 KudzuASP 模板引擎来完成的。让我们通过探索三个非常基本的示例直接切入主题。第一个示例包括模板引擎并处理一个非常简单的基于文件的模板。

示例 1:HTML 模板

<html>
<head>
    <title>KudzuASP Example 1</title>
</head>
<body>
    <div>
        Hello World!
    </div>
</body>
</html>

示例 1:ASP 页面

<!-- #include file="_kudzu.asp" -->
<%

'------------------------------------------------------------
' Declare the template engine variable
'------------------------------------------------------------
Dim T_ENGINE

'------------------------------------------------------------
' Create an instance of the template engine
'------------------------------------------------------------
Set T_ENGINE = New CTemplateEngine

'------------------------------------------------------------
' Load the template and Create Ouput
'------------------------------------------------------------
T_ENGINE.ParseFile Server.MapPath("Example1.html")
T_ENGINE.EvalTemplate
%>

好吧,我们从模板中得到了与我们放入的完全相同的东西,而在这个例子中,这并不令人印象深刻。让我们添加第一个模板指令,并在模板中执行一些替换。

示例 2:HTML 模板

<html>
<head>
    <!--[Subst]-->
    <title>{{PageTitle}}: {{PageSubTitle}}</title>
    <!--[/Subst]-->
</head>
<body>
    <div>
    <!--[Subst]-->Welcome {{UserFName}} {{UserLName}}!<!--[/Subst]--><br />
    It is now: <!--[Replace|PageDate/]-->
    </div>
</body>
</html>

示例 2:ASP 页面

<!-- #include file="_kudzu.asp" -->
<%

'------------------------------------------------------------
' Declare the template engine variable
'------------------------------------------------------------
Dim T_ENGINE

'------------------------------------------------------------
' Create an instance of the template engine
'------------------------------------------------------------
Set T_ENGINE = New CTemplateEngine

'------------------------------------------------------------
' Your Code Here
'------------------------------------------------------------
T_ENGINE.PutValue "PageTitle", "Kudzu"
T_ENGINE.PutValue "PageSubTitle", "Example 2"
T_ENGINE.PutValue "UserFName", "Joe"
T_ENGINE.PutValue "UserLName", "Client"
T_ENGINE.PutValue "PageDate", Now( )

'------------------------------------------------------------
' Load the template and Create Ouput
'------------------------------------------------------------
T_ENGINE.ParseFile Server.MapPath("Example2.html")
T_ENGINE.EvalTemplate
%>

首先,请注意 KudzuASP 使用组件标签,并且有三种类型的标签。

  • <!--[Cmd]--> 是打开组件标签,它标记组件内容的开始。它必须与同名的关闭组件标签匹配。
  • <!--[/Cmd]--> 是关闭组件标签,它标记组件内容的结束。它必须与相应的打开组件标签匹配。
  • <!--[Cmd/]--> 是简单的组件表示法,它用于像 Replace 这样忽略 OpenClose 标签内任何内容的组件。

标签的 Cmd 值表示您正在调用哪个组件;它是大小写不敏感的。组件必须在引擎中注册。许多组件接受参数,它们通过管道分隔的列表形式传递给组件,如下所示:

<--[Cmd|Param1|Param2|Param3]-->...<!--[/Cmd]-->

...或者在某些情况下

<!--[Cmd|Param1|Param2|Param3/]-->

此示例使用 Substitute 组件 <!--[Subst]-->,它用模板引擎的 Values 集合中的值替换所有由 {{ }} 标签标记的字段。每个值的名称是通过去掉 {{}},将其修剪并使用结果作为大小写不敏感的查找来从引擎的值集合中派生出来的。您还可以从服务器、应用程序、会话、表单提交、查询字符串或 cookie 中查找值。更多内容将在另一篇文章中介绍。

示例 2 还调用了 Replace 组件 <!--[Replace|PageDate/]-->。与 Substitute 不同,此组件要求将值名称作为参数传递。然后将生成的值替换整个标签及其内容。我们也可以将其写成

<!--[Replace|PageDate]-->我的页面日期<!--[/Replace]-->

...但是因为我们要替换所有内容,所以使用简单的标签表示法更有意义。

KudzuASP 是免费的!

KudzuASP 在 Mozilla 公共许可证下分发。

KudzuASP 有 24 个有用的标准组件

KudzuASP 目前有 24 个标准组件,具有以下命令:

  • Case:基于命名值的 SELECT...CASE 编程结构
  • CrLf:将一个或多个回车换行符对插入到 HTML 输出中
  • Cycle:将变量循环通过一系列值(在迭代中使用)
  • Decr:递减命名值
  • Execute:执行另一个 ASP 页面并将内容插入到流中
  • Flush:刷新输出(由 Execute 隐式调用)
  • ForArray:迭代值数组中的内容
  • ForEach:迭代集合中的内容
  • IIf:当命名值为 true 时包含内容
  • IfIf...Then...Else 结构
  • IfTrue:当值为 true 时包含内容
  • IfFalse:如果值为 false 则包含内容
  • Ignore:完全忽略内容(用于原型设计)
  • Incr:将数值加一
  • Iterate:使用分配给迭代器集合的命名迭代器进行迭代
  • Record:评估并复制封闭的内容到一个命名值
  • Replace:用单个命名值替换内容
  • Profiler:计算“结束时间”,设置命名值并评估内容
  • SetValue:用另一个值设置命名值
  • Space:在输出流中插入一个或多个空格
  • Subst:对内容执行多个替换
  • Tab:在输出流中插入一个或多个制表符
  • Tree:使用类型为 TreeNode 的命名值绘制信息树
  • UnSetValue:从 Values 集合中移除一个值

其他值得关注的点

KudzuASP 使用 VBScript 类来实现组件,因此非常容易扩展模板引擎以执行您想要的任何类型操作。此外,考虑到 ASP 编译页面的方式,您的组件可以在不使用 Eval(...) 的情况下访问 VBScript 的运行时范围——全局变量、应用程序、会话、函数和子程序。由于 KudzuASP 可以直接集成到您已有的函数和子程序中,因此将 KudzuASP 安装到现有应用程序中非常容易。这是通过创建一个调用现有 VBScript 子程序或函数的自定义组件来完成的。例如:

<!-- #include file="_kudzu.asp" -->
<%

'------------------------------------------------------------
' Declare the template engine variable
'------------------------------------------------------------
Dim T_ENGINE

'------------------------------------------------------------
' Create an instance of the template engine
'------------------------------------------------------------
Set T_ENGINE = New CTemplateEngine

'------------------------------------------------------------
' Your Code Here
'------------------------------------------------------------
Class CallMyCodeComponent

    Sub HandleTag( vNode )
        ' Important if writing HTML directly to the response.
        vNode.Engine.ContentFlush
        
        ' call the existing subroutine
        Call MyExistingSub
    End Sub
    
End Class

'------------------------------------------------------------
' Existing website code
'------------------------------------------------------------
Sub MyExistingSub
    Response.Write "&ltbr />"
    Response.Write "<b>Hello from the custom component!</b>"
    Response.Write "&ltbr />"
End Sub

T_ENGINE.SetHandler "CallMyCode", New CallMyCodeComponent

T_ENGINE.PutValue "PageTitle", "Kudzu"
T_ENGINE.PutValue "PageSubTitle", "Example 3"
T_ENGINE.PutValue "UserFName", "Joe"
T_ENGINE.PutValue "UserLName", "Client"
T_ENGINE.PutValue "PageDate", Now( )

'------------------------------------------------------------
' Load the template and Create Ouput
'------------------------------------------------------------
T_ENGINE.ParseFile Server.MapPath("Example2.html")
T_ENGINE.EvalTemplate
%>

此模板看起来会像下面这样:

示例 3:HTML 模板

<html>
<head>
    <!--[Subst]-->
    <title>{{PageTitle}}: {{PageSubTitle}}</title>
    <!--[/Subst]-->
</head>
<body>
    <div>
        Templated Based Content
    </div>
    <!--[CallMyCode/]-->
</body>
</html>

请注意,通过简单地编辑模板并重新排列元素,我们可以修改 VBScript 源代码的调用时间和位置,从而改变结果输出的位置。

结论

就这些了。在下一篇文章中,我将详细介绍 Kudzu 中的 ForArrayForEachIterate 内容迭代,并展示组件如何包含带有嵌入式组件的模板内容。希望您喜欢我在 The Code Project 发表的第一篇文章,感谢您的阅读!

历史

  • 2007 年 12 月 11 日 - 发布原始版本
© . All rights reserved.