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

KudzuASP:KudzuASP 模板简介

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.45/5 (9投票s)

2007年12月21日

CPOL

5分钟阅读

viewsIcon

44743

downloadIcon

157

将 KudzuASP 模板引擎用于经典 ASP

背景

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

引言

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

Using the Code

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

我将向您展示一种清理 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 Output
'------------------------------------------------------------
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 时包含内容
  • If:一个 If...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 源代码的调用时间和位置,从而改变结果输出的位置。

结论

以上就是今天的全部内容。现在您已经拥有了在经典 ASP 中编写完全模板化的网页所需的一切。最初,我计划撰写一篇关于 ForEachIterate 标签的附加文章,但我从未这样做过。原因是编写自定义组件(如示例 3 所示)要容易得多。希望您喜欢我在 Code Project 发表的第一篇文章,感谢阅读!

Github 存储库

KudzuASP 项目目前托管在 Github 上。请使用以下链接访问该项目。
https://github.com/Mumpitz/KudzuASP

历史

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