• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    使用纯HTML的通用数据管理和服务

    使用纯HTML的通用数据管理和服务。然而,为了收集数据,你需要一个数据储存库。要避免使用数据库服务器带来的很多问题,你可以在XML中收集这些数据。下面是我们的项目的基本结构:

    user>
        first_name/>
        last_name/>
        mi/>
    /user>

    我最初将数据限制为first name,last name和middle。这个页面之后的基本思想是用户信息在这个页面中获得。在用户信息需求得到满足以后,流程必须被转到下一个逻辑收集步骤。为了使事情变得简单,我将把用户功能包装到一个ASP类中。

    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
    CSQL类是基于一个数据访问层(m_DAL)组件MyPkg.MyDAL建立起来的。而这个组件则是基于Fitch和Mather DAL组件建立起来的,这两个组件可以从MSDN找到。这样我们就在SQL Server与你的代码建立了桥梁。

     
    当CUser对象初始化之后,它收集Request数据并使用collectData()子函数将收集到的数据放到UserDOM的一个相应的节点中。(代码我不再解释,因为它本身相当容易理解。)在收集了数据之后(或者不收集数据),我们将使用XSL将数据内容转变成布局。

    ?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 requiredbr/>/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>

    这个样式表将把内容转成布局。错误检查是很重要的,存储过程通过确定数据是否需要处理来检查数据。对于不能为空但又没有填充数据的每个域返回一个“errors”节点。这个XML的输出大致如下:

        user>. . ./user>errors>error>first_name/error>. . ./errors>
    这个样式表将把内容转成布局。错误检查是很重要的,存储过程通过确定数据是否需要处理来检查数据。对于不能为空但又没有填充数据的每个域返回一个“errors”节点。这个XML的输出大致如下:

        user>. . ./user>errors>error>first_name/error>. . ./errors>

    注意如果有一个错误匹配了节点名,那么产生的输出将会是红色的。我们需要下面的一个ASP将前面的所有东西组合起来。

    %@ 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代码创建CUser对象,如果有数据就填充数据。然后使用CUser的DOM通过XSL转换来创建结果HTML。转换被包装到一个叫做xslTransform的函数之中。而且,记住要将结果CUser DOM存储到一个隐藏的INPUT>元素中。或者你可以将CUser DOM存储到一个Session变量中并在初始化过程中将其取出。

    在完成这个页面之后,你可以基于前面的骨架代码创建其它的页面。现在你已经创建了一个数据收集的拷贝-粘贴方案。这个方案最优美的部分在于所有的输出都是纯HTML,没有任何浏览器特有的性质或者样式表。而且由于功能都被包装到类中,所以你可以使用XSLT产生布局,代码运行相当快。


    --------------------------------------------------------------------------------
    本文作者:Phillip Perkins是Ajilon Consulting的签约人。他的经验很丰富,从机器控制和客户/服务器到企业内部网应用。

    上一篇:XML和JSP的联手
    下一篇:概述IE和SQL2k开发一个XML聊天程序
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    使用纯HTML的通用数据管理和服务 使用,纯,HTML,的,通用,数据管理,