Quelle des Artikels: Programmierhinweise
http://blog.csdn.net/nhconch Bitte unterstützen Sie mich.
Jeder Entwickler, der eine große ASP-Webanwendung entworfen hat, hat wahrscheinlich die folgende Erfahrung gemacht: ASP-Code und Seiten-HTML sind verwirrt und schwer zu unterscheiden, und die Geschäftslogik ist es ist mit dem Anzeigemodus verbunden, was es schwierig macht, den Code zu verstehen und zu ändern; die Programmierung muss nach der Kunst geschrieben werden, was bei der Integration des Programmcodes und der statischen HTML-Seiten viel Zeit in Anspruch nimmt den gewünschten Effekt, und es dient gleichzeitig als Kunst. Tatsächlich ist es bei der Entwicklung von Webanwendungen mithilfe von Skriptsprachen nicht einfach, Datenverarbeitung und Datenanzeige zu trennen. Wenn jedoch Daten und Anzeige bei der Zusammenarbeit mehrerer Personen nicht getrennt werden können, wird dies die Effizienz der Entwicklung erheblich beeinträchtigen professionelle Arbeitsteilung.
Andere Skriptsprachen wie JSP und PHP verfügen über eigene Lösungen. ASP.NET, das Produkt der späteren Generation, implementiert ebenfalls Codes und Seiten. Es scheint, dass der direkte Übergang zu ASP eine gute Wahl ist. Aber es gibt immer Gründe der einen oder anderen Art, die uns davon abhalten, ASP aufzugeben oder vorerst direkt ins .NET-Lager einzusteigen. Aus Sicht eines Unternehmens ist der Wechsel der Sprache eine enorme Investition, einschließlich der Einstellung erfahrener .NET-Programmierer, der Schulung bestehender Programmierer, der Umgestaltung von Entwicklungstools, der Umgestaltung des Entwicklungsstils, der Änderung des Schnittstellenstils, des Schnittstellenstils, der Softwarearchitektur, der Dokumente und des Entwicklungsprozesses usw.; dies bedeutet auch, dass der ursprüngliche Code in der neuen Sprachumgebung neu geschrieben werden muss, um gleichzeitig die beste Wirkung und Stabilität zu erzielen, was sich in diesem Zeitraum direkt auf den Fortschritt des Projekts auswirkt dazu führen, dass einzelne Programmierer ausscheiden. Es scheint, dass es am besten ist, eine Lösung auf der ursprünglichen Basis zu finden, bevor Sie sich für einen Sprachwechsel entscheiden.
PHP implementiert Codes und Seiten über Vorlagen. Zur Auswahl stehen FastTemplate, PHPLIB, Smarty usw., von denen PHPLIB den größten Einfluss hat und am häufigsten verwendet wird. In diesem Fall verschieben wir es direkt auf ASP, was für Unternehmen, die sowohl PHP als auch ASP verwenden, große Vorteile hat: 1. Wenn der Künstler die Seite verarbeitet, unabhängig davon, ob PHP oder ASP verwendet wird, ist die Verarbeitungsmethode dieselbe und erfordert keine Schulung 2. Wenn Programmierer Code schreiben, sind die Ideen zwischen den beiden Sprachen ähnlich oder konsistent. Wenn dieselben Funktionen in den beiden Sprachen implementiert werden, müssen sie sie nur kopieren und geringfügige Änderungen vornehmen, um die Arbeitseffizienz und das Projekt sicherzustellen Fortschritt.
1. Das Design der Vorlagenklasse implementiert die Codekapselung in der Vorlagenklasse, was nicht nur die Kompatibilität mit PHPLIB gewährleistet, sondern auch die einfache Verwaltung und Erweiterung des Codes erleichtert.
Das Ziel der Vorlagenklasse besteht darin, den angezeigten HTML-Code aus der Vorlagendatei zu lesen, die Teile des Anzeigecodes, die dynamische Daten erfordern, durch die vom ASP-Programm berechneten Daten zu ersetzen und diese dann in einer bestimmten Reihenfolge auszugeben. Darunter kann das Ersatzteil frei eingestellt werden. Daher muss es folgende Aufgaben erledigen:
·Lesen Sie den HTML-Code zur Anzeige aus der Vorlagendatei.
·Kombinieren Sie die Vorlagendatei mit den tatsächlich generierten Daten, um Ausgabeergebnisse zu generieren.
·Ermöglicht die gleichzeitige Verarbeitung mehrerer Vorlagen.
·Erlauben Sie die Verschachtelung von Vorlagen.
·Ermöglicht die Verarbeitung eines einzelnen Teils der Vorlage.
Implementierungsmethode:
Verwenden Sie FSO, um Vorlagendateien zu lesen
Verwenden Sie die regelmäßige Ersetzung, um Vorlagendateien und Daten zu kombinieren
Die Verarbeitung mehrerer Vorlagen wird mithilfe von Array-Speicher implementiert.
Die Hauptidee hinter der Implementierung der Vorlagenverschachtelung besteht darin, Vorlagen und Ausgaben (alle Zwischenergebnisse der Analyse) gleich zu behandeln, und beide können ersetzt werden, und das war's.
Die Verarbeitung einzelner Teile wird durch das Festlegen von Anmerkungen in der Vorlagendatei und das anschließende Kombinieren der Anmerkungen in regelmäßigen Ersetzungen gesteuert, um eine teilweise Ersetzung zu erreichen.
2. Bevor wir den spezifischen Code für die Implementierung der Vorlagenklasse angeben, listen wir zunächst die Hauptfunktionen auf. Freunde, die PHPLIB verwendet haben, sollten damit vertraut sein:
1) Public Sub set_root(ByVal Value) legt das Standardverzeichnis der Vorlage fest. 2) Public Sub set_file(ByVal handle, ByVal filename) liest die Datei. 3) Public Sub set_var(ByVal Name, ByVal Value, ByVal Append) legt die Mapping-Datenersetzung fest Variable 4) Public Sub unset_var(ByVal Name) Datenzuordnung abbrechen 5) Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) Datenblock festlegen 6) Public Sub set_unknowns(ByVal Unknowns) Tag-Verarbeitungsmethode für nicht spezifizierte Zuordnung festlegen 7) Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append) führt die Kombination aus Vorlagendatei und Daten aus. 8) Public Sub p(ByVal Name) gibt den
Implementierungscode für das Verarbeitungsergebnis aus:
<%
'============================================== = ======================
' Die Benennungsmethoden wie set_var und set_block werden in diesem Objekt aus Kompatibilitätsgründen mit phplib verwendet
'============================================== = ======================
'www.downcodes.com
Klasse kktTemplate
Privat m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
Private m_ValueList, m_BlockList
Privater m_RegExp
„Konstrukteur
Private Sub Class_Initialize
Setze m_ValueList = CreateObject("Scripting.Dictionary")
Setze m_BlockList = CreateObject("Scripting.Dictionary")
set m_RegExp = Neuer RegExp
m_RegExp.IgnoreCase = True
m_RegExp.Global = True
m_FileName = ""
m_Root = ""
m_Unknowns = "entfernen"
m_LastError = ""
m_HaltOnErr = true
Sub beenden
„Zerstörer
Private Unterklasse_Terminate
Setze m_RegExp = Nichts
Setze m_BlockMatches = Nothing
Setze m_ValueMatches = nichts
Sub beenden
Öffentliche Eigenschaft GetClassName()
ClassName = "kktTemplate"
End-Eigenschaft
Öffentliches Eigentum Get Version()
Version = „1.0“
End-Eigenschaft
Öffentliches Sub About()
Response.Write("kktTemplate ASP-Seitenvorlagenklasse<br>" & vbCrLf &_
„Programmierung: Peng Guohui2004-07-05<br>“ & vbCrLf &_
„Persönliche Website: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>“ & vbCrLf &_
„E-Mail: <a href='mailto:[email protected]'>[email protected]</a><br>“)
Sub beenden
'Überprüfen Sie, ob das Verzeichnis existiert
Öffentliche Funktion FolderExist(ByVal path)
Dim fso
Setze fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Server.MapPath(path))
Setze fso = Nichts
Funktion beenden
'Dateiinhalt lesen
Private Funktion LoadFile()
Dateiname, fso, hndFile dimmen
Dateiname = m_Root
Wenn Right(Filename, 1)<>"/" And Right(Filename, 1)<>"" Then Filename = Filename & "/"
Dateiname = Server.MapPath(Dateiname & m_FileName)
Setze fso = CreateObject("Scripting.FileSystemObject")
Wenn nicht fso.FileExists(Filename) Then ShowError("Template file" & m_FileName & "Does not exist!")
set hndFile = fso.OpenTextFile(Dateiname)
LoadFile = hndFile.ReadAll
Setzen Sie hndFile = Nothing
Setze fso = Nichts
If LoadFile = "" Then ShowError("Vorlagendatei kann nicht gelesen werden" & m_FileName & "Oder die Datei ist leer!")
Funktion beenden
'Fehlermeldungen behandeln
Private Sub ShowError(ByVal msg)
m_LastError = msg
Response.Write "<font color=red style='font-size;14px'><b>Template error:" & msg & "</b></font><br>"
Wenn m_HaltOnErr, dann Response.End
Sub beenden
'Legen Sie das Standardverzeichnis für Vorlagendateien fest
'Beispiel: kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
' root = kktTemplate.get_root()
' root = kktTemplate.Root
„Die Verwendung einer Benennungsmethode wie set_root dient der Kompatibilität mit phplib, was im Folgenden nicht wiederholt wird.“
Public Sub set_root(ByVal Value)
Wenn nicht FolderExist(Value) Then ShowError(Value & „Kein gültiges Verzeichnis oder das Verzeichnis existiert nicht!“)
m_Root = Wert
Sub beenden
Öffentliche Funktion get_root()
get_root = m_Root
Funktion beenden
Öffentliche Eigenschaft Let Root(ByVal Value)
set_root(Wert)
End-Eigenschaft
Öffentliche Eigenschaft GetRoot()
Root = m_Root
End-Eigenschaft
'Vorlagendatei festlegen
'Beispiel: kktTemplate.set_file("hndTpl", "index.htm")
„Diese Klasse unterstützt nicht mehrere Vorlagendateien, das Handle ist aus Kompatibilitätsgründen mit phplib reserviert.“
Öffentliche Subset_Datei (ByVal-Handle, ByVal-Dateiname)
m_FileName = Dateiname
m_BlockList.Add Handle, LoadFile()
Sub beenden
Öffentliche Funktion get_file()
get_file = m_FileName
Funktion beenden
' Public Property Let File(Handle, Dateiname)
'set_file handle, Dateiname
'Endeigentum
'Öffentliches Eigentum Get File()
'Datei = m_FileName
'Endeigentum
„Legen Sie die Verarbeitungsmethode für nicht spezifizierte Tags fest, einschließlich „Behalten“, „Entfernen“ und „Kommentieren“.
Public Sub set_unknowns(ByVal unbekannte)
m_Unknowns = Unbekannte
Sub beenden
Öffentliche Funktion get_unknowns()
get_unknowns = m_Unknowns
Funktion beenden
Öffentliches Eigentum, unbekannte Personen zulassen (ByVal unbekannt)
m_Unknowns = unbekannt
End-Eigenschaft
Öffentliches Eigentum Get Unknowns()
Unbekannte = m_Unbekannte
End-Eigenschaft
Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name)
Streichhölzer dimmen
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
Wenn nicht, m_BlockList.Exists(Parent) Then ShowError("Unspecified block tag" & Parent)
set Matches = m_RegExp.Execute(m_BlockList.Item(Parent))
Für jedes Spiel in Spielen
m_BlockList.Add BlockTag, Match.SubMatches(0)
m_BlockList.Item(Parent) = Replacement(m_BlockList.Item(Parent), Match.Value, "{" & Name & "}")
Nächste
set Matches = nichts
Sub beenden
Public Sub set_var(ByVal Name, ByVal Value, ByVal Append)
Dim Val
If IsNull(Value) Then Val = "" Else Val = Value
Wenn m_ValueList.Exists(Name) Dann
Wenn Anhängen, dann m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
Sonst m_ValueList.Item(Name) = Val
Anders
m_ValueList.Name und Wert hinzufügen
Ende wenn
Sub beenden
Öffentlicher Sub unset_var(ByVal Name)
Wenn m_ValueList.Exists(Name) dann m_ValueList.Remove(Name)
Sub beenden
Private Funktion InstanceValue(ByVal BlockTag)
Dimmtasten, d
InstanceValue = m_BlockList.Item(BlockTag)
Schlüssel = m_ValueList.Keys
Für i=0 bis m_ValueList.Count-1
InstanceValue = Replacement(InstanceValue, „{“ & keys(i) & „}“, m_ValueList.Item(keys(i)))
Nächste
Funktion beenden
Öffentliche Unteranalyse (ByVal Name, ByVal BlockTag, ByVal Append)
Wenn nicht, m_BlockList.Exists(BlockTag) Then ShowError("Unspecified block tag" & Parent)
Wenn m_ValueList.Exists(Name) Dann
Wenn Anhängen, dann m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
Sonst m_ValueList.Item(Name) = InstanceValue(BlockTag)
Anders
m_ValueList.Add Name, InstanceValue(BlockTag)
Ende wenn
Sub beenden
Private Funktion Finish (ByVal-Inhalt)
Wählen Sie Fall m_Unknowns aus
Fall „behalten“ Ende = Inhalt
Fall „entfernen“
m_RegExp.Pattern = "{[^ trn}]+}"
finish = m_RegExp.Replace(content, "")
Fall „Kommentar“
m_RegExp.Pattern = "{([^ trn}]+)}"
finish = m_RegExp.Replace(content, "<!-- Template Variable $1 undefiniert -->")
Fall Sonst Ende = Inhalt
Endauswahl
Funktion beenden
Öffentlicher Sub p(ByVal Name)
Wenn nicht, m_ValueList.Exists(Name) Then ShowError("Existiert nicht" & Name)
Response.Write(finish(m_ValueList.Item(Name)))
Sub beenden
Unterricht beenden
%>
3. Anwendungsbeispiele Hier sind drei Beispiele zur Erläuterung.
1) Die einfache Werteersetzungs-Vorlagendatei ist myTemple.tpl, Inhalt:
<html><title>Einfache Ersetzung der ASP-Vorlage</title><body>
gratulieren! Du hast einen {some_color} Ferrari gewonnen!
</body>
Das Folgende ist der ASP-Code (kktTemplate.inc.asp ist die oben angegebene Vorlagenklasse):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt
my_color = "rot"
set kkt = new kktTemplate 'Vorlagenobjekt erstellen
kkt.set_file "hndKktTemp", "myTemple.tpl" 'Legen Sie die Vorlagendatei myTemple.tpl fest und lesen Sie sie
kkt.set_var "some_color", my_color, false 'Legen Sie den Wert der Vorlagenvariablen some_color = my_color fest
kkt.parse "out", "hndKktTemp", false 'Vorlagenvariable out = verarbeitete Datei
kkt.p "out" 'Den Inhalt von out ausgeben
set kkt = Nothing 'Zerstöre das Vorlagenobjekt
%>
Die Ausgabe nach der Ausführung ist:
<html><title>Einfache Ersetzung der ASP-Vorlage</title><body>
gratulieren! Du gewinnst einen roten Ferrari!
</body>
2) Schleifenblock-Demonstrationsbeispiel-Vorlagendatei myTemple2.tpl:
<html><title>ASP Template-Block Demonstration</title><body>
<table cellpacing="2" border="1"><tr><td>Welches Tier gefällt Ihnen am folgenden</td></tr>
<!-- BEGIN AnimalList -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- END AnimalList -->
</table>
</body>
ASP-Code:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
schwaches Tier, kkt, ich
animal = Array("Kleines Schweinchen", "Welpe", "Xiaoqiang")
set kkt = neues kktTemplate
kkt.set_file „hndKktTemp“, „myTemple2.tpl“
kkt.set_block „hndKktTemp“, „AnimalList“, „list“
für i=0 bis UBound(Tier)
kkt.set_var „animal“, animal(i), false
kkt.parse „list“, „AnimalList“, true
nächste
kkt.parse „out“, „hndKktTemp“, false
kkt.p „out“
setze kkt = nichts
%>
Ausführungsergebnis:
<html><title>ASP Template-Block Demonstration</title><body>
<table cellpacing="2" border="1"><tr><td>Welches Tier gefällt Ihnen am folgenden</td></tr>
<tr><td><input type="radio" name="chk">Kleines Schweinchen</td></tr>
<tr><td><input type="radio" name="chk">Welpe</td></tr>
<tr><td><input type="radio" name="chk">Xiaoqiang</td></tr>
</table>
</body>
3) Demonstrationsvorlagendatei für verschachtelte Blöcke myTemple3.tpl:
<html><title>ASP-Vorlage – Demonstration verschachtelter Blöcke</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">{myname}-Test</div></td></tr>
<tr><td>Mein zoologisch-botanischer Garten: </td> </tr>
<!-- BEGIN animalList -->
<tr><td>{animal}</td></tr>
<!-- BEGIN plantList -->
<tr><td> {plant</td></tr>
<!-- END plantList -->
<!-- END animalList -->
</table>
</body>
</html>
ASP-Code:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt, myname, animal, plant
set kkt = neues kktTemplate
myname = „kktTemplate-Blocktest…“
animal = array("animal", "plant")
plant = array(array("Kleines Schweinchen", "Xiaobai", "Xiaoqiang"), array("Rose", "Sonnenblume"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var „mein Name“, mein Name, falsch
kkt.set_block „hndKktTemp“, „animalList“, „a“
kkt.set_block „animalList“, „plantList“, „p“
für i=0 bis UBound(animal)
kkt.set_var „animal“, animal(i), False
kkt.unset_var "p"
'kkt.set_var "p", "", false
für j=0 bis UBound(plant(i))
kkt.set_var „plant“, plant(i)(j), false
kkt.parse „p“, „plantList“, true
nächste
kkt.parse „a“, „animalList“, wahr
nächste
kkt.parse „out“, „hndKktTemp“, false
kkt.p „out“
%>
Ausführungsergebnis:
<html><title>ASP-Vorlage – Demonstration verschachtelter Blöcke</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">kktTemplate block test...test</div></td></tr>
<tr><td>Mein zoologisch-botanischer Garten: </td> </tr>
<tr><td>Tiere</td></tr>
<tr><td> Kleines Schweinchen</td></tr>
<tr><td> Xiaobai</td></tr>
<tr><td> Xiaoqiang</td></tr>
<tr><td>Pflanzen</td></tr>
<tr><td> Rose</td></tr>
<tr><td> Sonnenblume</td></tr>
</table>
</body>
</html>
Der gesamte in diesem Artikel erwähnte Code kann hier heruntergeladen werden: