亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ASP支持嵌套模板和循環標簽的模板類

2019-11-17 04:13:40
字體:
來源:轉載
供稿:網友

asp Template 類說明

作者:shaoyun Form www.devjs.com
時間:17:05 2008-12-10
++功能簡介

--支持單層循環標簽,并可在一個頁面類多次使用.
--支持引入模板文件,在裝載的時候,將進行模板的合并
--可指定模板文件路徑,路徑為相對路徑,默認為當前文件路徑
--對于空白行最終輸出的時候,進行刪除

++標簽定義

{$tag$} 普通標簽
{$include:filename$} 模板文件標簽
<loop name="tagname">...</loop> 循環標簽,name屬性為標簽名稱
{$tag/subtag$} 循環標簽中的子標簽

++標簽說明:

采用正則表達式進行標簽的匹配和過濾,loop標簽中的name屬性之前可以有多個空格,之前之后可以存在其他屬性,name屬性可以帶引號也可以不帶,識別單引號和雙引號,設定只匹配第一個

++函數說明

LoadTPL函數 讀取模板文件,讀取的時候,檢查模板文件里的嵌套模板文件標簽,首先替換嵌套的模板文件標簽的內容,合并模板文件,存入變量

Assign函數 分析模板標簽,對于普通標簽將其加入數據對象,如果為循環標簽,則存入循環數據對象,如果循環標簽對象更換,則將循環累加的數據加入數據對象

Flush函數 模板類很重要的一個函數,用于處理循環標簽,對于單次的循環,執行循環塊內部替換,對循環數據進行累加保存,每個單次循環完后必須調用

Bulid函數 將沒有來的及保存的循環數據加入到數據對象,然后按照模板定義輸出數據對象中的所有數據,普通標簽的替換在這一步完成

特別說明一下,assign函數有一個便捷的賦值方法,就是調用默認屬性來賦值,效果是一致的,例如:

 程序代碼
tp.assign("title","新聞")

可以采取這樣更簡潔的賦值方式

 程序代碼
tp("title")="新聞"

tp是實例化的模板對象

整個模板了代碼如下(template.asp):


 程序代碼
<%
Class Template

PRivate m_content,m_looptmp,tagData,loopdata,m_loop_content,m_Looptag,m_TplPath,m_SetTplPath
Private m_ClassName,m_Version,m_Copyright

