Source de l'article : Notes de programmation
http://blog.csdn.net/nhconch Veuillez me soutenir.
Chaque développeur qui a conçu une application ASP-Web à grande échelle a probablement l'expérience suivante : le code ASP et la page HTML sont confus et difficiles à distinguer, et la logique métier les contient. est lié au mode d'affichage, ce qui rend le code difficile à comprendre et à modifier ; la programmation doit être écrite selon l'art, ce qui est devenu un goulot d'étranglement du projet ; lors de l'intégration du code du programme et des pages HTML statiques, il faut beaucoup de temps pour obtenir l'effet désiré, et cela fait également office d'art. En effet, il n'est pas facile de séparer le traitement des données et l'affichage des données lors du développement d'applications Web utilisant des langages de script. Cependant, dans le cas d'une coopération multi-personnes, si les données et l'affichage ne peuvent pas être séparés, cela affectera grandement l'efficacité du développement et de la performance. division professionnelle du travail.
D'autres langages de script, tels que JSP et PHP, ont leurs propres solutions. ASP.NET, le produit de dernière génération d'ASP, implémente également des codes et des pages. Il semble que la transition directe vers ASP soit un bon choix. Mais il y a toujours des raisons d'une sorte ou d'une autre qui nous empêchent d'abandonner l'ASP ou de passer directement au camp .NET pour le moment. Du point de vue d'une entreprise, changer de langage est un investissement énorme, y compris l'embauche de programmeurs .NET expérimentés, la formation des programmeurs existants, la transformation des outils de développement, la transformation du style de développement, le changement de style d'interface, le style d'interface, l'architecture logicielle, les documents, les processus de développement. , etc. ; cela signifie également que le code original doit être réécrit dans le nouvel environnement linguistique pour obtenir le meilleur effet et la meilleure stabilité en même temps, cela affectera directement l'avancement du projet pendant cette période, et est plus susceptible de le faire ; conduire au départ de certains programmeurs. Il semble qu’avant de décider de changer de langue, il est préférable de trouver une solution sur la base originale.
PHP implémente des codes et des pages via des modèles. Vous avez le choix entre FastTemplate, PHPLIB, Smarty, etc., parmi lesquels PHPLIB a la plus grande influence et est le plus utilisé. Dans ce cas, nous la déplaçons directement vers ASP, ce qui présente de grands avantages pour les entreprises qui utilisent à la fois PHP et ASP : 1. Lorsque l'artiste traite la page, que PHP ou ASP soit utilisé, la méthode de traitement est la même, et aucune formation est requis ; 2. Lorsque les programmeurs écrivent du code, les idées entre les deux langages sont proches ou cohérentes. Lorsque les mêmes fonctions sont implémentées dans les deux langages, il leur suffit de les copier et d'apporter de légères modifications, garantissant ainsi l'efficacité du travail et du projet. progrès.
1. La conception de la classe de modèle implémente l'encapsulation du code dans la classe de modèle, qui doit non seulement être compatible avec PHPLIB, mais également rendre le code facile à gérer et à développer.
L'objectif de la classe de modèle est de lire le code HTML affiché à partir du fichier modèle, de remplacer les parties du code d'affichage qui nécessitent des données dynamiques par les données calculées par le programme ASP, puis de les afficher dans un certain ordre. Parmi eux, la pièce de rechange peut être réglée librement. Il doit donc accomplir les tâches suivantes :
·Lisez le code HTML à afficher à partir du fichier modèle.
· Combinez le fichier modèle avec les données générées réelles pour générer des résultats de sortie.
· Permet de traiter plusieurs modèles simultanément.
·Autoriser l'imbrication des modèles.
·Permet le traitement d'une partie individuelle du modèle.
Méthode de mise en œuvre :
Utilisez FSO pour lire les fichiers modèles
Utiliser un remplacement régulier pour combiner les fichiers modèles et les données
Le traitement de plusieurs modèles est implémenté à l'aide du stockage en matrice.
L'idée principale derrière la mise en œuvre de l'imbrication de modèles est de traiter les modèles et les sorties (tous les résultats d'analyse intermédiaire) de la même manière, et les deux peuvent être remplacés, et c'est tout.
Le traitement des pièces individuelles est contrôlé en définissant des annotations dans le fichier modèle, puis en combinant les annotations en remplacement régulier pour obtenir un remplacement partiel.
2. Avant de donner le code spécifique à l'implémentation de la classe template, listons d'abord les principales fonctions. Les amis qui ont utilisé PHPLIB devraient être familiers avec ceci :
1) Public Sub set_root (ByVal Value) définit le répertoire par défaut du modèle 2) Public Sub set_file (ByVal handle, ByVal filename) lit le fichier 3) Public Sub set_var (ByVal Name, ByVal Value, ByVal Append) définit le remplacement des données de mappage variable 4) Public Sub unset_var (ByVal Name) Annuler le mappage des données 5) Public Sub set_block (ByVal Parent, ByVal BlockTag, ByVal Name) Définir le bloc de données 6) Public Sub set_unknowns (ByVal inconnues) Définir la méthode de traitement des balises pour le mappage non spécifié 7) Public Sub parse (ByVal Name, ByVal BlockTag, ByVal Append) exécute la combinaison du fichier modèle et des données 8) Public Sub p (ByVal Name) génère le
code d'implémentation du résultat du traitement :
<%
'================================================== = ======================
' Les méthodes de dénomination telles que set_var et set_block sont utilisées dans cet objet pour des raisons de compatibilité avec phplib
'================================================== = ======================
'www.downcodes.com
Classe kktTemplate
Privé m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
m_ValueList privée, m_BlockList
Privé m_RegExp
'Constructeur
Sous-classe privée_Initialize
Définir m_ValueList = CreateObject("Scripting.Dictionary")
Définir m_BlockList = CreateObject("Scripting.Dictionary")
set m_RegExp = Nouvelle RegExp
m_RegExp.IgnoreCase = Vrai
m_RegExp.Global = Vrai
m_NomFichier = ""
m_Racine = ""
m_Unknowns = "supprimer"
m_DernièreErreur = ""
m_HaltOnErr = vrai
Fin du sous-marin
'Destructeur
Sous-classe privée_Terminate
Définir m_RegExp = Rien
Définir m_BlockMatches = Rien
Définir m_ValueMatches = rien
Fin du sous-marin
Propriété publique GetClassName()
Nom de classe = "kktTemplate"
Propriété de fin
Propriété publique Obtenir la version()
Version = "1.0"
Propriété de fin
Sous-marin public À propos ()
Response.Write("Classe de modèle de page ASP kktTemplate<br>" & vbCrLf &_
"Programmation : Peng Guohui2004-07-05<br>" & vbCrLf &_
"Site Web personnel : <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"E-mail : <a href='mailto:[email protected]'>[email protected]</a><br>")
Fin du sous-marin
'Vérifier si le répertoire existe
Fonction publique FolderExist (chemin ByVal)
Faible fso
Définir fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists (Server.MapPath (chemin))
Définir fso = Rien
Fonction de fin
'Lire le contenu du fichier
Fonction privée LoadFile()
Dim Nom de fichier, fso, hndFile
Nom du fichier = m_Root
Si Right(Filename, 1)<>"/" Et Right(Filename, 1)<>"" Alors Filename = Filename & "/"
Nom de fichier = Server.MapPath (Nom de fichier & m_FileName)
Définir fso = CreateObject("Scripting.FileSystemObject")
Si ce n'est pas le cas fso.FileExists(Filename) Then ShowError("Fichier modèle" & m_FileName & "N'existe pas !")
définir hndFile = fso.OpenTextFile (nom de fichier)
LoadFile = hndFile.ReadAll
Définir hndFile = Rien
Définir fso = Rien
Si LoadFile = "" Then ShowError("Impossible de lire le fichier modèle" & m_FileName & "Ou le fichier est vide !")
Fonction de fin
'Gérer les messages d'erreur
Erreur de sous-show privé (msg ByVal)
m_LastError = msg
Réponse.Écrivez "<font color=red style='font-size;14px'><b>Erreur de modèle :" & msg & "</b></font><br>"
Si m_HaltOnErr alors Response.End
Fin du sous-marin
'Définir le répertoire par défaut pour les fichiers modèles
'Ex : kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
' racine = kktTemplate.get_root()
' racine = kktTemplate.Root
'L'utilisation d'une méthode de nommage comme set_root est destinée à la compatibilité avec phplib, ce qui ne sera pas répété ci-dessous.
Sous-public public set_root (valeur ByVal)
If Not FolderExist(Value) Then ShowError(Value & "Pas un répertoire valide ou le répertoire n'existe pas !")
m_Root = Valeur
Fin du sous-marin
Fonction publique get_root()
get_root = m_Root
Fonction de fin
Propriété publique Let Root (valeur ByVal)
set_root(Valeur)
Propriété de fin
Propriété publique GetRoot()
Racine = m_Root
Propriété de fin
'Définir le fichier modèle
'Ex : kktTemplate.set_file("hndTpl", "index.htm")
'Cette classe ne prend pas en charge plusieurs fichiers modèles, le handle est réservé pour la compatibilité avec phplib
Public Sub set_file (descripteur ByVal, nom de fichier ByVal)
m_FileName = nom de fichier
m_BlockList.Add Handle, LoadFile()
Fin du sous-marin
Fonction publique get_file()
get_file = m_FileName
Fonction de fin
' Propriété publique Let File (handle, nom de fichier)
'set_file handle, nom de fichier
'Fin de la propriété
'Propriété publique Obtenir le fichier()
'Fichier = m_NomFichier
'Fin de la propriété
'Définissez la méthode de traitement pour les balises non spécifiées, notamment conserver, supprimer et commenter.
Public Sub set_unknowns (inconnues ByVal)
m_Unknowns = inconnues
Fin du sous-marin
Fonction publique get_unknowns()
get_unknowns = m_Unknowns
Fonction de fin
Propriété publique laissée inconnues (ByVal inconnu)
m_Unknowns = inconnu
Propriété de fin
Propriété publique obtenir des inconnues()
Inconnus = m_Inconnus
Propriété de fin
Public Sub set_block (ByVal Parent, ByVal BlockTag, ByVal Nom)
Correspondances faibles
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
Si ce n'est pas le cas m_BlockList.Exists(Parent) Then ShowError("Balise de bloc non spécifiée" & Parent)
définir des correspondances = m_RegExp.Execute(m_BlockList.Item(Parent))
Pour chaque match dans les matchs
m_BlockList.Add BlockTag, Match.SubMatches(0)
m_BlockList.Item(Parent) = Remplacer(m_BlockList.Item(Parent), Match.Value, "{" & Nom & "}")
Suivant
définir des correspondances = rien
Fin du sous-marin
Sub public set_var (nom ByVal, valeur ByVal, ajout ByVal)
Dim Val
Si IsNull (Valeur) Alors Val = "" Sinon Val = Valeur
Si m_ValueList.Exists(Nom) Alors
Si ajouter alors m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
Sinon m_ValueList.Item(Name) = Val
Autre
m_ValueList.Ajouter un nom, une valeur
Fin si
Fin du sous-marin
Sous-public unset_var (nom ByVal)
Si m_ValueList.Exists(Nom) Alors m_ValueList.Remove(Nom)
Fin du sous-marin
InstanceValue de fonction privée (ByVal BlockTag)
Touches tamisées, je
InstanceValue = m_BlockList.Item (BlockTag)
clés = m_ValueList.Keys
Pour i=0 À m_ValueList.Count-1
InstanceValue = Remplacer (InstanceValue, "{" & clés (i) & "}", m_ValueList.Item (clés (i)))
Suivant
Fonction de fin
Sous-analyse publique (ByVal Name, ByVal BlockTag, ByVal Append)
Si ce n'est pas le cas m_BlockList.Exists(BlockTag) Then ShowError("Balise de bloc non spécifiée" & Parent)
Si m_ValueList.Exists(Nom) Alors
Si ajouter alors m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
Sinon m_ValueList.Item(Name) = InstanceValue(BlockTag)
Autre
m_ValueList.Ajouter un nom, InstanceValue (BlockTag)
Fin si
Fin du sous-marin
Fin de la fonction privée (contenu ByVal)
Sélectionnez le cas m_Unknowns
Cas "conserver" finition = contenu
Cas "supprimer"
m_RegExp.Pattern = "{[^ trn}]+}"
terminer = m_RegExp.Replace(content, "")
Cas "commentaire"
m_RegExp.Pattern = "{([^ trn}]+)}"
finish = m_RegExp.Replace(content, "<!-- Variable de modèle $1 non définie -->")
Dans le cas contraire, finition = contenu
Fin de la sélection
Fonction de fin
Sous-p public (nom ByVal)
If Not m_ValueList.Exists(Name) Then ShowError("N'existe pas" & Name)
Réponse.Write(finish(m_ValueList.Item(Name)))
Fin du sous-marin
Fin du cours
%>
3. Exemples d'utilisation Voici trois exemples d'explication.
1) Le fichier modèle de remplacement de valeur simple est myTemple.tpl, contenu :
<html><title>Remplacement simple du modèle ASP</title><body>
féliciter! Vous avez gagné une Ferrari {some_color} !
</body>
Voici le code ASP (kktTemplate.inc.asp est la classe de modèle donnée ci-dessus) :
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt
ma_couleur = "rouge"
set kkt = new kktTemplate 'Créer un objet modèle
kkt.set_file "hndKktTemp", "myTemple.tpl" 'Définir et lire le fichier modèle myTemple.tpl
kkt.set_var "some_color", my_color, false 'Définit la valeur de la variable de modèle some_color = my_color
kkt.parse "out", "hndKktTemp", false 'Variable de modèle out = fichier traité
kkt.p "out" 'Afficher le contenu de out
set kkt = rien 'Détruire l'objet modèle
%>
Le résultat après exécution est :
<html><title>Remplacement simple du modèle ASP</title><body>
féliciter! Vous gagnez une Ferrari rouge !
</corps>
2) Exemple de fichier de modèle de démonstration de bloc de boucle myTemple2.tpl :
<html><title>Démonstration de blocs de modèles ASP</title><body>
<table cellpacing="2" border="1"><tr><td>Quel animal aimez-vous ci-dessous</td></tr>
<!-- BEGIN ListeAnimaux -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- FIN ListeAnimaux -->
</table>
</body>
Code ASP :
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
animal sombre, kkt, je
animal = Array("Petit Cochon","Chiot","Xiaoqiang")
définir kkt = nouveau kktTemplate
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "liste"
pour i=0 à UBound(animal)
kkt.set_var "animal", animal(i), faux
kkt.parse "liste", "ListeAnimaux", vrai
suivant
kkt.parse "out", "hndKktTemp", faux
kkt.p "sorti"
définir kkt = rien
%>
Résultat de l'exécution :
<html><title>Démonstration de blocs de modèles ASP</title><body>
<table cellpacing="2" border="1"><tr><td>Quel animal aimez-vous ci-dessous</td></tr>
<tr><td><input type="radio" name="chk">Petit Cochon</td></tr>
<tr><td><input type="radio" name="chk">Chiot</td></tr>
<tr><td><input type="radio" name="chk">Xiaoqiang</td></tr>
</table>
</corps>
3) Fichier de modèle de démonstration de blocs imbriqués myTemple3.tpl :
<html><title>Modèle ASP - Démonstration de blocs imbriqués</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">Test de {monnom}</div></td></tr>
<tr><td>Mon jardin zoologique et botanique : </td> </tr>
<!-- BEGIN listeanimaux -->
<tr><td>{animal></td></tr>
<!-- BEGIN listeplantes -->
<tr><td> {plante</td></tr>
<!-- FIN listeplantes -->
<!-- FIN listeanimaux -->
</table>
</corps>
</html>
Code ASP :
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim my_color, kkt, mon nom, animal, plante
définir kkt = nouveau kktTemplate
monnom = "test de bloc kktTemplate..."
animal = tableau("animal", "plante")
plant = array(array("Petit Cochon","Xiaobai","Xiaoqiang"), array("Rose","Tournesol"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "monnom", monnom, false
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
pour i=0 à UBound(animal)
kkt.set_var "animal", animal(i), Faux
kkt.unset_var "p"
'kkt.set_var "p", "", faux
pour j=0 à UBound(plant(i))
kkt.set_var "plante", plante(i)(j), faux
kkt.parse "p", "plantList", vrai
suivant
kkt.parse "a", "animalList", vrai
suivant
kkt.parse "out", "hndKktTemp", faux
kkt.p "sorti"
%>
Résultat de l'exécution :
<html><title>Modèle ASP - Démonstration de blocs imbriqués</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">test de bloc kktTemplate...test</div></td></tr>
<tr><td>Mon jardin zoologique et botanique : </td> </tr>
<tr><td>Animaux</td></tr>
<tr><td> Petit Cochon</td></tr>
<tr><td> Xiaobai</td></tr>
<tr><td> Xiaoqiang</td></tr>
<tr><td>Plantes</td></tr>
<tr><td> Rose</td></tr>
<tr><td> Tournesol</td></tr>
</table>
</corps>
</html>
Tout le code mentionné dans cet article peut être téléchargé ici :