每一种举办过十分的大型的ASP-Web应用程序设计的开荒人士差相当的少皆有如下的涉世:ASP代码与页面HTML混淆难分,业务逻辑与显示情势绞合,使得代码
难以知晓、难以改进;程序编写制定必得在美术之后,成为项目瓶颈;整合的程序代码和HTML静态页面时,费用大批量的年月手艺得到完美的效应,兼作了画画。的
确,用脚本语言开荒Web应用不便于将数据的管理和数指标显得分开,但在三人合营的景色下,假诺无法将数据和出示分开,将大大影响开垦的频率,专门的学问分工的
发挥。
  此外的脚本语言,如JSP、PHP都有协和的减轻方案,ASP的后一代产物ASP.NET也促成了代码与页面,就好像平昔连接到ASP是没有错的选料。不过总有这么或那样的案由让大家不能或一时不可能甩掉ASP直接奔向.NET大营。从公司角度来看,转换语言是一笔不菲的投资,包蕴雇佣熟手.NET程序猿、培训原有程序猿、开辟工具的转型、开辟风格的转型、分界面风格转换、接口风格、软件构造、文书档案、开垦流程等等;这还表示原本的代码必需在新语言遭受里重写以达成最好的效果和平安;同时将直接影响近期内项目标速度,更有十分的大希望引致个别程序员出走。因而看来在你决定更动语言以前,在原基本功上寻求一种减轻方案,
才是最佳的抉择。
  PHP通过沙盘模拟经营实今世码与页面,可供选用的有FastTemplate、PHPLIB、Smarty等三种,个中PHPLIB的影响最大、使用最多。
既然如此,大家一向把它搬到ASP来,对于同期使用PHP和ASP的商家还会有很有裨益:一、美术工作管理页面时,不管将在套用PHP仍然ASP,管理情势是一样,无须经过培育;二、程序猿编写代码时,二种语言间的思绪左近或同等,雷同效果在二种语言实现时,只需拷贝过来略作改正就可以,保障了工效和类型进程。

1、模板类的安顿
  实今世码封装成为模板类,正是为了与PHPLIB宽容,也使得代码方便管理与恢弘。
  模板类要落到实处的目的为:从沙盘模拟经营文件中读入展现的HTML代码,将那个突显代码中供给动态数据之处替换为ASP程序运算所得出的多少,然后根据一定的逐个输出。当中,替换的一部分能够私行的设定。因此它必须产生如下职分:
    ·从沙盘模拟经营文件中读取显示用的HTML代码。
    ·将模板文件和骨子里变化的数目整合,生成输出的结果。
    ·允许同一时候管理多少个模板。
    ·允许模板的嵌套。
    ·允许对模板中的有个别单独的一对开展管理。

实现格局:
    接纳FSO读取模板文件
    采纳正则替换达成模板文件和多少的结缘
    管理五个模板用数组存款和储蓄来兑现。
    模板的嵌套的兑现入眼的主见是:将模板和输出(任何中间的拆解解析结果)同样注重,都可拿来做替换,就可以完成。
    单独部分的拍卖的通过在模板文件中设定表明,然后在正则替换中结成标明来调控,达成部分替换。

2、模板类的兑现
  给出具体代码此前,先把第一函数列出,用过PHPLIB的相恋的人应该对此很熟知了:
  1)Public Sub set_root(ByVal Value卡塔尔(قطر‎ 设定模板私下认可目录
  2)Public Sub set_file(ByVal handle,ByVal  filenameState of Qatar 读取文件
  3)Public Sub set_var(ByVal Name, ByVal Value, ByVal
Append卡塔尔(قطر‎ 设置映射数据-替换变量
  4)Public Sub unset_var(ByVal Name卡塔尔 撤销数据映射
  5)Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal
Name卡塔尔(قطر‎ 设置数据块
  6)Public Sub set_unknowns(ByVal
unknowns卡塔尔(قطر‎ 设定未钦点映射的号子管理情势
  7)Public Sub parse(ByVal Name, ByVal BlockTag, ByVal
Append卡塔尔 实践模板文件与数据的构成
  8)Public Sub p(ByVal Name卡塔尔国 输出管理结果

实今世码:
<%

‘================================================================
‘ CLASS NAME:  kktTemplate
ASP页面模板对象
‘ DESIGN BY :     彭国辉

DATE:                 2004-07-05

WEBSITE:          

BLOG:                

EMAIL:              kacarton@sohu.com


本对象中利用了set_var、set_block等命名方式是为了合营phplib

‘作品为小编原创,转发前请先与自己联系,转发请申明随笔出处、保留小编音讯,多谢支持!

‘================================================================

Class kktTemplate
    
    Private m_FileName, m_Root,
m_Unknowns, m_LastError, m_HaltOnErr
    Private m_ValueList,
m_BlockList
    Private m_RegExp    
    ‘ 布局函数
    Private Sub
Class_Initialize
        Set m_ValueList     =
CreateObject(“Scripting.Dictionary”)
        Set m_BlockList     =
CreateObject(“Scripting.Dictionary”)
        set m_RegExp        = New
RegExp
        m_RegExp.IgnoreCase =
True
        m_RegExp.Global     =
True
        m_FileName          =
“”
        m_Root              =
“”
        m_Unknowns          =
“remove”
        m_LastError         =
“”
        m_HaltOnErr         =
true
    End Sub
    
    ‘ 析构函数
    Private Sub
Class_Terminate
        Set m_RegExp       =
Nothing
        Set m_BlockMatches =
Nothing
        Set m_ValueMatches =
nothing
    End Sub
    
    Public Property Get
ClassName()
        ClassName =
“kktTemplate”
    End Property
    
    Public Property Get
Version()
        Version = “1.0”
    End Property
    
    Public Sub About()

        Response.Write(“kktTemplate ASP页面模板类<br>” & vbCrLf
&_

                       “程序设计:彭国辉 二〇〇二-07-05<br>” & vbCrLf
&_

                       “个人网址:<a
href=’;”
& vbCrLf &_

                       “电子邮件:<a
href=’mailto:kacarton@sohu.com’>kacarton@sohu.com</a><br>”State of Qatar
    End Sub
    
    ‘检查目录是或不是留存
    Public Function
FolderExist(ByVal path)
        Dim fso
        Set fso =
CreateObject(“Scripting.FileSystemObject”)
        FolderExist =
fso.FolderExists(Server.MapPath(path))
        Set fso = Nothing
    End Function
    ‘读取文件内容
    Private Function
LoadFile()
        Dim Filename, fso,
hndFile
        Filename =
m_Root
        If Right(Filename,
1)<>”/” And Right(Filename, 1)<>”” Then Filename =
Filename & “/”
        Filename =
Server.MapPath(Filename & m_FileName)
        Set fso =
CreateObject(“Scripting.FileSystemObject”)
        If Not
fso.FileExists(FilenameState of Qatar Then ShowError(“模板文件” & m_FileName &
“不存在!”)
        set hndFile =
fso.OpenTextFile(Filename)
        LoadFile =
hndFile.ReadAll
        Set hndFile =
Nothing
        Set fso = Nothing
        If LoadFile = “” Then
ShowError(“无法读取模板文件” & m_FileName & “或文件为空!”)
    End Function
    
    ‘管理错误新闻
    Private Sub ShowError(ByVal
msg)
        m_LastError =
msg
        Response.Write “<font
color=red style=’font-size;14px’><b>模板错误:” & msg &
“</b></font><br>”
        If m_HaltOnErr Then
Response.End
    End Sub
    
    ‘设置模板文件私下认可目录
    ‘Ex:
kktTemplate.set_root(“/tmplate”)
    ‘    kktTemplate.Root =
“/tmplate”
    ‘    root =
kktTemplate.get_root()
    ‘    root =
kktTemplate.Root

    ‘使用形似set_root那样的命名方式是为了合营phplib,以下将不再重复认证
    Public Sub set_root(ByVal
Value)
        If Not FolderExist(ValueState of QatarThen ShowError(Value & “不是实用目录或目录不真实!”)
        m_Root = Value
    End Sub
    Public Function
get_root()
        get_root =
m_Root
    End Function
    Public Property Let Root(ByVal
Value)
        set_root(Value)
    End Property
    Public Property Get
Root()
        Root = m_Root
    End Property
    
    ‘设置模板文件
    ‘Ex:
kktTemplate.set_file(“hndTpl”, “index.htm”)

    ‘本类不扶植多模板文件,handle为协作phplib而保留
    Public Sub set_file(ByVal
handle,ByVal  filename)
        m_FileName =
filename
        m_BlockList.Add Handle,
LoadFile()
    End Sub
    Public Function
get_file()
        get_file =
m_FileName
    End Function
‘     Public Property Let
File(handle, filename)
‘         set_file handle,
filename
‘     End Property
‘     Public Property Get
File()
‘         File =
m_FileName
‘     End Property
    

    ‘设置对未钦命的符号的管理情势,有keep、remove、comment三种
    Public Sub set_unknowns(ByVal
unknowns)
        m_Unknowns =
unknowns
    End Sub
    Public Function
get_unknowns()
        get_unknowns =
m_Unknowns
    End Function
    Public Property Let
Unknowns(ByVal unknown)
        m_Unknowns =
unknown
    End Property
    Public Property Get
Unknowns()
        Unknowns =
m_Unknowns
    End Property
    
    Public Sub set_block(ByVal
Parent, ByVal BlockTag, ByVal Name)
        Dim Matches
        m_RegExp.Pattern =
“<!–s+BEGIN ” & BlockTag &
“s+–>([sS.]*)<!–s+END ” & BlockTag &
“s+–>”
        If Not
m_BlockList.Exists(ParentState of Qatar Then ShowError(“未钦命的块标识” &
Parent卡塔尔
        set Matches =
m_RegExp.Execute(m_BlockList.Item(Parent))
        For Each Match In
Matches
            m_BlockList.Add
BlockTag, Match.SubMatches(0)

            m_BlockList.Item(Parent) =
Replace(m_BlockList.Item(Parent), Match.Value, “{” & Name &
“}”)
        Next
        set Matches =
nothing
    End Sub
    
    Public Sub set_var(ByVal
Name, ByVal Value, ByVal Append)
        Dim Val
        If IsNull(Value) Then Val
= “” Else Val = Value
        If
m_ValueList.Exists(Name) Then
            If Append Then
m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
            Else
m_ValueList.Item(Name) = Val
        Else
            m_ValueList.Add Name,
Value
        End If
    End Sub
    
    Public Sub unset_var(ByVal
Name)
        If
m_ValueList.Exists(Name) Then m_ValueList.Remove(Name)
    End Sub
    
    Private Function
InstanceValue(ByVal BlockTag)
        Dim keys, i
        InstanceValue =
m_BlockList.Item(BlockTag)
        keys =
m_ValueList.Keys
        For i=0 To
m_ValueList.Count-1
            InstanceValue =
Replace(InstanceValue, “{” & keys(i) & “}”,
m_ValueList.Item(keys(i)))
        Next
    End Function
    
    Public Sub parse(ByVal Name,
ByVal BlockTag, ByVal Append)
        If Not
m_BlockList.Exists(BlockTag卡塔尔国 Then ShowError(“未内定的 块标识” &
Parent卡塔尔国
        If
m_ValueList.Exists(Name) Then
            If Append Then
m_ValueList.Item(Name) = m_ValueList.Item(Name) &
InstanceValue(BlockTag) _
            Else
m_ValueList.Item(Name) = InstanceValue(BlockTag)
        Else
            m_ValueList.Add Name,
InstanceValue(BlockTag)
        End If
    End Sub
    
    Private Function finish(ByVal
content)
        Select Case
m_Unknowns
            Case “keep” finish =
content
            Case “remove”
                m_RegExp.Pattern
= “{[^ trn}]+}”
                finish =
m_韦德国际bv1946,RegExp.Replace(content, “”)
            Case
“comment”
                m_RegExp.Pattern
= “{([^ trn}]+)}”
                finish =
m_RegExp.Replace(content, “<!– Template Variable $1 undefined
–>”)
            Case Else finish =
content
        End Select
    End Function
    
    Public Sub p(ByVal
Name)
        If Not
m_ValueList.Exists(Name卡塔尔(قطر‎ Then ShowError(“不设有的符号” & Name卡塔尔国

        Response.Write(finish(m_ValueList.Item(Name)))
    End Sub
End Class
%>

3、使用例子
  上面举多少个例子进行验证。
1卡塔尔国简单的值替换
模板文件为myTemple.tpl,内容:

<html><title>ASP模板简单替换</title><body>

恭喜!你赢了一辆{some_color}法拉利!
</body>

上面是ASP代码(kktTemplate.inc.asp便是地点给出的模板类):
<!–#INCLUDE
VIRTUAL=”kktTemplate.inc.asp”–>
<%
dim my_color, kkt
my_color = “红色的”
set kkt = new
kktTemplate                 ‘创造模板对象
kkt.set_file “hndKktTemp”,
“myTemple.tpl” ‘设置并读取模板文件myTemple.tpl
kkt.set_var “some_color”,
my_color, false ‘设置模板变量 some_color = my_color的值
kkt.parse “out”, “hndKktTemp”,
false      ‘模板变量 out = 处理后的文件
kkt.p
“out”                               ‘输出out的内容
set kkt =
nothing                         ‘销毁模板对象
%>

实践后输出为:
<html><title>ASP模板简单替换</title><body>
恭喜!你赢了一辆玛瑙红的法拉利!
</body>

2卡塔尔循环块演示例子
模板文件my坦普尔2.tpl:

<html><title>ASP模板-块的示范</title><body>
<table cellspacing=”2″
border=”1″><tr><td>下边包车型大巴动物您心爱哪类</td></tr>
<!– BEGIN AnimalList
–>
<tr><td><input
type=”radio” name=”chk”>{animal}</td></tr>
<!– END AnimalList
–>
</table>
</body>

ASP代码:
<!–#INCLUDE
VIRTUAL=”kktTemplate.inc.asp”–>
<%
dim animal, kkt, i
animal =
Array(“小猪”,”小狗”,”小强”)
set kkt = new kktTemplate
kkt.set_file “hndKktTemp”,
“myTemple2.tpl”
kkt.set_block “hndKktTemp”,
“AnimalList”, “list”
for i=0 to UBound(animal)
    kkt.set_var “animal”,
animal(i), false
    kkt.parse “list”,
“AnimalList”, true
next
kkt.parse “out”, “hndKktTemp”,
false
kkt.p “out”
set kkt = nothing
%>
  
实行结果:
<html><title>ASP模板-块的演示</title><body>
<table cellspacing=”2″
border=”1″><tr><td>上面包车型地铁动物您爱怜哪类</td></tr>
<tr><td><input type=”radio”
name=”chk”>小猪</td></tr>
<tr><td><input type=”radio”
name=”chk”>小狗</td></tr>
<tr><td><input type=”radio”
name=”chk”>小强</td></tr>
</table>
</body>
                                        

3卡塔尔国嵌套块演示
模板文件myTemple3.tpl:

<html><title>ASP模板-嵌套块演示</title>
<body><table width=”400″
border=”1″ bordercolor=”#000000″>
  <tr><td><div
align=”center”>{myname}测试</div></td></tr>

  <tr><td>小编的动生态园:</td> </tr>
<!– BEGIN animalList
–>

  <tr><td>{animal}</td></tr>
  <!– BEGIN plantList
–>

    <tr><td>  {plant}</td></tr>
  <!– END plantList
–>
<!– END animalList
–>
</table>
</body>
</html>

ASP代码:
<!–#INCLUDE
VIRTUAL=”kktTemplate.inc.asp”–>
<%
dim my_color, kkt, myname,
animal, plant
set kkt = new kktTemplate

myname = “kktTemplate block
test…”
animal = array(“动物”,
“植物”)
plant  =
array(array(“小猪”,”小白”,”小强”), array(“玫瑰”,”向日葵”))

kkt.set_file “hndKktTemp”,
“myTemple3.tpl”
kkt.set_var “myname”, myname,
false
kkt.set_block “hndKktTemp”,
“animalList”, “a”
kkt.set_block “animalList”,
“plantList”, “p”

for i=0 to UBound(animal)
   kkt.set_var “animal”,
animal(i), False
   kkt.unset_var “p”  
   ‘kkt.set_var “p”, “”,
false
   for j=0 to
UBound(plant(i))
        kkt.set_var “plant”,
plant(i)(j), false
        kkt.parse “p”,
“plantList”, true
   next
   kkt.parse “a”, “animalList”,
true
next
kkt.parse “out”, “hndKktTemp”,
false
kkt.p “out”
%>

试行结果:
<html><title>ASP模板-嵌套块演示</title>
<body><table width=”400″ border=”1″
bordercolor=”#000000″>
  <tr><td><div align=”center”>kktTemplate block
test…测试</div></td></tr>
  <tr><td>小编的动生态园:</td> </tr>
  <tr><td>动物</td></tr>
    <tr><td>  小猪</td></tr>
    <tr><td>  小白</td></tr>
    <tr><td>  小强</td></tr>
  <tr><td>植物</td></tr>
    <tr><td>  玫瑰</td></tr>
    <tr><td>  向日葵</td></tr>
</table>
</body>
</html>

相关文章