Heim >Backend-Entwicklung >XML/RSS-Tutorial >Universelle Datenverwaltung und -bereitstellung mit reinem HTML
Universelle Datenverwaltung und Dienste 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:
<user> <first_name/> <last_name/> <mi/> </user>
Ich habe die Daten zunächst auf Vorname, Nachname und zweiten 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.
Function Coalesce(vVar, vAlt) If vVal = "" Or VarType(vVal) = 1 Or VarType(vVal) = 0 Then Coalesce = vAlt Else Coalesce = vVal End If End Function Class CUser PRivate m_SQL, m_DOM Public Property Get DOM() Set DOM = m_DOM End Property Public Sub saveUser() m_SQL.save "save_user", m_DOM End Sub Public Function validate() m_DOM.loadXML "<root>" & m_SQL.validateUser(m_DOM) & "</root>" If Not m_DOM.selectSingleNode("//error") Is Nothing Then validate = False Else validate = True End If End Function Private Sub collectData(dom, oCollection) Dim nItem, node, parent_node, n, sKey For nItem = 1 To oCollection.Count sKey = oCollection.Key(nItem) Set parent_node = dom.selectSingleNode("//" & sKey & "s") If Not parent_node Is Nothing Then For n = 1 To oCollection(sKey).Count Set node = parent_node.selectSingleNode(sKey & _ "[string(.)='" & oCollection(sKey)(n) & "']") If node Is Nothing Then Set node = dom.createNode(1, sKey, "") Set node = parent_node.appendChild(node) End If node.text = Coalesce(oCollection(sKey)(n), "") Next Else Set node = dom.selectSingleNode("//" & sKey) If Not node Is Nothing Then _ node.text = Coalesce(oCollection(sKey), "") End If Next End Sub Private Sub Class_Initialize() Set m_SQL = New CSQL Set m_DOM = Server.CreateObject("MSXML2.DOMDocument") m_DOM.async = False If VarType(Request ("txtUserXML")) = 0 Or Request ("txtUserXML") = "" Then m_DOM.loadXML Request("txtUserXML") Else m_DOM.load "<root>" & Server.MapPath("user.xml") & "</root>" End If collectData m_DOM, Request.Form collectData m_DOM, Request.QueryString End Sub Private Sub Class_Terminate() Set m_SQL = Nothing Set m_DOM = Nothing End Sub End Class Class 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)) End Function Public Function validateUser(oDOM) Set m_Stream = m_DAL.RunSPReturnStream("validate_user", Array(_ m_DAL.mp("@xml_param", 200, 8000, oDOM.xml))) validateUser = m_Stream.ReadText(-1) m_Stream.Close End Function Private Sub Class_Initialize() Set m_DAL = Server.CreateObject("MyPkg.MyDAL") m_DAL.GetConnection "some connection string" Set m_Stream = Server.CreateObject("ADODB.Stream") End Sub Private Sub Class_Terminate() Set m_DAL = Nothing Set m_Stream = Nothing End Sub End Class
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 einen entsprechenden Knoten im UserDOM einzufügen. (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">*Information in red is required<br/></font> </xsl:if> <xsl:apply-templates select="//user"/> </xsl:template> <xsl:template match="user"> <font> <xsl:attribute name="color"> <xsl:choose> <xsl:when test="//error[.='first name']">red</xsl:when> <xsl:otherwise>black</xsl:otherwise> </xsl:choose> </xsl:attribute> First Name: </font> <input type="text" name="first_name"> <xsl:attribute name="value"><xsl:value-of select="first_name"/></xsl:attribute> </input><br/> <font> <xsl:attribute name="color"> <xsl:choose> <xsl:when test="//error[.='mi']">red</xsl:when> <xsl:otherwise>black</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/> <font> <xsl:attribute name="color"> <xsl:choose> <xsl:when test="//error[.='last_name']">red</xsl:when> <xsl:otherwise>black</xsl:otherwise> </xsl:choose> </xsl:attribute> Last Name: </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 wandelt Inhalte in ein 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 sieht ungefähr wie folgt aus:
<user>. . .</user><errors><error>first_name</error>. . .</errors>
Dieses Stylesheet wandelt den Inhalt in ein 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 sieht ungefähr wie folgt aus:
<user>. . .</user><errors><error>first_name</error>. . .</errors>
Beachten Sie, dass die resultierende Ausgabe rot ist, wenn beim Abgleich des Knotennamens ein Fehler auftritt. Wir benötigen den folgenden ASP, um alle vorherigen Dinge zu kombinieren.
<%@ Language=VBScript %> <% Option Explicit Dim oUser Set oUser = New CUser If oUser.validate() Then Set oUser = Nothing Server.Transfer "NextPage.asp" End If %> <html> <body> <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) Dim m_xml, m_xsl If VarType(vXML) = 8 Then Set m_xml = m_dom m_xml.loadXML vXML ElseIf VarType(vXML) = 9 Then Set m_xml = vXML End If If m_xml.parseError.errorCode <> 0 Then _ Err.Raise vbObjectError, "XMLTransform(...)", m_xml.parseError.reason Set m_xsl = Server.CreateObject("MSXML2.DOMDocument") m_xsl.async = False m_xsl.load Server.MapPath(XSLFileName) If m_xsl.parseError.errorCode <> 0 Then _ Err.Raise vbObjectError, "XMLTransform(...)", m_xsl.parseError.reason xslTransform = m_xml.transformNode(m_xsl) Set m_xsl = Nothing End Function %> <!--#include file="CUser.asp"-->
ASP-Code erstellt ein CUser-Objekt und füllt die Daten aus, wenn 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 1f8d794be57c83e2004988471599675b-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. Sie haben nun 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.
Das Obige ist der Inhalt der allgemeinen Datenverwaltung und -dienste unter Verwendung von reinem HTML. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!