明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

如何制作無狀態(tài)的ASP組件

[摘要]一般我們在web或其它有關(guān)的無狀態(tài)應(yīng)用中使用組件時,腳本運(yùn)行完畢后我們都會丟失組件的所有參照。當(dāng)然可以簡單地將組件的參照保存在會話(session )變量中,但這浪費(fèi)資源。更聰明的方法是用會話變量或隱式表單標(biāo)簽保存組件的一些信息。當(dāng)重新制作組件的實(shí)例時,試圖用保存在會話變量中的信息恢復(fù)組件的狀態(tài)。...
一般我們在web或其它有關(guān)的無狀態(tài)應(yīng)用中使用組件時,腳本運(yùn)行完畢后我們都會丟失組件的所有參照。當(dāng)然可以簡單地將組件的參照保存在會話(session )變量中,但這浪費(fèi)資源。更聰明的方法是用會話變量或隱式表單標(biāo)簽保存組件的一些信息。當(dāng)重新制作組件的實(shí)例時,試圖用保存在會話變量中的信息恢復(fù)組件的狀態(tài)。但兩種方法的弊端都在于:從資源的角度來看過于昂貴,甚至恰好難以實(shí)現(xiàn)。

  很幸運(yùn)有個好消息。我們都知道可持續(xù)性的整個前提是能夠?qū)⒆兞炕謴?fù)到這樣的狀態(tài),以至于組件知道在上次的例示中它在哪。這有助于組件現(xiàn)在去做它假定要做的。這個方案的一個典型例子是網(wǎng)頁上資料的翻頁。當(dāng)用戶點(diǎn)擊Page Down時,我們需要知道我們在前一頁的位置。 不把變量保存在內(nèi)存中(如會話變量),如果我們能將它們保存在文件中,等以后需要時檢索不是會很好嗎?用基礎(chǔ)的數(shù)據(jù)形式(字符串與數(shù)字)保存數(shù)據(jù)很容易。用對象和數(shù)組會怎樣呢?對象和數(shù)組本質(zhì)上是存儲器中的二進(jìn)制數(shù)據(jù)流。如果我們能讀這個數(shù)據(jù)我們就能將它寫進(jìn)文件以便以后的檢索。關(guān)于對象有個好注意。盡管數(shù)組的情況不同。首先你不能用數(shù)組做組件的屬性(VB6.0)。你可以用他們做變量,但以后你會碰到路障。幸運(yùn)地是我們?yōu)檫@種情況發(fā)現(xiàn)了一個工作區(qū)。

  你可以將所有或部分屬性保存在一個PropertyBag對象中。PropertyBag對象控制在一個對象調(diào)用過程中可以保存和恢復(fù)的信息。PropertyBag對象的內(nèi)容(Content)屬性提供你任何存在組中的二進(jìn)制數(shù)據(jù)流。由你來將這些二進(jìn)制數(shù)據(jù)流寫進(jìn)文件中以便日后的檢索。

實(shí)例:

比如你有一個類MyComp.clsMyDept,它有兩個屬性MyDepartment$ 和 MyEmployees (一個ADO記錄集對象)。

以下是這個類模塊的代碼:

Option Explicit
Option Compare Text

Public MyDepartment As String
Public MyEmployees As ADODB.Recordset

Dim objBag As New PropertyBag

Private Sub Class_InitProperties()
Set MyEmployees = New ADODB.Recordset
MyEmployees.Fields.Append "EmpName", adVarChar, 30
MyEmployees.Fields.Append "EmpSal", adCurrency
MyEmployees.Open
End Sub

Public Sub SaveMyProperties()
Dim intFile%, bytRec() As Byte
objBag.WriteProperty "MyDepartment", MyDepartment
objBag.WriteProperty "MyEmployees", MyEmployees
' Save this data in a file for later retrieval
intFile = FreeFile
If Dir("C:\MyData.txt", vbNormal) = "" Then
Else
Kill "C:\MyData.txt"
End If
Open "C:\MyData.txt" For Binary Access Write As #intFile
bytRec = objBag.Contents
Put #intFile, , bytRec
Close #intFile
End Sub

Public Sub RestoreMyProperties()
Dim intFile%, bytRec() As Byte
' Read the saved data from the file.
ReDim bytRec(FileLen("C:\MyData.txt"))
intFile = FreeFile
Open "C:\MyData.txt" For Binary Access Read As #intFile
Get #intFile, , bytRec
objBag.Contents = bytRec
Close #intFile
' PropertBag restored. Lets restore the properties now.
MyDepartment = objBag.ReadProperty("MyDepartment")
Set MyEmployees = objBag.ReadProperty("MyEmployees")
End Sub


在客戶應(yīng)用中保存屬性

Private Sub Command1_Click()
Dim objDept As New MyComp.clsMyDept
objDept.MyDepartment = "Research"
' Add one employee
objDept.MyEmployees.AddNew
objDept.MyEmployees!EmpName = "Harry"
objDept.MyEmployees!EmpSal = 2500
objDept.MyEmployees.Update
' Add second employee
objDept.MyEmployees.AddNew
objDept.MyEmployees!EmpName = "Potter"
objDept.MyEmployees!EmpSal = 3000
objDept.MyEmployees.Update
' Save the properties by calling the method from our component
objDept.SaveMyProperties
Set objDept = Nothing
End Sub


取回保存的屬性

Private Sub Command2_Click()
Dim objDept As New MyComp.clsMyDept
' Restore properties by calling the method from our component
objDept.RestoreMyProperties
' Lets see what is restored
Debug.Print objDept.MyDepartment 'Will print Research

objDept.MyEmployees.MoveFirst
Debug.Print "" & objDept.MyEmployees!EmpName 'Will print Harry
objDept.MyEmployees.MoveNext
Debug.Print "" & objDept.MyEmployees!EmpName 'Will print Potter
Set objDept = Nothing
End Sub

  先別激動,你在自己的應(yīng)用中運(yùn)行這個酷件之前,必須了解它的局限性。用于保存的時間取決于屬性的大小和數(shù)據(jù)類型。注意大部分時間用在ReadProperty 和 WriteProperty 中。原因很簡單,當(dāng)我們處理象ADO記錄集這樣的結(jié)構(gòu)型數(shù)據(jù)時,過程可不象拷貝字節(jié)流那樣簡單。數(shù)據(jù)也得被解釋。

保存記錄集時我觀察到以下情況:

1、保存100,000行每列有25個字符的記錄集用了50秒。
2、檢索同樣的數(shù)據(jù)用了20秒。

  有個更好的方法保存記錄集對象。他們有自己的Save方法。用Save方法保存100,000個記錄集僅用了6秒。用Open方法檢索保存的記錄集對象,從保存的記錄集對象中檢索100,000行用了20秒(與PropertyBag方法的時間一樣)

選擇使用數(shù)組

  持續(xù)的ADO記錄集為在你的應(yīng)用中使用數(shù)組提供了一個好方法。想想,如果你使用起來你就有所有ADO的簡便方法可以使用,象FIND,SORT,F(xiàn)ILTER等等。實(shí)際上,如果你觀察仔細(xì),會發(fā)現(xiàn)我們在上述實(shí)例中用持續(xù)的記錄集實(shí)現(xiàn)了職工記錄的數(shù)組。純理論化的人可能會反對,因?yàn)槟悴坏貌辉谀愕脑O(shè)計(jì)中包含ADO,而這將增加你分布磁盤的大量存儲。

小結(jié)

  在Web類的無狀態(tài)應(yīng)用中組件的可持續(xù)性是非常重要的功能。使用PropertyBag對象保存和檢索屬性。對于記錄集對象分別使用ADO的Save和Open方法保存和檢索數(shù)據(jù)。將上述例子作為摸板,給每一個實(shí)例加上變量文件名就可以制作你自己的組件。