Fonte do artigo: Notas de Programação
http://blog.csdn.net/nhconch Por favor, apoie-me.
Todo desenvolvedor que projetou um aplicativo ASP-Web em grande escala provavelmente tem a seguinte experiência: o código ASP e a página HTML são confusos e difíceis de distinguir, e a lógica de negócios é. está vinculado ao modo de exibição, tornando o código difícil de entender e modificar a programação deve ser escrita após a arte, o que se tornou um gargalo do projeto ao integrar o código do programa e as páginas estáticas HTML, leva muito tempo para ser obtido; o efeito desejado e também funciona como arte. Na verdade, não é fácil separar o processamento e a exibição de dados ao desenvolver aplicativos da Web usando linguagens de script. No entanto, no caso de cooperação entre várias pessoas, se os dados e a exibição não puderem ser separados, isso afetará muito a eficiência do desenvolvimento e o desempenho. divisão profissional do trabalho.
Outras linguagens de script, como JSP e PHP, têm suas próprias soluções ASP.NET, o produto de última geração do ASP, também implementa códigos e páginas. Parece que a transição direta para ASP é uma boa escolha. Mas sempre há motivos de um tipo ou de outro que nos impedem de abandonar o ASP ou ir direto para o campo .NET por enquanto. Do ponto de vista de uma empresa, mudar de linguagem é um grande investimento, incluindo a contratação de programadores .NET experientes, treinamento de programadores existentes, transformação de ferramentas de desenvolvimento, transformação de estilo de desenvolvimento, mudança de estilo de interface, estilo de interface, arquitetura de software, Documentos, processos de desenvolvimento , etc.; isso também significa que o código original deve ser reescrito no novo ambiente de linguagem para obter o melhor efeito e estabilidade, ao mesmo tempo, afetará diretamente o andamento do projeto durante este período, e é mais provável que isso aconteça; levar à saída individual dos programadores. Parece que antes de decidir mudar de idioma, é melhor encontrar uma solução na base original.
PHP implementa códigos e páginas por meio de templates. Existem FastTemplate, PHPLIB, Smarty, etc. para escolher, entre os quais o PHPLIB tem maior influência e é o mais utilizado. Nesse caso, passamos diretamente para ASP, o que traz grandes benefícios para empresas que utilizam PHP e ASP: 1. Quando o artista processa a página, seja PHP ou ASP, o método de processamento é o mesmo, e sem treinamento é necessário 2. Quando os programadores escrevem código, as ideias entre as duas linguagens são próximas ou consistentes. Quando as mesmas funções são implementadas nas duas linguagens, eles só precisam copiá-las e fazer pequenas modificações, garantindo eficiência de trabalho e projeto. progresso.
1. O design da classe de modelo implementa o encapsulamento de código na classe de modelo, que não apenas é compatível com PHPLIB, mas também torna o código fácil de gerenciar e expandir.
O objetivo da classe de modelo é ler o código HTML exibido no arquivo de modelo, substituir as partes do código de exibição que requerem dados dinâmicos pelos dados calculados pelo programa ASP e, em seguida, produzi-los em uma determinada ordem. Entre eles, a peça de reposição pode ser instalada livremente. Portanto, ele deve completar as seguintes tarefas:
·Leia o código HTML para exibição no arquivo de modelo.
·Combine o arquivo de modelo com os dados reais gerados para gerar resultados de saída.
·Permite que vários modelos sejam processados simultaneamente.
·Permitir aninhamento de modelos.
·Permite o processamento de uma parte individual do modelo.
Método de implementação:
Use FSO para ler arquivos de modelo
Use substituição regular para combinar arquivos e dados de modelo
O processamento de vários modelos é implementado usando armazenamento de array.
A ideia principal por trás da implementação do aninhamento de modelos é tratar modelos e saídas (quaisquer resultados de análise intermediários) igualmente, e ambos podem ser substituídos, e pronto.
O processamento de peças individuais é controlado definindo anotações no arquivo de modelo e, em seguida, combinando as anotações na substituição regular para obter a substituição parcial.
2. Antes de fornecer o código específico para a implementação da classe template, vamos primeiro listar as principais funções. Amigos que usaram PHPLIB devem estar familiarizados com isto:
1) Public Sub set_root (ByVal Value) define o diretório padrão do modelo 2) Public Sub set_file (ByVal handle, ByVal filename) lê o arquivo 3) Public Sub set_var (ByVal Name, ByVal Value, ByVal Append) define a substituição de dados de mapeamento variável 4) Public Sub unset_var (ByVal Name) Cancelar mapeamento de dados 5) Public Sub set_block (ByVal Parent, ByVal BlockTag, ByVal Name) Definir bloco de dados 6) Public Sub set_unknowns (ByVal desconhecidos) Definir o método de processamento de tags para mapeamento não especificado 7) Public Sub parse(ByVal Name, ByVal BlockTag, ByVal Append) executa a combinação de arquivo de modelo e dados 8) Public Sub p(ByVal Name) gera o
código de implementação do resultado do processamento:
<%
'================================================ =======================
'Os métodos de nomenclatura como set_var e set_block são usados neste objeto para compatibilidade com phplib
'================================================ =======================
'www.downcodes.com
Classe kktTemplate
Privado m_FileName, m_Root, m_Unknowns, m_LastError, m_HaltOnErr
Privado m_ValueList, m_BlockList
Privado m_RegExp
'Construtor
Subclasse Privada_Initialize
Definir m_ValueList = CreateObject("Scripting.Dictionary")
Definir m_BlockList = CreateObject("Scripting.Dictionary")
definir m_RegExp = Novo RegExp
m_RegExp.IgnoreCase = Verdadeiro
m_RegExp.Global = Verdadeiro
m_NomeArquivo = ""
m_Root = ""
m_Unknowns = "remover"
m_LastError = ""
m_HaltOnErr = verdadeiro
Finalizar sub
'Destruidor
Subclasse Privada_Terminate
Definir m_RegExp = Nada
Definir m_BlockMatches = Nada
Definir m_ValueMatches = nada
Finalizar sub
Propriedade pública GetClassName()
ClassName = "kktTemplate"
Fim da propriedade
Propriedade Pública Obter Versão()
Versão = "1.0"
Fim da propriedade
Sub público sobre()
Response.Write("kktTemplate classe de modelo de página ASP<br>" & vbCrLf &_
"Programação: Peng Guohui2004-07-05<br>" & vbCrLf &_
"Site pessoal: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"E-mail: <a href='mailto:[email protected]'>[email protected]</a><br>")
Finalizar sub
'Verifica se o diretório existe
Pasta de função públicaExist (caminho ByVal)
Escurecer fso
Definir fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Server.MapPath(caminho))
Definir fso = Nada
Função final
'Lê o conteúdo do arquivo
Função privada LoadFile()
Dim Nome do arquivo, fso, hndFile
Nome do arquivo = m_Root
If Right(Nome do arquivo, 1)<>"/" And Right(Nome do arquivo, 1)<>"" Then Filename = Filename & "/"
Nome do arquivo = Server.MapPath (Nome do arquivo e m_Nome do arquivo)
Definir fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(Filename) Then ShowError("Arquivo de modelo" & m_FileName & "Não existe!")
definir hndFile = fso.OpenTextFile (nome do arquivo)
LoadFile = hndFile.ReadAll
Definir hndFile = Nada
Definir fso = Nada
If LoadFile = "" Then ShowError("Não é possível ler o arquivo de modelo" & m_FileName & "Ou o arquivo está vazio!")
Função final
'Tratar mensagens de erro
Sub ShowError privado (mensagem ByVal)
m_LastError = mensagem
Response.Write "<font color=red style='font-size;14px'><b>Erro de modelo:" & msg & "</b></font><br>"
Se m_HaltOnErr então Response.End
Finalizar sub
'Define o diretório padrão para arquivos de modelo
'Ex: kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
' raiz = kktTemplate.get_root()
' raiz = kktTemplate.Root
'Usar um método de nomenclatura como set_root é para compatibilidade com phplib, que não será repetido abaixo.
Sub público set_root (valor ByVal)
If Not FolderExist(Value) Then ShowError(Value & "Não é um diretório válido ou o diretório não existe!")
m_Root = Valor
Finalizar sub
Função pública get_root()
get_root=m_Root
Função final
Propriedade pública Let Root (valor ByVal)
set_root(Valor)
Fim da propriedade
Propriedade Pública GetRoot()
Raiz = m_Root
Fim da propriedade
'Definir arquivo modelo
'Ex: kktTemplate.set_file("hndTpl", "index.htm")
'Esta classe não suporta vários arquivos de modelo, o identificador é reservado para compatibilidade com phplib
Sub set_file público (identificador ByVal, nome do arquivo ByVal)
m_NomeArquivo = nome do arquivo
m_BlockList.Adicionar identificador, LoadFile()
Finalizar sub
Função pública get_file()
get_file = m_NomeArquivo
Função final
' Propriedade Pública Let File(handle, nome do arquivo)
'set_file identificador, nome do arquivo
'Fim da propriedade
'Arquivo de obtenção de propriedade pública()
'Arquivo = m_NomeArquivo
'Fim da propriedade
'Defina o método de processamento para tags não especificadas, incluindo manter, remover e comentar.
Subconjunto público_unknowns (ByVal desconhecidos)
m_Desconhecidos = desconhecidos
Finalizar sub
Função pública get_unknowns()
get_unknowns = m_Unknowns
Função final
Propriedade pública Let Unknowns (ByVal desconhecido)
m_Desconhecidos = desconhecido
Fim da propriedade
Propriedade pública obtém incógnitas()
Desconhecidos = m_Desconhecidos
Fim da propriedade
Sub set_block público (ByVal Parent, ByVal BlockTag, ByVal Name)
Escurecer correspondências
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
If Not m_BlockList.Exists(Parent) Then ShowError("Tag de bloco não especificada" & Parent)
definir correspondências = m_RegExp.Execute(m_BlockList.Item(Parent))
Para cada partida nas partidas
m_BlockList.Add BlockTag, Match.SubMatches(0)
m_BlockList.Item(Parent) = Substituir(m_BlockList.Item(Parent), Match.Value, "{" & Nome & "}")
Próximo
definir correspondências = nada
Finalizar sub
Sub público set_var (nome ByVal, valor ByVal, anexo ByVal)
Dim Val
Se IsNull (Valor) Então Val = "" Else Val = Valor
Se m_ValueList.Exists(Nome) Então
Se anexar então m_ValueList.Item(Nome) = m_ValueList.Item(Nome) & Val _
Caso contrário, m_ValueList.Item(Nome) = Val
Outro
m_ValueList.Adicionar Nome, Valor
Terminar se
Finalizar sub
Sub público unset_var (Nome ByVal)
Se m_ValueList.Exists(Nome) Então m_ValueList.Remove(Nome)
Finalizar sub
Função privada InstanceValue (ByVal BlockTag)
Escureça as teclas, eu
InstanceValue = m_BlockList.Item(BlockTag)
chaves = m_ValueList.Keys
Para i = 0 para m_ValueList.Count-1
InstanceValue = Substituir(InstanceValue, "{" & chaves(i) & "}", m_ValueList.Item(chaves(i)))
Próximo
Função final
Subanálise pública (ByVal Name, ByVal BlockTag, ByVal Append)
If Not m_BlockList.Exists(BlockTag) Then ShowError("Tag de bloco não especificada" & Pai)
Se m_ValueList.Exists(Nome) Então
Se anexar então m_ValueList.Item(Nome) = m_ValueList.Item(Nome) & InstanceValue(BlockTag) _
Caso contrário, m_ValueList.Item(Nome) = InstanceValue(BlockTag)
Outro
m_ValueList.Adicionar Nome, InstanceValue(BlockTag)
Terminar se
Finalizar sub
Conclusão da função privada (conteúdo ByVal)
Selecione o caso m_Unknowns
Caso "manter" acabamento = conteúdo
Caso "remover"
m_RegExp.Pattern = "{[^ trn}]+}"
terminar = m_RegExp.Replace(conteúdo, "")
Caso "comentário"
m_RegExp.Pattern = "{([^ trn}]+)}"
acabamento = m_RegExp.Replace(content, "<!-- Variável de modelo $1 indefinido -->")
Caso Else terminar = conteúdo
Finalizar seleção
Função final
Sub p público (Nome ByVal)
Se não for m_ValueList.Exists(Nome) Então ShowError("Não existe" & Nome)
Response.Write(terminar(m_ValueList.Item(Nome)))
Finalizar sub
Fim da aula
%>
3. Exemplos de uso Aqui estão três exemplos para explicação.
1) O arquivo de modelo de substituição de valor simples é myTemple.tpl, conteúdo:
<html><title>Substituição simples do modelo ASP</title><body>
felicitar! Você ganhou uma Ferrari {some_color}!
</body>
A seguir está o código ASP (kktTemplate.inc.asp é a classe de modelo fornecida acima):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
escurecer minha_cor, kkt
minha_cor = "vermelho"
set kkt = new kktTemplate 'Criar objeto modelo
kkt.set_file "hndKktTemp", "myTemple.tpl" 'Defina e leia o arquivo de modelo myTemple.tpl
kkt.set_var "some_color", my_color, false 'Defina o valor da variável do modelo some_color = my_color
kkt.parse "out", "hndKktTemp", false 'Variável de modelo out = arquivo processado
kkt.p "out" 'Exibe o conteúdo de out
set kkt = nada 'Destrua o objeto modelo
%>
A saída após a execução é:
<html><title>Substituição simples do modelo ASP</title><body>
felicitar! Você ganha uma Ferrari vermelha!
</body>
2) Arquivo de modelo de exemplo de demonstração de bloco de loop myTemple2.tpl:
<html><title>Demonstração de bloco de modelo ASP</title><body>
<table cellpacing="2" border="1"><tr><td>Qual animal você mais gosta</td></tr>
<!-- BEGIN AnimalList -->
<tr><td><input type="radio" name="chk">{animal}</td></tr>
<!-- END ListaAnimais -->
</tabela>
</body>
Código ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
animal escuro, kkt, eu
animal = Array("Porquinho","Cachorrinho","Xiaoqiang")
definir kkt = novo kktTemplate
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "lista"
para i = 0 para UBound (animal)
kkt.set_var "animal", animal(i), falso
kkt.parse "lista", "ListaAnimais", verdadeiro
próximo
kkt.parse "out", "hndKktTemp", falso
kkt.p "fora"
definir kkt = nada
%>
Resultado da execução:
<html><title>Demonstração de bloco de modelo ASP</title><body>
<table cellpacing="2" border="1"><tr><td>Qual animal você mais gosta</td></tr>
<tr><td><input type="radio" name="chk">Porquinho</td></tr>
<tr><td><input type="radio" name="chk">Filhote de cachorro</td></tr>
<tr><td><input type="radio" name="chk">Xiaoqiang</td></tr>
</tabela>
</body>
3) Arquivo de modelo de demonstração de bloco aninhado myTemple3.tpl:
<html><title>Modelo ASP - Demonstração de blocos aninhados</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">teste {meunome}</div></td></tr>
<tr><td>Meu jardim zoológico e botânico: </td> </tr>
<!-- BEGIN listaanimal -->
<tr><td>{animal}</td></tr>
<!-- BEGIN plantList -->
<tr><td> {planta}</td></tr>
<!-- END listaplanta -->
<!-- END listaanimal -->
</tabela>
</body>
</html>
Código ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
dim minha_cor, kkt, meunome, animal, planta
definir kkt = novo kktTemplate
meunome = "teste de bloco kktTemplate..."
animal = array("animal", "planta")
planta = array(array("Porquinho","Xiaobai","Xiaoqiang"), array("Rosa","Girassol"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "meunome", meunome, falso
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
para i=0 para UBound(animal)
kkt.set_var "animal", animal(i), Falso
kkt.unset_var "p"
'kkt.set_var "p", "", falso
para j = 0 para UBound (planta (i))
kkt.set_var "planta", planta(i)(j), falso
kkt.parse "p", "plantList", verdadeiro
próximo
kkt.parse "a", "animalList", verdadeiro
próximo
kkt.parse "out", "hndKktTemp", falso
kkt.p "fora"
%>
Resultado da execução:
<html><title>Modelo ASP - Demonstração de blocos aninhados</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">teste de bloco kktTemplate...test</div></td></tr>
<tr><td>Meu jardim zoológico e botânico: </td> </tr>
<tr><td>Animais</td></tr>
<tr><td>Porquinho</td></tr>
<tr><td>Xiaobai</td></tr>
<tr><td>Xiaoqiang</td></tr>
<tr><td>Plantas</td></tr>
<tr><td>Rosa</td></tr>
<tr><td> Girassol</td></tr>
</tabela>
</body>
</html>
Todo o código mencionado neste artigo pode ser baixado aqui: