Universelle Datenverwaltung und -bereitstellung mit reinem HTML. Um Daten zu sammeln, benötigen Sie jedoch ein Datenrepository. Um viele der Probleme zu vermeiden, die mit der Verwendung eines Datenbankservers einhergehen, können Sie diese Daten in XML sammeln. Hier ist die Grundstruktur unseres Projekts:
<Benutzer>
<Vorname/>
<last_name/>
<mi/>
</user>
Ich habe die Daten zunächst auf Vorname, Nachname und Vornamen beschränkt. Die Grundidee dieser Seite besteht darin, dass auf dieser Seite Benutzerinformationen erfasst werden. Nachdem die Benutzerinformationsanforderungen erfüllt sind, muss der Prozess mit dem nächsten logischen Erfassungsschritt fortfahren. Der Einfachheit halber werde ich die Benutzerfunktionalität in eine ASP-Klasse einbinden.
Funktion Coalesce(vVar, vAlt)
Wenn vVal = "" Oder VarType(vVal) = 1 Oder VarType(vVal) = 0 Dann
Coalesce = vAlt
Anders
Coalesce = vVal
Ende wenn
Endfunktionsklasse
CUser
Private m_SQL, m_DOM
Public Property Get DOM()
Setze DOM = m_DOM
End Property
Public Sub saveUser()
m_SQL.save „save_user“, m_DOM
Öffentliche Unterfunktion „validate()“
beenden
m_DOM.loadXML „<root>“ & m_SQL.validateUser(m_DOM) & „</root>“
Wenn nicht, ist m_DOM.selectSingleNode("//error") nichts, dann
validieren=Falsch
Anders
validieren=Wahr
Ende wenn
Endfunktion
Private Sub CollectData(dom, oCollection)
Dimmen Sie nItem, node, parent_node, n, sKey
Für nItem = 1 bis oCollection.Count
sKey = oCollection.Key(nItem)
Set parent_node = dom.selectSingleNode("//" & sKey & "s")
Wenn nicht, ist parent_node nichts, dann
Für n = 1 Zu oCollection(sKey).Count
Setze node = parent_node.selectSingleNode(sKey & _
"[string(.)='" &
oCollection(sKey)(n) & "']")
Wenn der Knoten nichts ist, dann
Setze node = dom.createNode(1, sKey, "")
Setze node = parent_node.appendChild(node)
Ende wenn
node.text = Coalesce(oCollection(sKey)(n), "")
Nächste
Anders
Setze node = dom.selectSingleNode("//" & sKey)
Wenn nicht, ist der Knoten nichts, dann _
node.text = Coalesce(oCollection(sKey), "")
Ende wenn
Nächste
End Sub
Private Sub Class_Initialize()
Setzen Sie m_SQL = Neues CSQL
Setze m_DOM = Server.CreateObject("MSXML2.DOMDocument")
m_DOM.async = Falsch
Wenn VarType(Request ("txtUserXML")) = 0 oder Request ("txtUserXML") = "" Dann
m_DOM.loadXML Request("txtUserXML")
Anders
m_DOM.load „<root>“ & Server.MapPath(“user.xml“) & „</root>“
Ende wenn
CollectData m_DOM, Request.Form
CollectData m_DOM, Request.QueryString
End Sub
Private Sub Class_Terminate()
Setzen Sie m_SQL = Nothing
Setze m_DOM = Nichts
End Sub
End Class
Klasse CSQL
Private m_DAL, m_Stream
Public Function save(sStoredProc, oDOM)
'adVarChar = 200
m_DAL.RunSP Array(m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))
Endfunktion
Öffentliche FunktionvalidateUser(oDOM)
Setze m_Stream = m_DAL.RunSPReturnStream("validate_user", Array(_
m_DAL.mp("@xml_param", 200, 8000, oDOM.xml)))
validierenBenutzer = m_Stream.ReadText(-1)
m_Stream.Close
Endfunktion
Private Sub Class_Initialize()
Setze m_DAL = Server.CreateObject("MyPkg.MyDAL")
m_DAL.GetConnection „irgendeine Verbindungszeichenfolge“
Setze m_Stream = Server.CreateObject("ADODB.Stream")
End Sub
Private Sub Class_Terminate()
Setze m_DAL = Nichts
Setze m_Stream = Nothing
End-Sub-
End-Klasse
Die CSQL-Klasse basiert auf der Data Access Layer (m_DAL)-Komponente MyPkg.MyDAL. Diese Komponente basiert auf den DAL-Komponenten von Fitch und Mather, die auf MSDN zu finden sind. Auf diese Weise bauen wir eine Brücke zwischen SQL Server und Ihrem Code.
Wenn das CUser-Objekt initialisiert wird, sammelt es die Anforderungsdaten und verwendet die Unterfunktion „collectData()“, um die gesammelten Daten in einem entsprechenden Knoten im UserDOM abzulegen. (Den Code werde ich nicht erklären, da er für sich genommen ziemlich einfach zu verstehen ist.) Nachdem wir die Daten gesammelt haben (oder auch nicht), verwenden wir XSL, um den Dateninhalt in ein Layout umzuwandeln.
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform
version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:if test="//error">
<font color="red">*Informationen in Rot sind erforderlich<br/></font>
</xsl:if>
<xsl:apply-templates select="//user"/>
</xsl:template>
<xsl:template match="user">
<Schriftart>
<xsl:attribute name="color">
<xsl:choose>
<xsl:when test="//error[.='first name']">red</xsl:when>
<xsl:otherwise>schwarz</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
Vorname:
</font>
<input type="text" name="first_name">
<xsl:attribute name="value"><xsl:value-of
select="first_name"/></xsl:attribute>
</input><br/>
<Schriftart>
<xsl:attribute name="color">
<xsl:choose>
<xsl:when test="//error[.='mi']">red</xsl:when>
<xsl:otherwise>schwarz</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
MI:
</font>
<input type="text" name="mi">
<xsl:attribute name="value"><xsl:value-of select="mi"/></xsl:attribute>
</input><br/>
<Schriftart>
<xsl:attribute name="color">
<xsl:choose>
<xsl:when test="//error[.='last_name']">red</xsl:when>
<xsl:otherwise>schwarz</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
Nachname:
</font>
<input type="text" name="last_name">
<xsl:attribute name="value"><xsl:value-of
select="last_name"/></xsl:attribute>
</input><br/>
</xsl:template>
</xsl:stylesheet>
Dieses Stylesheet konvertiert Inhalte in ein Layout. Die Fehlerprüfung ist wichtig, und gespeicherte Prozeduren prüfen Daten, indem sie feststellen, ob sie verarbeitet werden müssen. Gibt einen „Fehler“-Knoten für jedes Feld zurück, das nicht leer sein darf, aber keine Daten enthält. Die Ausgabe dieses XML lautet ungefähr wie folgt:
<user> .</user><errors>first_name .</errors>
Dieses Stylesheet wandelt Inhalte in Layout um. Die Fehlerprüfung ist wichtig, und gespeicherte Prozeduren prüfen Daten, indem sie feststellen, ob sie verarbeitet werden müssen. Gibt einen „Fehler“-Knoten für jedes Feld zurück, das nicht leer sein darf, aber keine Daten enthält. Die Ausgabe dieses XML lautet ungefähr wie folgt:
<user> .</user><errors><error>first_name .</errors>
. Die erzeugte Ausgabe wird rot sein. Wir benötigen den folgenden ASP, um alle vorherigen Dinge zu kombinieren.
<%@ Language=VBScript %>
<%
Option explizit
Dimmen Sie den Benutzer
Legen Sie oUser = NewCUser fest
Wenn oUser.validate() Dann
Setzen Sie oUser = Nothing
Server.Transfer „NextPage.asp“
Ende wenn
%>
<html>
<Körper>
<form method="POST" action="GetUser.asp" name="thisForm" id="thisForm">
<%
Response.Write xslTransform(oUser.DOM, „user.xsl“)
%>
<input type="hidden" name="txtUserXML" id="txtUserXML"
value="<%=oUser.DOM.xml%>">
<input type="submit" value="Submit">
</form>
</body>
</html>
<%
Set oUser = Nothing
Function xslTransform(vXML, XSLFileName)
Dimmen Sie m_xml, m_xsl
Wenn VarType(vXML) = 8, dann
Setze m_xml = m_dom
m_xml.loadXML vXML
ElseIf VarType(vXML) = 9 Dann
Setzen Sie m_xml = vXML
Ende wenn
Wenn m_xml.parseError.errorCode <> 0, dann _
Err.Raise vbObjectError, „XMLTransform(...)“, m_xml.parseError.reason
Setze m_xsl = Server.CreateObject("MSXML2.DOMDocument")
m_xsl.async = Falsch
m_xsl.load Server.MapPath(XSLFileName)
Wenn m_xsl.parseError.errorCode <> 0, dann _
Err.Raise vbObjectError, „XMLTransform(...)“, m_xsl.parseError.reason
xslTransform = m_xml.transformNode(m_xsl)
Setze m_xsl = Nichts
Funktion beenden
%>
<!--#include file="CUser.asp"-->
Der ASP-Code erstellt das CUser-Objekt und füllt die Daten aus, sofern Daten vorhanden sind. Der resultierende HTML-Code wird dann per XSL-Transformation unter Verwendung des DOM von CUser erstellt. Die Transformation wird in eine Funktion namens xslTransform verpackt. Denken Sie außerdem daran, das resultierende CUser-DOM in einem versteckten <INPUT>-Element zu speichern. Oder Sie können das CUser-DOM in einer Sitzungsvariablen speichern und es während der Initialisierung abrufen.
Nachdem Sie diese Seite fertiggestellt haben, können Sie weitere Seiten basierend auf dem vorherigen Grundcode erstellen. Jetzt haben Sie ein Copy-and-Paste-Szenario für die Datenerfassung erstellt. Das Schönste an dieser Lösung ist, dass die gesamte Ausgabe reines HTML ist, ohne browserspezifische Eigenschaften oder Stylesheets. Und da die Funktionalität in Klassen verpackt ist, können Sie XSLT zum Generieren von Layouts verwenden und der Code läuft ziemlich schnell.
-------------------------------------------------- ----------------------------------
Der Autor dieses Artikels: Phillip Perkins ist ein Auftragnehmer von Ajilon Consulting. Seine Erfahrung reicht von Maschinensteuerung über Client/Server bis hin zu Intranet-Anwendungen.