집 >백엔드 개발 >XML/RSS 튜토리얼 >순수 HTML을 사용한 범용 데이터 관리 및 제공
순수한 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 개체가 초기화되면 요청 데이터를 수집하고 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을 숨겨진 1f8d794be57c83e2004988471599675b 요소에 저장해야 합니다. 또는 CUser DOM을 세션 변수에 저장하고 초기화 중에 꺼낼 수 있습니다.
이 페이지를 완료한 후 이전 스켈레톤 코드를 기반으로 다른 페이지를 만들 수 있습니다. 이제 데이터 수집을 위한 복사 및 붙여넣기 시나리오가 생성되었습니다. 이 솔루션의 가장 아름다운 부분은 모든 출력이 브라우저별 속성이나 스타일시트 없이 순수한 HTML이라는 점입니다. 기능이 클래스로 래핑되므로 XSLT를 사용하여 레이아웃을 생성할 수 있고 코드가 매우 빠르게 실행됩니다.
위 내용은 순수 HTML을 이용한 일반적인 데이터 관리 및 서비스 내용입니다. 자세한 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!