Gerenciamento e veiculação universal de dados usando HTML puro. No entanto, para coletar dados, você precisa de um repositório de dados. Para evitar muitos dos problemas associados ao uso de um servidor de banco de dados, você pode coletar esses dados em XML. Aqui está a estrutura básica do nosso projeto:
<usuário>
<primeiro_nome/>
<sobrenome/>
<mi/>
</user>
Inicialmente limitei os dados ao nome, sobrenome e nome do meio. A ideia básica por trás desta página é que as informações do usuário sejam obtidas nesta página. Depois que as necessidades de informação do usuário forem satisfeitas, o processo deve ser movido para a próxima etapa de coleta lógica. Para simplificar, agruparei a funcionalidade do usuário em uma classe ASP.
Função Coalescer (vVar, vAlt)
Se vVal = "" Ou VarType(vVal) = 1 Ou VarType(vVal) = 0 Então
Coalescer = vAlt
Outro
Coalescer = vVal
Terminar se
Fim
da classe de função CUser
Privado m_SQL, m_DOM
Propriedade pública Obtenha DOM()
Definir DOM = m_DOM
Fim da propriedade
pública Sub saveUser()
m_SQL.save "save_user", m_DOM
Finalizar
função sub-pública validar()
m_DOM.loadXML "<root>" & m_SQL.validateUser(m_DOM) & "</root>"
Se não m_DOM.selectSingleNode("//error") não for nada, então
validar=Falso
Outro
validar = Verdadeiro
Terminar se
Função final
Private Sub collectData(dom, oCollection)
Dim nItem, nó, parent_node, n, sKey
Para nItem = 1 Para oCollection.Count
sKey = oCollection.Key(nItem)
Definir parent_node = dom.selectSingleNode("//" & sKey & "s")
Se não parent_node não for nada, então
Para n = 1 Para oCollection(sKey).Count
Definir nó = parent_node.selectSingleNode(sKey & _
"[string(.)='" &
oCollection(sKey)(n) & "']")
Se o nó não for nada, então
Definir nó = dom.createNode(1, sKey, "")
Definir nó = parent_node.appendChild(nó)
Terminar se
node.text = Coalesce(oCollection(sKey)(n), "")
Próximo
Outro
Definir nó = dom.selectSingleNode("//" & sKey)
Se não, o nó não é nada, então _
node.text = Coalesce(oCollection(sKey), "")
Terminar se
Próximo
Fim Sub
Privado Sub Class_Initialize()
Definir m_SQL = Novo CSQL
Definir m_DOM = Server.CreateObject("MSXML2.DOMDocument")
m_DOM.async = Falso
Se VarType(Request ("txtUserXML")) = 0 Ou Request ("txtUserXML") = "" Então
Solicitação m_DOM.loadXML ("txtUserXML")
Outro
m_DOM.load "<root>" & Server.MapPath("user.xml") & "</root>"
Terminar se
coletar dados m_DOM, Request.Form
coletar dados m_DOM, Request.QueryString
Fim Sub
Privado Sub Class_Terminate()
Definir m_SQL = Nada
Definir m_DOM = Nada
Fim Sub
Fim
Classe Classe CSQL
Salvar função pública
m_DAL, m_Stream privada
(sStoredProc, oDOM)
'adVarChar = 200
Matriz m_DAL.RunSP(m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))
Função final
Função pública validUser (oDOM)
Definir m_Stream = m_DAL.RunSPReturnStream("validate_user", Array(_
m_DAL.mp("@xml_param", 200, 8000, oDOM.xml)))
validarUsuário = m_Stream.ReadText(-1)
m_Stream.Fechar
Função final
Private Sub Class_Initialize()
Definir m_DAL = Server.CreateObject("MyPkg.MyDAL")
m_DAL.GetConnection “alguma string de conexão”
Definir m_Stream = Server.CreateObject("ADODB.Stream")
Fim Sub
Privado Sub Class_Terminate()
Definir m_DAL = Nada
Definir m_Stream = Nada
Fim SubFim
Classe
A classe CSQL é construída com base em um componente da camada de acesso a dados (m_DAL) MyPkg.MyDAL. Este componente é construído com base nos componentes DAL Fitch e Mather, que podem ser encontrados no MSDN. Desta forma construímos uma ponte entre o SQL Server e o seu código.
Quando o objeto CUser é inicializado, ele coleta os dados da solicitação e usa a subfunção collectData() para colocar os dados coletados em um nó correspondente no UserDOM. (Não explicarei o código porque é bastante fácil de entender por si só.) Depois de coletar os dados (ou não), usaremos XSL para transformar o conteúdo dos dados em um layout.
<?xml versão="1.0"?>
<xsl:folha de estilo xmlns:xsl=http://www.w3.org/1999/XSL/Transform
versão="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:if test="//erro">
<font color="red">*Informações em vermelho são obrigatórias<br/></font>
</xsl:se>
<xsl:apply-templates select="//usuário"/>
</xsl:template>
<xsl:template match="usuário">
<fonte>
<xsl:attribute name="cor">
<xsl:escolha>
<xsl:when test="//error[.='first name']">vermelho</xsl:when>
<xsl:caso>preto</xsl:caso contrário>
</xsl:escolha>
</xsl:atributo>
Primeiro nome:
</font>
<input type="text" name="first_name">
<xsl:attribute name="valor"><xsl:valor-de
select="first_name"/></xsl:attribute>
</input><br/>
<fonte>
<xsl:attribute name="cor">
<xsl:escolha>
<xsl:when test="//error[.='mi']">vermelho</xsl:when>
<xsl:caso>preto</xsl:caso contrário>
</xsl:escolha>
</xsl:atributo>
MI:
</font>
<input type="text" name="mi">
<xsl:attribute name="value"><xsl:value-of select="mi"/></xsl:attribute>
</input><br/>
<fonte>
<xsl:attribute name="cor">
<xsl:escolha>
<xsl:when test="//error[.='last_name']">vermelho</xsl:when>
<xsl:caso>preto</xsl:caso contrário>
</xsl:escolha>
</xsl:atributo>
Sobrenome:
</font>
<input type="text" nome="sobrenome">
<xsl:attribute name="valor"><xsl:valor-de
select="last_name"/></xsl:attribute>
</input><br/>
</xsl:template>
</xsl:stylesheet>
Esta folha de estilo converterá o conteúdo em um layout. A verificação de erros é importante e os procedimentos armazenados verificam os dados determinando se eles precisam de processamento. Retorna um nó "erros" para cada campo que não pode estar vazio, mas não possui dados preenchidos. A saída deste XML é aproximadamente a seguinte:
<user> .</user><errors><error>first_name</error> .
Esta folha de estilo transformará o conteúdo em layout. A verificação de erros é importante e os procedimentos armazenados verificam os dados determinando se eles precisam de processamento. Retorna um nó "erros" para cada campo que não pode estar vazio, mas não possui dados preenchidos. A saída deste XML é aproximadamente a seguinte:
<user> .</user><errors><error>first_name</error> .</errors>
Observe que se houver um erro ao corresponder ao nome do nó. a saída produzida será vermelha. Precisamos do seguinte ASP para combinar todas as coisas anteriores.
<%@Idioma=VBScript%>
<%
Opção Explícita
Escurecer o usuário
Definir oUser = NewCUser
Se oUser.validate() Então
Definir oUser = Nada
Servidor.Transfer "NextPage.asp"
Terminar se
%>
<html>
<corpo>
<form method="POST" action="GetUser.asp" name="thisForm" id="thisForm">
<%
Response.Write xslTransform(oUser.DOM, "user.xsl")
%>
<input type="hidden" name="txtUserXML" id="txtUserXML"
valor="<%=oUser.DOM.xml%>">
<input type="submit" value="Enviar">
</form>
</body>
</html>
<%
Definir oUser = Nada
Função xslTransform(vXML, XSLFileName)
Dim m_xml, m_xsl
Se VarType(vXML) = 8 Então
Definir m_xml = m_dom
m_xml.loadXML vXML
ElseIf VarType(vXML) = 9 Então
Definir m_xml = vXML
Terminar se
Se m_xml.parseError.errorCode <> 0 Então _
Err.Raise vbObjectError, "XMLTransform(...)", m_xml.parseError.reason
Definir m_xsl = Server.CreateObject("MSXML2.DOMDocument")
m_xsl.async = Falso
m_xsl.load Servidor.MapPath(XSLFileName)
Se m_xsl.parseError.errorCode <> 0 Então _
Err.Raise vbObjectError, "XMLTransform(...)", m_xsl.parseError.reason
xslTransform = m_xml.transformNode(m_xsl)
Definir m_xsl = Nada
Função final
%>
<!--#include file="CUser.asp"-->
O código ASP cria o objeto CUser e preenche os dados se houver dados. O HTML resultante é então criado por meio de transformação XSL usando o DOM do CUser. A transformação é agrupada em uma função chamada xslTransform. Além disso, lembre-se de armazenar o DOM CUser resultante em um elemento <INPUT> oculto. Ou você pode armazenar o DOM CUser em uma variável de sessão e retirá-lo durante a inicialização.
Depois de completar esta página, você pode criar outras páginas com base no esqueleto do código anterior. Agora você criou um cenário de copiar e colar para coleta de dados. A parte mais bonita desta solução é que toda a saída é HTML puro, sem quaisquer propriedades ou folhas de estilo específicas do navegador. E como a funcionalidade é agrupada em classes, você pode usar XSLT para gerar layouts e o código será executado muito rapidamente.
-------------------------------------------------- ----------------------------------
O autor deste artigo: Phillip Perkins é contratado da Ajilon Consulting. Sua experiência abrange desde controle de máquinas e cliente/servidor até aplicações de intranet.