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

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

1<user>
2<first_name></first_name>
3<last_name></last_name>
4<mi></mi>
5</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 "

1<root>\" &amp; m_SQL.validateUser(m_DOM) &amp; \"</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 "

1<root>\" &amp; Server.MapPath(\"user.xml\") &amp; \"</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将数据内容转变成布局。

 1<xsl:stylesheet version='\"1.0\"' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 2<xsl:output method='\"html\"/'>
 3<xsl:template match='\"/\"'>
 4<xsl:if test='\"//error\"'>
 5<font color='\"red\"'>*Information in red is required
 6</font>
 7</xsl:if>
 8<xsl:apply-templates select='\"//user\"/'>
 9</xsl:apply-templates></xsl:template>
10<xsl:template match='\"user\"'>
11<font>
12<xsl:attribute name='\"color\"'>
13<xsl:choose>
14<xsl:when name\']\"="" test="\&quot;//error[.=\'first">red</xsl:when>
15<xsl:otherwise>black</xsl:otherwise>
16</xsl:choose>
17</xsl:attribute>   
18First Name:   
19</font>
20<input name='\"first_name\"' type='\"text\"'/>
21<xsl:attribute name='\"value\"'><xsl:value-of select='\"first_name\"/'></xsl:value-of></xsl:attribute>
22<font>
23<xsl:attribute name='\"color\"'>
24<xsl:choose>
25<xsl:when test="\&quot;//error[.=\'mi\']\&quot;">red</xsl:when>
26<xsl:otherwise>black</xsl:otherwise>
27</xsl:choose>
28</xsl:attribute>   
29MI:   
30</font>
31<input name='\"mi\"' type='\"text\"'/>
32<xsl:attribute name='\"value\"'><xsl:value-of select='\"mi\"/'></xsl:value-of></xsl:attribute>
33<font>
34<xsl:attribute name='\"color\"'>
35<xsl:choose>
36<xsl:when test="\&quot;//error[.=\'last_name\']\&quot;">red</xsl:when>
37<xsl:otherwise>black</xsl:otherwise>
38</xsl:choose>
39</xsl:attribute>   
40Last Name:   
41</font>
42<input name='\"last_name\"' type='\"text\"'/>
43<xsl:attribute name='\"value\"'><xsl:value-of select='\"last_name\"/'></xsl:value-of></xsl:attribute>
44</xsl:template>
45</xsl:output></xsl:stylesheet>

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

1<user>. . .</user>
1<errors><error>first_name</error>. . .</errors>

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

1<user>. . .</user>
1<errors><error>first_name</error>. . .</errors>

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

1@ Language=VBScript 
1   
2Option Explicit   
3Dim oUser   
4Set oUser = New CUser   
5If oUser.validate() Then   
6Set oUser = Nothing   
7Server.Transfer \"NextPage.asp\"   
8End If   
1<html>
2<body>
3<form action='\"GetUser.asp\"' id='\"thisForm\"' method='\"POST\"' name='\"thisForm\"'>   

Response.Write xslTransform(oUser.DOM, "user.xsl")

1<input =ouser.dom.xml="" ```\"="" id='\"txtUserXML\"' name='\"txtUserXML\"' type='\"hidden\"' value='\"```'/>
2<input type='\"submit\"' value='\"Submit\"'/>
3</form>
4</body>
5</html>
 1   
 2Set oUser = Nothing 
 3
 4Function xslTransform(vXML, XSLFileName)   
 5Dim m_xml, m_xsl   
 6If VarType(vXML) = 8 Then   
 7Set m_xml = m_dom   
 8m_xml.loadXML vXML   
 9ElseIf VarType(vXML) = 9 Then   
10Set m_xml = vXML   
11End If   
12If m_xml.parseError.errorCode <> 0 Then _   
13Err.Raise vbObjectError, \"XMLTransform(...)\", m_xml.parseError.reason   
14Set m_xsl = Server.CreateObject(\"MSXML2.DOMDocument\")   
15m_xsl.async = False   
16m_xsl.load Server.MapPath(XSLFileName)   
17If m_xsl.parseError.errorCode <> 0 Then _   
18Err.Raise vbObjectError, \"XMLTransform(...)\", m_xsl.parseError.reason   
19xslTransform = m_xml.transformNode(m_xsl)   
20Set m_xsl = Nothing   
21End Function   

ASP代码创建CUser对象,如果有数据就填充数据。然后使用CUser的DOM通过XSL转换来创建结果HTML。转换被包装到一个叫做xslTransform的函数之中。而且,记住要将结果CUser DOM存储到一个隐藏的

1<input/>

元素中。或者你可以将CUser DOM存储到一个Session变量中并在初始化过程中将其取出。

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

Published At
Categories with Web编程
Tagged with
comments powered by Disqus