Private Sub Class_Initialize()
  m_content="" : m_looptmp="" : m_loop_content="" : m_looptag=""
  m_ClassName="Shaoyun ASP Template類" : m_Version="1.0" : m_Copyright="DevJS.com"
  m_TplPath="./" : m_SetTplPath=false
  Set tagData = Server.CreateObject("Scr  Set loopData = Server.CreateObject("Scripting.Dictionary")
End Sub

Private Sub Class_Terminate()
  m_content="" : m_looptmp="" : m_loop_content="" : m_looptag=""
  m_TplPath="./" : m_SetTplPath=false
  Set tagData = Nothing : Set loopData = Nothing
End Sub

Public Property Get ClassName
  ClassName = m_ClassName
End Property

Public Property Get Version
  Version = m_Version
End Property

Public Property Get Copyright
  Copyright = m_Copyright
End Property

Rem 模板類的默認屬性,判斷模板中是否含有這個標簽
Public Default Property Get Tag(tagname)
  Tag = InStr(m_content,"{$" & tagname & "$")>0
End Property

Rem 調用定義好的賦值函數,這個屬性用來簡化賦值操作
Public Property Let Tag(tagname,replaceString)
  Call Assign(tagname,replaceString)
End Property

Public Property Get TplPath
  TplPath = m_TplPath
End Property

Rem 設定模板文件的路徑
Public Property Let TplPath(sTplPath)
  If sTplPath<>"" Then m_TplPath = sTplPath
  If Right(m_TplPath,1)<>"/" Then m_TplPath = m_TplPath & "/"
End Property

Private Function LoadFromFile(sFilePath,sCharset)
  LoadFromFile=false
  Dim oStream
  Set oStream=Server.CreateObject("ADODB.Stream")
  oStream.Type=2
  oStream.Mode=3
  oStream.Open
  oStream.Charset=sCharset
  oStream.Position=oStream.Size
  oStream.LoadFromFile sFilePath
  LoadFromFile=oStream.ReadText
  oStream.Close
  Set oStream=Nothing
End Function

Private Function FileExist(filespec)
  On Error Resume Next
  FileExist=False
  Dim o
fso : Set oFSO = Server.CreateObject("Scripting.FileSystemObject")
  FileExist=oFSO.FileExists(filespec)
  Set oFSO=Nothing
End Function

Rem 獲取循環塊
Private Function GetTmpStr(tplstr,tagname,attname)
  Dim regEx,Matches,Match
  Set regEx = New RegExp
  regEx.Pattern = "<" & tagname & ".*?/s+name=[/""|/']?" & attname & "[/""|/']?.*?>([/s/S.]*?)<//" & tagname & ">"
  regEx.Global = False
  regEx.IgnoreCase = True
  Set Matches = regEx.Execute(tplstr)
  For Each Match in Matches
  GetTmpStr=Match.Value
  Next
  Set regEx = Nothing
End Function

Rem 移除HTML標記
Private Function RemoveTag(tagString,tagname)
  Dim regex
  Set regex=New RegExp
  regEx.Pattern = "<[//]?" & tagname & ".*?>"
  regEx.Global = True
  regEx.IgnoreCase = True
  RemoveTag = regEx.Replace(tagString,"")
  Set regex=nothing
End Function

Rem 移除空白行
Private Function RemoveSpace(tagString)
  Dim regex
  Set regex=New RegExp
  regEx.Pattern = "/n/s*/r"
  regEx.Global = True
  regEx.IgnoreCase = True
  RemoveSpace = regEx.Replace(tagString,"")
  Set regex=nothing
End Function

Rem 讀取模板文件,同時處理嵌套模板,進行模板的合并
Public Function LoadTpl(tplfile)
  tplfile=Server.MapPath(tplfile)
  If Not FileExist(tplfile) Then
    Response.Write "Load template file faild!"
    Response.End
    Exit Function
  End If
  m_content=LoadFromFile(tplfile,"GB2312")
  Dim regEx,Matches,Match,fname,sContent
  Set regEx = New RegExp
  regEx.Pattern = "/{/$include/:(.*?)/$/}"
  regEx.Global = True
  regEx.IgnoreCase = True
  Set Matches = regEx.Execute(m_content)
  For Each Match in Matches
    fname=Match.SubMatches(0)
    fname=Server.MapPath(m_TplPath & fname)
    If FileExist(fname) Then
      sContent=LoadFromFile(fname,"GB2312")
      m_content=replace(m_content,Match.value,sContent)
    End If
  Next
  Set regEx = Nothing
End Function

Rem 賦值替換函數
Public Function Assign(tagname,replaceString)
  If tagname="" Then Exit Function
  Rem 如果是循環標簽
  If InStr(tagname,"/")>0 and InStr(tagname,"/")<Len(tagname) Then
    Rem 獲取循環標簽名稱
    m_curLooptag=Left(tagname,InStrRev(tagname,"/")-1)
    If m_Looptag="" Then
      Rem 如果是第一次檢測到循環標簽,設置循環所需變量初始值
      m_looptag=m_curLooptag : m_loop_content=""
      m_looptmp=GetTmpStr(m_content,"loop",m_Looptag)
    Else
      If m_LoopTag<>m_curLooptag Then
        Rem 如果循環標簽改變,初始循環變量
        m_content=replace(m_content,m_looptmp,m_loop_content)
        m_looptag=m_curLooptag : m_loop_content=""
        m_looptmp=GetTmpStr(m_content,"loop",m_Looptag)
      End If
    End If
    If Not(loopData.Exists(tagname)) Then loopData.Add tagname,replaceString
  Else
    Rem 普通標簽
    tagData.Add tagname,replaceString
  End If
End Function

Rem 執行塊內替換
Public Function Flush()
  If loopdata.count>0 then
    Dim i
    chgtmp=RemoveTag(m_looptmp,"loop")
    arrtag=loopData.keys
    arrval=loopData.items
    For i=0 To loopData.count-1
      chgtmp=replace(chgtmp,"{$" & arrtag(i) & "$}",arrval(i))
    Next
    Rem 將塊內數據保存到變量中
    m_loop_content=m_loop_content & chgtmp
    loopdata.RemoveAll
  End if
End Function

Rem 構建,完成模板的最后替換
Public Function Bulid()
  m_content=replace(m_content,m_looptmp,m_loop_content)
  arrtag=tagData.keys
  arrval=tagData.items
  For i=0 To tagData.count-1
    m_content=replace(m_content,"{$" & arrtag(i) & "$}",arrval(i))
  Next
  m_Content=RemoveSpace(m_Content)
  Response.Write m_Content
End Function

End Class
%>


父模板模板代碼(default.tpl):


 程序代碼
{$include:head.tpl$}
<h1 align=center>{$doc_title$}</h1>
<h3>{$news_title$}</h3>
<ul>
<loop name="news">
  <Li style="color:#F00">新聞標題:{$news/title$}--作者:{$news/author$}</Li>
</loop>
</ul>
<h3>{$lastest_news$}</h3>
<ul>
<!-- 這里loop中的bing和count只用作測試,不是必須的,實際使用的時候請刪除 -->
<loop bind="id"  name=arts count="15">
  <Li>文章標題:{$arts/title$}--作者:{$arts/author$}</Li>
</loop>
</ul>
{$include:foot.tpl$}


嵌套的子模板(head.tpl):


 程序代碼
<title>{$doc_title$}</title>


嵌套的子模板(foot.tpl):


 程序代碼
<p align=center>Copyright By DevJS.Com</p>


調用代碼(default.asp):


 程序代碼
<!--#include file="function/template.asp"-->
<%
Rem 模板類的使用方法事例

Set tp = new Template
tp.tplpath="tpl"
tp.LoadTpl(tp.tplpath & "default.tpl")
tp.assign "doc_title","模板機制的例子"
tp.assign "news_title","國內新聞"
for i=0 to 2
  call tp.assign("arts/title","金融危機導致大批失業人員")
  call tp.assign("arts/author","網易")
  tp.flush
next
tp.assign "lastest_news","最新文章"
Rem 這里改用另一種賦值方式
for i=0 to 2
  tp("news/title")="政府利好消息將有助拉高股市"
  tp("news/author")="SOHU"
  tp.flush
next
tp.bulid
Set tp = nothing
%>


本文來源于shaoyun的blog http://www.devjs.com/ , 原文地址:http://www.devjs.com/post/asp-template-class.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一本色道久久88亚洲综合88| 日韩电影视频免费| 欧美大胆在线视频| 亚洲人成网在线播放| 国内精品小视频| 欧美大成色www永久网站婷| 国产专区欧美专区| 91精品国产91久久久久久最新| 国外成人免费在线播放| 91精品国产色综合久久不卡98口| 亚洲va欧美va在线观看| 久久av中文字幕| 久久不射电影网| 亚洲色图偷窥自拍| 亚洲欧美日韩高清| 久久免费高清视频| 日韩在线视频中文字幕| 欧美区二区三区| 日韩精品在线播放| 欧美疯狂xxxx大交乱88av| 日韩欧美在线观看视频| 97在线视频免费观看| 国产日韩欧美一二三区| 国产欧美一区二区三区四区| 国产成人一区二区在线| 国产精品免费在线免费| 成人激情视频在线| 国产精品99久久久久久久久久久久| 欧美在线视频在线播放完整版免费观看| 中文字幕久久亚洲| 欧美在线观看www| 国产午夜精品视频免费不卡69堂| 亚洲精品狠狠操| 97福利一区二区| 国产欧美日韩丝袜精品一区| 亚洲激情在线观看| 亚洲男人av在线| 亚洲欧美另类在线观看| 岛国av一区二区三区| 亚洲人成伊人成综合网久久久| 日韩大陆欧美高清视频区| 2019亚洲日韩新视频| 亚洲美女av网站| 精品国模在线视频| 欧美性猛交xxxx免费看久久久| 欧美日韩一区二区免费视频| 欧美激情久久久久久| 欧美日韩在线免费| 国产成人在线精品| 久久精品国产成人| 欧美第一黄色网| 国产精品男女猛烈高潮激情| 欧美在线观看一区二区三区| 国产精品久久9| 亚洲综合日韩在线| 欧美在线视频播放| 国产在线视频一区| 国产一区二中文字幕在线看| 久久久久久久999精品视频| 久久人人97超碰精品888| 国产精品99蜜臀久久不卡二区| 亚洲已满18点击进入在线看片| 91精品国产九九九久久久亚洲| 欧美另类老女人| 久久全国免费视频| 在线国产精品视频| 91影院在线免费观看视频| 亚洲欧美三级伦理| 91在线免费看网站| 欧美成人精品三级在线观看| 久久久久国产一区二区三区| 中文字幕亚洲综合久久筱田步美| 亚洲精品福利资源站| 久久久久久久91| 亚洲美女又黄又爽在线观看| 亚洲色图国产精品| 精品亚洲永久免费精品| 久久亚洲精品一区二区| 欧美亚洲成人xxx| 性欧美xxxx| 88国产精品欧美一区二区三区| 国产精品久久久久aaaa九色| 国产91色在线|免| 97国产精品人人爽人人做| 日韩欧美在线播放| 欧美性极品xxxx娇小| 亚洲伊人第一页| 久久中国妇女中文字幕| 97超级碰在线看视频免费在线看| 久久久综合免费视频| 久热精品视频在线| 精品视频—区二区三区免费| 日韩成人在线网站| 按摩亚洲人久久| 亚洲精品99999| 色999日韩欧美国产| 亚洲大胆人体av| 成人久久18免费网站图片| 久久久久成人网| 亚洲一区二区三区视频播放| 国产97在线视频| 亚洲国产欧美在线成人app| 日韩欧美在线中文字幕| 国产精品永久免费在线| 国语自产精品视频在线看抢先版图片| 日韩中文有码在线视频| 日韩精品免费观看| 亚洲网站在线看| 日本精品视频在线播放| 亚洲综合色激情五月| 欧美激情精品久久久久久大尺度| 精品毛片三在线观看| 欧美电影在线播放| 综合国产在线视频| 自拍亚洲一区欧美另类| 亚洲人成亚洲人成在线观看| 操91在线视频| 亚洲欧美一区二区三区情侣bbw| 国产精品十八以下禁看| 亚洲欧美色婷婷| 久久精品国产69国产精品亚洲| 欧美性xxxxxxx| 亚洲最新av在线网站| 亚洲国产精品人人爽夜夜爽| 精品高清一区二区三区| 成人美女av在线直播| 成人深夜直播免费观看| 欧美激情一区二区三区高清视频| 欧美午夜精品久久久久久人妖| 国产成人av网| 国产视频久久久久| 91九色国产社区在线观看| 国产日韩欧美电影在线观看| 久久理论片午夜琪琪电影网| 疯狂做受xxxx欧美肥白少妇| 亚洲人成在线观看| 中文字幕视频一区二区在线有码| 日韩精品在线视频美女| 欧美亚洲视频一区二区| 色综合久久悠悠| 国模精品视频一区二区| 久久久久久久久久婷婷| 欧美有码在线视频| 国产99在线|中文| 国产日韩专区在线| 久久综合五月天| 欧美丰满少妇xxxx| 色系列之999| 91成人性视频| 亚洲国产精品成人va在线观看| 最近2019中文免费高清视频观看www99| 欧美第一淫aaasss性| 欧美国产亚洲精品久久久8v| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品日韩丝袜精品| 亚洲精品视频播放| 亚洲偷熟乱区亚洲香蕉av| 亚洲自拍在线观看| 久久九九国产精品怡红院| 久久国产一区二区三区| 538国产精品一区二区在线| 久久在线观看视频| 国产精品永久在线| 国产精品老牛影院在线观看|