純粋な HTML を使用したユニバーサルなデータ管理とサービス。ただし、データを収集するにはデータ リポジトリが必要です。データベース サーバーの使用に伴う多くの問題を回避するために、このデータを XML で収集できます。私たちのプロジェクトの基本構造は次のとおりです:
<user> <first_name/> <last_name/> <mi/> </user>
最初はデータを名、姓、ミドルネームに限定しました。このページの基本的な考え方は、ユーザー情報がこのページで取得されるということです。ユーザー情報のニーズが満たされた後、プロセスは次の論理収集ステップに移動する必要があります。物事をシンプルにするために、ユーザー機能を 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 に基づいて構築されています。このコンポーネントは、MSDN にある Fitch および Mather DAL コンポーネントに基づいて構築されています。このようにして、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>
このスタイルシートはコンテンツをレイアウトに変換します。エラー チェックは重要であり、ストアド プロシージャは、処理が必要かどうかを判断してデータをチェックします。空にすることはできないが、データが入力されていないフィールドごとに「エラー」ノードを返します。この XML の出力はおおよそ次のとおりです:
<user>. . .</user><errors><error>first_name</error>. . .</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 オブジェクトを作成し、データがある場合はデータを埋めます。結果として得られる HTML は、CUser の DOM を使用した XSL 変換によって作成されます。変換は xslTransform という関数にラップされます。また、結果の CUser DOM を非表示の 要素に保存することを忘れないでください。または、CUser DOM をセッション変数に保存し、初期化中にそれを取り出すこともできます。
このページを完了したら、前のスケルトン コードに基づいて他のページを作成できます。これで、データ収集用のコピーアンドペーストのシナリオが作成されました。このソリューションの最も美しい点は、すべての出力がブラウザ固有のプロパティやスタイルシートを含まない純粋な HTML であることです。また、機能がクラスにラップされているため、XSLT を使用してレイアウトを生成でき、コードは非常に高速に実行されます。
上記は純粋な HTML を使用した一般的なデータ管理とサービスの内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。