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

随心笔谈11个月前发布 admin
92 0



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

</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 “” & m_SQL.validateUser(m_DOM) & “

    If Not m_DOM.selectSingleNode(“http://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(“http://” & 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(“http://” & 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 “” & Server.MapPath(“user.xml”) & “

    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将数据内容转变成布局。

    version=”1.0″>

<xsl:output method=”html”/>

    *Information in red is required

</xsl:template>

                red

                black

    First Name:

select=”first_name”/>

                red

                black

    MI:

                red

                black

    Last Name:

 select=”last_name”/>

</xsl:template>

</xsl:stylesheet>

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

    . . .

first_name. . .

这个样式表将把内容转成布局。错误检查是很重要的,存储过程通过确定数据是否需要处理来检查数据。对于不能为空但又没有填充数据的每个域返回一个“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

%>

<%

Response.Write xslTransform(oUser.DOM, “user.xsl”)

%>

 value=”<%=oUser.DOM.xml%>”>

<%

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的签约人。他的经验很丰富,从机器控制和客户/服务器到企业内部网应用。

© 版权声明

相关文章