使用純HTML的通用資料管理和服務
<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 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>
這個樣式表將把內容轉成佈局。錯誤檢查是很重要的,儲存過程通過確定資料是否需要處理來檢查資料。對於不能為空但又沒有填充資料的每個域返回一個“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的簽約人。他的經驗很豐富,從機器控制和客戶/服務器到企業內部網應用。
相關文章
- 7個高效的API和服務管理習慣API
- 純HTML + CSS製作個人資料卡HTMLCSS
- SpringCloud進行nacos的服務註冊和服務管理案例SpringGCCloud
- 朱鬆純:走向通用人工智慧——從大資料到大任務人工智慧大資料
- HTML轉PDF的純客戶端和純服務端實現方案HTML客戶端服務端
- 通用資料庫管理工具DBeaver資料庫
- lirantal/dockly:用於管理docker容器和服務的沉浸式終端介面Docker
- silky微服務的應用服務和服務條目微服務
- 資料庫管理員的任務資料庫
- 微服務時代元件化和服務化的抉擇微服務元件化
- linux引導和服務Linux
- 30個基本的使用者體驗開發工具和服務
- 2.8 使用資料庫服務管理應用負載資料庫負載
- Laravel :register(註冊)和服務容器的理解Laravel
- Istio Mixer元件和服務的重要說明元件
- 通用資料庫/源連線管理分析查詢DBeaverEE資料庫
- 命令別名:保護和服務
- Go微服務框架go-kratos實戰04:kratos中服務註冊和服務發現的使用Go微服務框架
- SpringBoot使用Nacos作為配置中心服務和服務註冊中心Spring Boot
- Spring Cloud簡介和服務中心的搭建SpringCloud
- 微服務的【資料庫管理】最佳實踐微服務資料庫
- 爬蟲-使用lxml解析html資料爬蟲XMLHTML
- 使用shell抽取html資料之二HTML
- 微服務之服務註冊和服務發現篇微服務
- DBeaver安裝教程(開發人員和資料庫管理員通用資料庫管理工具)資料庫
- Modbus通用資料讀取工具設計及使用
- VMware Data Services Manager 2.1 - 資料庫管理和資料服務管理資料庫
- 大資料擁有者、提供者和服務者的三種不同商業模式細分大資料模式
- 使用極光推送實現分組傳送和服務端整合服務端
- 談談財務資料管理策略
- 2023年全球主要雲原生應用和服務支出(附原資料表)
- 【SpringCloud】(二):服務發現和服務註冊SpringGCCloud
- 使用者許可權設計(三)——通用資料許可權管理系統設計
- 高可用架構之高可用的應用和服務架構
- Linux 常用軟體和服務的配置網站Linux網站
- 資料庫自動維護任務的管理資料庫
- CSS通用資料型別CSS資料型別
- 2023年美國成年普通使用者對喜歡產品和服務分享方式比例(附原資料表)