Heim  >  Artikel  >  Backend-Entwicklung  >  Universelle Datenverwaltung und -bereitstellung mit reinem HTML

Universelle Datenverwaltung und -bereitstellung mit reinem HTML

黄舟
黄舟Original
2017-03-03 17:03:061721Durchsuche

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(.)=&#39;" &
oCollection(sKey)(n) & "&#39;]")
                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)
    &#39;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[.=&#39;first name&#39;]">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[.=&#39;mi&#39;]">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[.=&#39;last_name&#39;]">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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn