相關(guān)資訊
- 《戰(zhàn)國(guó)無(wú)雙4-2》怎么換服裝?戰(zhàn)國(guó)無(wú)
- 關(guān)于責(zé)任的名言警句大全
- 《戰(zhàn)國(guó)無(wú)雙4-2》PC版如何聯(lián)機(jī)? 戰(zhàn)
- 戰(zhàn)國(guó)無(wú)雙4-2技能覺(jué)醒牛逼嗎 全新
- 《戰(zhàn)國(guó)無(wú)雙4-2》手柄無(wú)效怎么解決
- 戰(zhàn)國(guó)無(wú)雙4-2如何設(shè)置語(yǔ)言 戰(zhàn)國(guó)無(wú)雙
- 戰(zhàn)國(guó)無(wú)雙4-2怎么樣跳過(guò)進(jìn)入開(kāi)場(chǎng)動(dòng)畫(huà)
- 什么是應(yīng)屆生畢業(yè)生
- 應(yīng)屆生簡(jiǎn)歷自我評(píng)價(jià)
- 應(yīng)屆生簡(jiǎn)歷怎么寫(xiě)
本類(lèi)常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416896
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
非數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)對(duì)象的實(shí)例及說(shuō)明
本文提供給大家學(xué)習(xí)分享的是關(guān)于ASP中非數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)對(duì)象的實(shí)例及說(shuō)明,希望能給大家?guī)?lái)幫助或啟發(fā)。
有些時(shí)候,在資源有限及功能簡(jiǎn)單的情況下,利用文件管理本身就能很好的實(shí)現(xiàn)一個(gè)系統(tǒng),又何必非用數(shù)據(jù)庫(kù)不可呢?
好的,開(kāi)說(shuō)ASP程序,ASP程序強(qiáng)大的原因主要在于COM對(duì)象的擴(kuò)展,所以在一陣的頭腦風(fēng)暴后,打起了一套組合拳:Scripting.FileSystemObject,Scripting.Dictionary以及Msxml2.DOMDocument.4.0。
下面就以文件管理程序?yàn)槔,?duì)實(shí)現(xiàn)做簡(jiǎn)要說(shuō)明:
首先,是構(gòu)思。
1. 管理的數(shù)據(jù)對(duì)象是文件對(duì)象,而文件對(duì)象可以對(duì)應(yīng)到XML中的某個(gè)結(jié)點(diǎn)
2. 文件對(duì)象的結(jié)構(gòu),可以自行定義
3. 文件對(duì)象的增加、刪除、修改以及查詢
XML中充分利用Xpath,實(shí)現(xiàn)查詢比較簡(jiǎn)單,所以構(gòu)思后問(wèn)題主要應(yīng)該歸結(jié)為XML結(jié)點(diǎn)的增刪改的問(wèn)題,以及對(duì)象結(jié)構(gòu)的定義。增刪改不必多說(shuō),關(guān)鍵是對(duì)象結(jié)構(gòu)的自定義(在面向?qū)ο笾芯褪穷?lèi)的聲明)。
接下來(lái),是實(shí)現(xiàn)。
一是結(jié)構(gòu)文件
這里結(jié)構(gòu)包括:英文名字,中文顯示名,類(lèi)型,顯示模版(或參照),默認(rèn)值等
其實(shí)就是類(lèi)似schema的東西,然后把這些結(jié)構(gòu)保存在一個(gè)文件中,很多操作時(shí)就可以在循環(huán)中自動(dòng)處理了,比如顯示一個(gè)文件時(shí),就可以按照這個(gè)結(jié)構(gòu)來(lái)顯示所有屬性字段。
如下為一個(gè)結(jié)構(gòu)文件documentx.dna的示范內(nèi)容:
*/DOCS=文件
*/DOCS/@VERSION=版本%%STRING%%[NUM].[NUM].[NUM].[NUM]%%1.0.0.0
*/DOCS/DOC=文件
+/DOCS/DOC/@ID=標(biāo)識(shí)%%STRING%%%%=UniqueID()
+/DOCS/DOC/@HOT=人氣%%NUM%%%%0
/DOCS/DOC/TITLE=標(biāo)題
/DOCS/DOC/DEPARTFROM=來(lái)文單位%%DICTIONARY%%department%%
/DOCS/DOC/@DONE=是否處理完畢%%BOOL%%%%
需要說(shuō)明的是英文名稱采用Xpath的方式,是為了方便XML處理。
英文名稱前加*號(hào)表示為系統(tǒng)字段,同時(shí)也是非文件對(duì)象的屬性字段
英文名稱前加+表示該字段對(duì)用戶來(lái)說(shuō)是只讀的,其值由系統(tǒng)指定。
另外前加*或者加+號(hào)也好,也有防止誤刪的原因,因?yàn)?號(hào)或+號(hào)是不會(huì)顯示給用戶的。
用=號(hào)分隔英文名稱與其他部分,而其他部分中用%%分隔,依次為中文顯示名,該項(xiàng)類(lèi)型,顯示模版(或參照),默認(rèn)值。
需要說(shuō)明的是類(lèi)型,如果類(lèi)型為DICTIONARY的話,顯示模版(或參照)或參照的為具體的DICTIONARY文件,DICTIONARY的保存形式,形同Delphi中TstringList的保存形式,用=號(hào)把關(guān)鍵字與值分隔:
CS1=測(cè)試單位1
CS2=測(cè)試單位2
二是利用新建一個(gè)文件,說(shuō)明顯示的問(wèn)題
先看示范文件:
<% @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%">項(xiàng)</td>
<td>值</td>
</tr>
<%
'Count = 0
'DOCUMENTX為Scripting.Dictionary對(duì)象,為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" '也就是說(shuō)@為一般為內(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)計(jì)算:<%=Values(3) %>
<%
Else
'按照類(lèi)型進(jìn)行顯示
If Values(1)="BOOL" Then
Response.Write "<input type=""checkbox"" name=""" & AttrID & """ value=""1"" />"
Else
If Values(1)="DICTIONARY" Then
'ENVIRONMENT為Scripting.Dictionary對(duì)象
'ENVIRONMENT.Item(“ROOT”)中存儲(chǔ)了該程序管理的根目錄
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>
三是利用代碼說(shuō)明xml存儲(chǔ)的實(shí)現(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" '也就是說(shuō)@為一般為內(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ù)存儲(chǔ)到XML中去
Dim oXml
Set oXml = Server.CreateObject("Msxml2.DOMDocument.4.0")
Dim TimeSpec, ZoneID, DocID, FName, FPath
'計(jì)算該文檔屬于的區(qū)域
'注意:創(chuàng)建新文檔與修改原有文檔的計(jì)算方式不同,這里只做了創(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對(duì)象中去
'說(shuō)明:如果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中前面加上了+號(hào)
'也正是這些加*或者加+號(hào)屬性結(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
%>