相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416896
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機銀行客戶端下載下載量:365699
-
快播手機版下載量:325855
本文提供給大家學(xué)習(xí)分享的是關(guān)于ASP中非數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)對象的實例及說明,希望能給大家?guī)韼椭騿l(fā)。
有些時候,在資源有限及功能簡單的情況下,利用文件管理本身就能很好的實現(xiàn)一個系統(tǒng),又何必非用數(shù)據(jù)庫不可呢?
好的,開說ASP程序,ASP程序強大的原因主要在于COM對象的擴展,所以在一陣的頭腦風(fēng)暴后,打起了一套組合拳:Scripting.FileSystemObject,Scripting.Dictionary以及Msxml2.DOMDocument.4.0。
下面就以文件管理程序為例,對實現(xiàn)做簡要說明:
首先,是構(gòu)思。
1. 管理的數(shù)據(jù)對象是文件對象,而文件對象可以對應(yīng)到XML中的某個結(jié)點
2. 文件對象的結(jié)構(gòu),可以自行定義
3. 文件對象的增加、刪除、修改以及查詢
XML中充分利用Xpath,實現(xiàn)查詢比較簡單,所以構(gòu)思后問題主要應(yīng)該歸結(jié)為XML結(jié)點的增刪改的問題,以及對象結(jié)構(gòu)的定義。增刪改不必多說,關(guān)鍵是對象結(jié)構(gòu)的自定義(在面向?qū)ο笾芯褪穷惖穆暶鳎?/p>
接下來,是實現(xiàn)。
一是結(jié)構(gòu)文件
這里結(jié)構(gòu)包括:英文名字,中文顯示名,類型,顯示模版(或參照),默認值等
其實就是類似schema的東西,然后把這些結(jié)構(gòu)保存在一個文件中,很多操作時就可以在循環(huán)中自動處理了,比如顯示一個文件時,就可以按照這個結(jié)構(gòu)來顯示所有屬性字段。
如下為一個結(jié)構(gòu)文件documentx.dna的示范內(nèi)容:
*/DOCS=文件
*/DOCS/@VERSION=版本%%STRING%%[NUM].[NUM].[NUM].[NUM]%%1.0.0.0
*/DOCS/DOC=文件
+/DOCS/DOC/@ID=標識%%STRING%%%%=UniqueID()
+/DOCS/DOC/@HOT=人氣%%NUM%%%%0
/DOCS/DOC/TITLE=標題
/DOCS/DOC/DEPARTFROM=來文單位%%DICTIONARY%%department%%
/DOCS/DOC/@DONE=是否處理完畢%%BOOL%%%%
需要說明的是英文名稱采用Xpath的方式,是為了方便XML處理。
英文名稱前加*號表示為系統(tǒng)字段,同時也是非文件對象的屬性字段
英文名稱前加+表示該字段對用戶來說是只讀的,其值由系統(tǒng)指定。
另外前加*或者加+號也好,也有防止誤刪的原因,因為*號或+號是不會顯示給用戶的。
用=號分隔英文名稱與其他部分,而其他部分中用%%分隔,依次為中文顯示名,該項類型,顯示模版(或參照),默認值。
需要說明的是類型,如果類型為DICTIONARY的話,顯示模版(或參照)或參照的為具體的DICTIONARY文件,DICTIONARY的保存形式,形同Delphi中TstringList的保存形式,用=號把關(guān)鍵字與值分隔:
CS1=測試單位1
CS2=測試單位2
二是利用新建一個文件,說明顯示的問題
先看示范文件:
<% @LANGUAGE=VBSCRIPT %>
<%
Dim sKey, sValue, Sign, Pos, AttrID, Values, F, FName, Count
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Language" content="zh-cn">
</head>
<body>
<form method="POST" action="Documents!Save.asp">
<table border="0" width="100%" cellpadding="0" style="border-collapse: collapse">
<tr>
<td bgcolor="#C0C0C0"><b>新建</b></td>
</tr>
<tr>
<td>
<table border="1" width="100%" cellspacing="0" cellpadding="0" style="border-collapse: collapse" bordercolor="#000000">
<tr>
<td width="10%">項</td>
<td>值</td>
</tr>
<%
'Count = 0
'DOCUMENTX為Scripting.Dictionary對象,為documentx.dna的內(nèi)容
For Each sKey In DOCUMENTX
Sign = Left(sKey, 1)
If Sign<>"*" Then
sValue = DOCUMENTX.Item(sKey)
Values = Split(sValue & "%%%%%%", "%%")
Pos = InStrRev(sKey, "/")
AttrID = Right(sKey, Len(sKey) - Pos)
If Left(AttrID,1)="@" Then
AttrID = Mid(AttrID, 2) & "_INLINE" '也就是說@為一般為內(nèi)置屬性
End If
AttrID = "ATTR_" & AttrID
%>
<tr>
<td width="10%"><%=Values(0)%></td>
<td>
<%
If Sign="+" Then '如果為只讀屬性
%>
<input type="hidden" name="<%=AttrID %>" value="" />系統(tǒng)計算:<%=Values(3) %>
<%
Else
'按照類型進行顯示
If Values(1)="BOOL" Then
Response.Write "<input type=""checkbox"" name=""" & AttrID & """ value=""1"" />"
Else
If Values(1)="DICTIONARY" Then
'ENVIRONMENT為Scripting.Dictionary對象
'ENVIRONMENT.Item(“ROOT”)中存儲了該程序管理的根目錄
FName = ENVIRONMENT.Item("ROOT") & "\dictionary\" & Values(2) & ".dic"
%>
<select name="<%=AttrID %>">
<%
If FSO.FileExists(FName) Then
Set F = FSO.OpenTextFile(FName, 1, False)
Do While Not F.AtEndOfStream
sValue = F.ReadLine
Pos = InStr(sValue, "=")
If Pos>0 Then
Response.Write "<option value=""" & Left(sValue, Pos-1) & """>" & Right(sValue, Len(sValue)-Pos) & "</option>"
End If
Loop
F.Close
End If
%>
</select>
<%
Else
Response.Write "<input type=""textbox"" name=""" & AttrID & """ size=""30"" />"
End If
End If
End If
%>
</td>
</tr>
<%
'Count = Count + 1
End If
Next
%>
<tr>
<td width="10%"> </td>
<td> </td>
</tr>
<tr>
<td width="10%"> </td>
<td> </td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#C0C0C0" align="right" valign="middle"><input type="submit" name="btnSave" value="保存" /> <input type="button" name="btnReset" value="重輸" /></td>
</tr>
</table>
</form>
</body>
</html>
三是利用代碼說明xml存儲的實現(xiàn)
<% @LANGUAGE=VBSCRIPT %>
<!-- #include file="System.inc.asp" -->
<!-- #include file="Document.inc.asp" -->
<%
'System.inc.asp中包含UniqueID()函數(shù)
'首先,獲取用戶客戶端提交的數(shù)據(jù)信息
Dim PostData
Set PostData = Server.CreateObject("Scripting.Dictionary")
Dim Values, Key, Value, AttrID, Pos, Sign
For Each Key In DOCUMENTX
Sign = Left(Key, 1)
If Sign<>"*" Then
Value = DOCUMENTX.Item(Key)
Values = Split(Value & "%%%%%%", "%%")
Pos = InStrRev(Key, "/")
AttrID = Mid(Key, Pos + 1)
If Left(AttrID,1)="@" Then
AttrID = Mid(AttrID, 2) & "_INLINE" '也就是說@為一般為內(nèi)置屬性
End If
AttrID = "ATTR_" & AttrID
If Sign="+" Then
Key = Mid(Key, 2)
End If
'If Sign="+" Then '系統(tǒng)屬性
'End If
PostData.Item(Key) = Request.Form(AttrID) '取得用戶提交的數(shù)據(jù)
End If
Next
'下面是把PostData中的數(shù)據(jù)存儲到XML中去
Dim oXml
Set oXml = Server.CreateObject("Msxml2.DOMDocument.4.0")
Dim TimeSpec, ZoneID, DocID, FName, FPath
'計算該文檔屬于的區(qū)域
'注意:創(chuàng)建新文檔與修改原有文檔的計算方式不同,這里只做了創(chuàng)建的處理
'新建文檔的處理
TimeSpec = Now
'ZoneID為YYYYMM形式
ZoneID = Right ("20" & Year(TimeSpec), 4) & Right("0" & Month(TimeSpec), 2)
FPath = ENVIRONMENT.Item("ROOT")
If Not FSO.FileExists(FPath & "\data\" & ZoneID & ".dat") Then
If Not FSO.FileExists(FPath & "\etc\blank.dat") Then
Application("*FAIL") = "系統(tǒng)配置不正確,空白數(shù)據(jù)模版文件未找到!"
Set oXml = Nothing
Set PostData = Nothing
Response.Redirect "Fail.asp"
End If
FSO.CopyFile FPath & "\etc\blank.dat", FPath & "\data\" & ZoneID & ".dat"
End If
oXml.load FPath & "\data\" & ZoneID & ".dat"
'由于這里處理的是新建的情況,所以指定新的DocumentID
PostData.Item("/DOCS/DOC/@ID") = UniqueID()
PostData.Item("/DOCS/DOC/@HOT") = "0"
DocumentSaveToXml PostData, oXml
oXml.save FPath & "\data\" & ZoneID & ".dat"
Set oXml = Nothing
Set PostData = Nothing
Response.Write "OK!"
%>
DocumentSaveToXml函數(shù)在Document.inc.asp中
<%
'DocumentSaveToXml
'目的:把Dict中的數(shù)據(jù)導(dǎo)入到指定的Xml對象中去
'說明:如果Dict中指定ID的數(shù)據(jù)已經(jīng)存在于Xml中,則替換原有數(shù)據(jù)
Function DocumentSaveToXml(ByRef Dict, ByRef oXml)
DocumentSaveToXml = False
If Dict Is Nothing Or oXml Is Nothing Then
Exit Function
End If
Dim oXmlRoot, oXmlNode, oXmlSubNode
Set oXmlRoot = oXml.documentElement
Set oXmlNode = oXml.createElement("DOC")
Dim Key, Value
Dim Pos, AttrID, DocID
For Each Key In Dict
Value = Dict.Item(Key)
'根據(jù)Key
Pos = InStrRev(Key, "/")
AttrID = Mid(Key, Pos + 1)
If Left(AttrID, 1)="@" Then '如果是屬性
oXmlNode.setAttribute Mid(AttrID, 2), Value
Else
Set oXmlSubNode = oXml.createElement(AttrID)
oXmlSubNode.text = Value
oXmlNode.appendChild oXmlSubNode
End If
Next
'別忘了,這里的ID屬性定義,在documentx.dna中前面加上了+號
'也正是這些加*或者加+號屬性結(jié)構(gòu)不可以刪的原因
DocID = oXmlNode.getAttribute("ID")
Set oXmlSubNode = oXml.selectSingleNode("/DOCS/DOC[@ID=""" & DocID & """]")
If oXmlSubNode Is Nothing Then
oXmlRoot.appendChild oXmlNode
Else
oXmlRoot.replaceChild oXmlNode, oXmlSubNode
End If
DocumentSaveToXml = True
End Function
%>