Fuente del artículo: Notas de programación
http://blog.csdn.net/nhconch Por favor, apóyenme.
Todo desarrollador que haya diseñado una aplicación web ASP a gran escala probablemente tenga la siguiente experiencia: el código ASP y la página HTML son confusos y difíciles de distinguir, y la lógica empresarial es está relacionado con el modo de visualización, lo que hace que el código sea difícil de entender y modificar. La programación debe escribirse después del arte, lo que se ha convertido en un cuello de botella en el proyecto y requiere mucho tiempo para integrar el código del programa y las páginas estáticas HTML; el efecto deseado, y también funciona como arte. De hecho, no es fácil separar el procesamiento y la visualización de datos cuando se desarrollan aplicaciones web utilizando lenguajes de secuencias de comandos. Sin embargo, en el caso de la cooperación entre varias personas, si los datos y la visualización no se pueden separar, afectará en gran medida la eficiencia del desarrollo y la visualización. división profesional del trabajo.
Otros lenguajes de programación, como JSP y PHP, tienen sus propias soluciones. ASP.NET, el producto de última generación de ASP, también implementa códigos y páginas. Parece que la transición directa a ASP es una buena opción. Pero siempre hay razones de un tipo u otro que nos impiden abandonar ASP o pasar directamente al campo .NET por el momento. Desde la perspectiva de una empresa, cambiar de idioma es una gran inversión, que incluye la contratación de programadores .NET experimentados, la capacitación de programadores existentes, la transformación de las herramientas de desarrollo, la transformación del estilo de desarrollo, el cambio del estilo de la interfaz, el estilo de la interfaz, la arquitectura del software, los documentos y los procesos de desarrollo. , etc .; esto también significa que el código original debe reescribirse en el nuevo entorno de lenguaje para lograr el mejor efecto y estabilidad al mismo tiempo, lo que afectará directamente el progreso del proyecto durante este período y es más probable que lo haga; llevar a que los programadores individuales se vayan. Parece que antes de decidirse a cambiar de idioma, lo mejor es encontrar una solución sobre la base original.
PHP implementa códigos y páginas a través de plantillas. Hay FastTemplate, PHPLIB, Smarty, etc. para elegir, entre los cuales PHPLIB tiene la mayor influencia y es el más utilizado. En este caso, lo pasamos directamente a ASP, lo que tiene grandes beneficios para las empresas que usan PHP y ASP: 1. Cuando el artista procesa la página, ya sea que use PHP o ASP, el método de procesamiento es el mismo y no requiere capacitación. se requiere 2. Cuando los programadores escriben código, las ideas entre los dos lenguajes son cercanas o consistentes. Cuando se implementan las mismas funciones en los dos lenguajes, solo necesitan copiarlas y realizar ligeras modificaciones, lo que garantiza la eficiencia del trabajo y del proyecto. progreso.
1. El diseño de la clase de plantilla implementa la encapsulación de código en una clase de plantilla, que no solo debe ser compatible con PHPLIB, sino también hacer que el código sea fácil de administrar y expandir.
El objetivo de la clase de plantilla es leer el código HTML mostrado del archivo de plantilla, reemplazar las partes del código de visualización que requieren datos dinámicos con los datos calculados por el programa ASP y luego generarlos en un orden determinado. Entre ellos, la pieza de repuesto se puede configurar libremente. Por lo tanto debe completar las siguientes tareas:
·Lea el código HTML para mostrarlo desde el archivo de plantilla.
·Combine el archivo de plantilla con los datos reales generados para generar resultados de salida.
·Permite procesar múltiples plantillas simultáneamente.
·Permitir anidamiento de plantillas.
·Permite el procesamiento de una parte individual de la plantilla.
Método de implementación:
Utilice FSO para leer archivos de plantilla
Utilice el reemplazo regular para combinar datos y archivos de plantilla
El procesamiento de múltiples plantillas se implementa mediante almacenamiento de matriz.
La idea principal detrás de la implementación del anidamiento de plantillas es tratar las plantillas y los resultados (cualquier resultado de análisis intermedio) por igual, y ambos pueden reemplazarse, y eso es todo.
El procesamiento de piezas individuales se controla estableciendo anotaciones en el archivo de plantilla y luego combinando las anotaciones en un reemplazo regular para lograr un reemplazo parcial.
2. Antes de dar el código específico para la implementación de la clase de plantilla, primero enumeremos las funciones principales. Los amigos que han usado PHPLIB deberían estar familiarizados con esto:
1) Public Sub set_root (ByVal Value) establece el directorio predeterminado de la plantilla 2) Public Sub set_file (identificador de ByVal, nombre de archivo ByVal) lee el archivo 3) Public Sub set_var (ByVal Name, ByVal Value, ByVal Append) establece el reemplazo de datos de mapeo variable 4) Public Sub unset_var(ByVal Name) Cancelar mapeo de datos 5) Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) Establecer bloque de datos 6) Public Sub set_unknowns(ByVal desconocidos) Establecer el método de procesamiento de etiquetas para mapeo no especificado 7) Public Sub parse (ByVal Name, ByVal BlockTag, ByVal Append) ejecuta la combinación de archivo de plantilla y datos 8) Public Sub p (ByVal Name) genera el
código de implementación del resultado del procesamiento:
<%
'=================================================== = =======================
' Los métodos de denominación como set_var y set_block se utilizan en este objeto para compatibilidad con phplib
'=================================================== = =======================
'www.downcodes.com
Clase kktTemplate
Privado m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
Privado m_ValueList, m_BlockList
Privado m_RegExp
'Constructor
Subclase privada_Inicializar
Establecer m_ValueList = CreateObject("Scripting.Dictionary")
Establecer m_BlockList = CreateObject("Scripting.Dictionary")
establecer m_RegExp = Nueva expresión regular
m_RegExp.IgnoreCase = Verdadero
m_RegExp.Global = Verdadero
m_FileName = ""
m_Root = ""
m_Unknowns = "eliminar"
m_LastError = ""
m_HaltOnErr = verdadero
Subtítulo final
'Incinerador de basuras
Subclase privada_Terminar
Establecer m_RegExp = Nada
Establecer m_BlockMatches = Nada
Establecer m_ValueMatches = nada
Subtítulo final
Propiedad pública GetClassName()
Nombre de clase = "kktTemplate"
Propiedad final
Propiedad pública Obtener versión()
Versión = "1.0"
Propiedad final
Sub público Acerca de()
Response.Write("clase de plantilla de página ASP kktTemplate<br>" & vbCrLf &_
"Programación: Peng Guohui2004-07-05<br>" & vbCrLf &_
"Sitio web personal: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"Correo electrónico: <a href='mailto:[email protected]'>[email protected]</a><br>")
Subtítulo final
'Comprueba si el directorio existe
Carpeta de función públicaExist (ruta ByVal)
fso tenue
Establecer fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Servidor.MapPath(ruta))
Establecer fso = Nada
Función final
'Leer el contenido del archivo
Función privada LoadFile()
Nombre de archivo tenue, fso, hndFile
Nombre de archivo = m_Root
Si está a la derecha (nombre de archivo, 1)<>"/" y a la derecha (nombre de archivo, 1)<>"" entonces nombre de archivo = nombre de archivo y "/"
Nombre de archivo = Server.MapPath(Nombre de archivo y m_FileName)
Establecer fso = CreateObject("Scripting.FileSystemObject")
Si no es fso.FileExists (nombre de archivo), entonces ShowError ("archivo de plantilla" & m_FileName & "¡no existe!")
establecer hndFile = fso.OpenTextFile (nombre de archivo)
LoadFile = hndFile.ReadAll
Establecer hndFile = Nada
Establecer fso = Nada
Si LoadFile = "" Then ShowError("No se puede leer el archivo de plantilla" & m_FileName & "¡O el archivo está vacío!")
Función final
'Manejar mensajes de error
Sub ShowError privado (mensaje ByVal)
m_LastError = mensaje
Response.Write "<font color=red style='font-size;14px'><b>Error de plantilla:" & msg & "</b></font><br>"
Si m_HaltOnErr Entonces Response.End
Subtítulo final
'Establece el directorio predeterminado para archivos de plantilla
'Ejemplo: kktTemplate.set_root("/tmplate")
'kktTemplate.Root = "/tmplate"
' raíz = kktTemplate.get_root()
' raíz = kktTemplate.Root
'El uso de un método de denominación como set_root es por compatibilidad con phplib, que no se repetirá a continuación.
Sub set_root público (valor ByVal)
Si no es FolderExist(Value) Then ShowError(Value & "¡No es un directorio válido o el directorio no existe!")
m_Root = Valor
Subtítulo final
Función pública get_root()
get_root = m_Root
Función final
Propiedad pública Let Root (valor ByVal)
set_root(Valor)
Propiedad final
Propiedad pública GetRoot()
Raíz = m_Root
Propiedad final
'Establecer archivo de plantilla
'Ejemplo: kktTemplate.set_file("hndTpl", "index.htm")
'Esta clase no admite múltiples archivos de plantilla, el identificador está reservado para compatibilidad con phplib
Public Sub set_file (identificador ByVal, nombre de archivo ByVal)
m_FileName = nombre de archivo
m_BlockList.Agregar identificador, LoadFile()
Subtítulo final
Función pública get_file()
get_file = m_NombreDeArchivo
Función final
' Propiedad pública Let File(identificador, nombre de archivo)
'set_file identificador, nombre de archivo
'Propiedad final
'Archivo de obtención de propiedad pública()
'Archivo = m_NombreDeArchivo
'Propiedad final
'Establece el método de procesamiento para etiquetas no especificadas, incluidos conservar, eliminar y comentar.
Público Sub set_unknowns(ByVal desconocidos)
m_Unknowns = desconocidos
Subtítulo final
Función pública get_unknowns()
get_unknowns = m_Unknowns
Función final
Propiedad pública Let Unknowns (ByVal desconocido)
m_Unknowns = desconocido
Propiedad final
Propiedad pública obtener incógnitas()
Desconocidos = m_Desconocidos
Propiedad final
Sub set_block público (ByVal padre, ByVal BlockTag, nombre de ByVal)
Partidos oscuros
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
Si no es m_BlockList.Exists(Parent) Entonces ShowError("Etiqueta de bloque no especificada" y Parent)
establecer coincidencias = m_RegExp.Execute(m_BlockList.Item(Parent))
Para cada partido en partidos
m_BlockList.Agregar BlockTag, Coincidencia.SubMatches(0)
m_BlockList.Item(Parent) = Reemplazar(m_BlockList.Item(Parent), Match.Value, "{" & Nombre & "}")
Próximo
establecer coincidencias = nada
Subtítulo final
Subset_var público (nombre de ByVal, valor de ByVal, anexo de ByVal)
Val tenue
Si es nulo (valor) entonces Val = "" De lo contrario Val = valor
Si m_ValueList.Exists (Nombre) Entonces
Si se agrega, entonces m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
De lo contrario m_ValueList.Item(Nombre) = Val
Demás
m_ValueList.Agregar nombre, valor
Terminar si
Subtítulo final
Sub público unset_var (nombre ByVal)
Si m_ValueList.Exists (Nombre) Entonces m_ValueList.Remove (Nombre)
Subtítulo final
Valor de instancia de función privada (ByVal BlockTag)
Teclas oscuras, yo
ValorDeInstancia = m_BlockList.Item(BlockTag)
claves = m_ValueList.Claves
Para i=0 a m_ValueList.Count-1
InstanceValue = Reemplazar (InstanceValue, "{" & claves (i) & "}", m_ValueList.Item (claves (i)))
Próximo
Función final
Subanálisis público (nombre ByVal, etiqueta de bloque ByVal, anexo ByVal)
Si no es m_BlockList.Exists (BlockTag), entonces ShowError ("Etiqueta de bloque no especificada" y padre)
Si m_ValueList.Exists (Nombre) Entonces
Si se agrega, entonces m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
De lo contrario m_ValueList.Item(Nombre) = InstanceValue(BlockTag)
Demás
m_ValueList.Agregar nombre, valor de instancia (etiqueta de bloque)
Terminar si
Subtítulo final
Finalización de función privada (contenido ByVal)
Seleccione Caso m_Unknowns
Caso "mantener" finalizar = contenido
Caso "eliminar"
m_RegExp.Pattern = "{[^ trn}]+}"
finalizar = m_RegExp.Replace(contenido, "")
Caso "comentario"
m_RegExp.Pattern = "{([^ trn}]+)}"
terminar = m_RegExp.Replace(contenido, "<!-- Variable de plantilla $1 indefinida -->")
Caso más terminar = contenido
Finalizar selección
Función final
Sub pública p (nombre por valor)
Si no es m_ValueList.Exists(Nombre) Entonces ShowError("No existe" y Nombre)
Respuesta.Escribir(finish(m_ValueList.Item(Nombre)))
Subtítulo final
Fin de clase
%>
3. Ejemplos de uso Aquí hay tres ejemplos explicativos.
1) El archivo de plantilla de reemplazo de valor simple es myTemple.tpl, contenido:
<html><title>Reemplazo simple de plantilla ASP</title><body>
¡felicitar! ¡Ganaste un Ferrari {some_color}!
</body>
El siguiente es el código ASP (kktTemplate.inc.asp es la clase de plantilla proporcionada anteriormente):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
atenuar mi_color, kkt
mi_color = "rojo"
set kkt = new kktTemplate 'Crear objeto de plantilla
kkt.set_file "hndKktTemp", "myTemple.tpl" 'Establece y lee el archivo de plantilla myTemple.tpl
kkt.set_var "some_color", my_color, false 'Establece el valor de la variable de plantilla some_color = my_color
kkt.parse "out", "hndKktTemp", false 'Variable de plantilla out = archivo procesado
kkt.p "out" 'Emite el contenido de out
set kkt = nada 'Destruye el objeto de plantilla
%>
La salida después de la ejecución es:
<html><title>Reemplazo simple de plantilla ASP</title><body>
¡felicitar! ¡Ganas un Ferrari rojo!
</cuerpo>
2) Archivo de plantilla de ejemplo de demostración de bloque de bucle myTemple2.tpl:
<html><title>Demostración de bloque de plantilla ASP</title><body>
<table cellspace="2" border="1"><tr><td>¿Qué animal te gusta?</td></tr>
<!-- BEGIN ListaAnimales -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- FIN ListaAnimales -->
</tabla>
</body>
código ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
animal oscuro, kkt, yo
animal = Array("Cerdito","Cachorro","Xiaoqiang")
establecer kkt = nueva plantilla kkt
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "lista"
para i=0 a UBound(animal)
kkt.set_var "animal", animal(i), falso
kkt.parse "lista", "ListaAnimales", verdadero
próximo
kkt.parse "fuera", "hndKktTemp", falso
kkt.p "fuera"
establecer kkt = nada
%>
Resultado de la ejecución:
<html><title>Demostración de bloque de plantilla ASP</title><body>
<table cellspace="2" border="1"><tr><td>¿Qué animal te gusta?</td></tr>
<tr><td><input type="radio" name="chk">Cerdito</td></tr>
<tr><td><input type="radio" name="chk">Cachorro</td></tr>
<tr><td><input type="radio" name="chk">Xiaoqiang</td></tr>
</tabla>
</cuerpo>
3) Archivo de plantilla de demostración de bloques anidados myTemple3.tpl:
<html><title>Plantilla ASP: demostración de bloques anidados</title>
<cuerpo><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">prueba de {myname}</div></td></tr>
<tr><td>Mi jardín zoológico y botánico: </td> </tr>
<!-- BEGIN listaanimal -->
<tr><td>{animal}</td></tr>
<!-- BEGIN listaPlantas -->
<tr><td> {planta}</td></tr>
<!-- FIN ListaPlantas -->
<!-- END listaanimal -->
</tabla>
</cuerpo>
</html>
código ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
atenuar my_color, kkt, mi nombre, animal, planta
establecer kkt = nueva plantilla kkt
myname = "prueba de bloque kktTemplate..."
animal = matriz("animal", "planta")
planta = array(array("Cerdito","Xiaobai","Xiaoqiang"), array("Rosa","Girasol"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "minombre", minombre, falso
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
para i=0 a UBound(animal)
kkt.set_var "animal", animal(i), Falso
kkt.unset_var "p"
'kkt.set_var "p", "", falso
para j=0 a UBound(planta(i))
kkt.set_var "planta", planta(i)(j), falso
kkt.parse "p", "lista de plantas", verdadero
próximo
kkt.parse "a", "animalList", verdadero
próximo
kkt.parse "fuera", "hndKktTemp", falso
kkt.p "fuera"
%>
Resultado de la ejecución:
<html><title>Plantilla ASP: demostración de bloques anidados</title>
<cuerpo><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">prueba de bloque kktTemplate...prueba</div></td></tr>
<tr><td>Mi jardín zoológico y botánico: </td> </tr>
<tr><td>Animales</td></tr>
<tr><td> Cerdito</td></tr>
<tr><td> Xiaobai</td></tr>
<tr><td> Xiaoqiang</td></tr>
<tr><td>Plantas</td></tr>
<tr><td> Rose</td></tr>
<tr><td> Girasol</td></tr>
</tabla>
</cuerpo>
</html>
Todo el código mencionado en este artículo se puede descargar aquí: