欢迎光临
我们一直在努力

如何制作无状态的ASP组件

建站超值云服务器,限时71元/月

  一般我们在web或其它有关的无状态应用中使用组件时,脚本运行完毕后我们都会丢失组件的所有参照。当然可以简单地将组件的参照保存在会话(session )变量中,但这浪费资源。更聪明的方法是用会话变量或隐式表单标签保存组件的一些信息。当重新制作组件的实例时,试图用保存在会话变量中的信息恢复组件的状态。但两种方法的弊端都在于:从资源的角度来看过于昂贵,甚至恰好难以实现。

  很幸运有个好消息。我们都知道可持续性的整个前提是能够将变量恢复到这样的状态,以至于组件知道在上次的例示中它在哪。这有助于组件现在去做它假定要做的。这个方案的一个典型例子是网页上资料的翻页。当用户点击page down时,我们需要知道我们在前一页的位置。 不把变量保存在内存中(如会话变量),如果我们能将它们保存在文件中,等以后需要时检索不是会很好吗?用基础的数据形式(字符串与数字)保存数据很容易。用对象和数组会怎样呢?对象和数组本质上是存储器中的二进制数据流。如果我们能读这个数据我们就能将它写进文件以便以后的检索。关于对象有个好注意。尽管数组的情况不同。首先你不能用数组做组件的属性(vb6.0)。你可以用他们做变量,但以后你会碰到路障。幸运地是我们为这种情况发现了一个工作区。

  你可以将所有或部分属性保存在一个propertybag对象中。propertybag对象控制在一个对象调用过程中可以保存和恢复的信息。propertybag对象的内容(content)属性提供你任何存在组中的二进制数据流。由你来将这些二进制数据流写进文件中以便日后的检索。

实例:

比如你有一个类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

在客户应用中保存属性

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

  先别激动,你在自己的应用中运行这个酷件之前,必须了解它的局限性。用于保存的时间取决于属性的大小和数据类型。注意大部分时间用在readproperty 和 writeproperty 中。原因很简单,当我们处理象ado记录集这样的结构型数据时,过程可不象拷贝字节流那样简单。数据也得被解释。

保存记录集时我观察到以下情况:

1、保存100,000行每列有25个字符的记录集用了50秒。

2、检索同样的数据用了20秒。

  有个更好的方法保存记录集对象。他们有自己的save方法。用save方法保存100,000个记录集仅用了6秒。用open方法检索保存的记录集对象,从保存的记录集对象中检索100,000行用了20秒(与propertybag方法的时间一样)

选择使用数组

  持续的ado记录集为在你的应用中使用数组提供了一个好方法。想想,如果你使用起来你就有所有ado的简便方法可以使用,象find,sort,filter等等。实际上,如果你观察仔细,会发现我们在上述实例中用持续的记录集实现了职工记录的数组。纯理论化的人可能会反对,因为你不得不在你的设计中包含ado,而这将增加你分布磁盘的大量存储。

小结

  在web类的无状态应用中组件的可持续性是非常重要的功能。使用propertybag对象保存和检索属性。对于记录集对象分别使用ado的save和open方法保存和检索数据。将上述例子作为摸板,给每一个实例加上变量文件名就可以制作你自己的组件。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 如何制作无状态的ASP组件
分享到: 更多 (0)

相关推荐

  • 暂无文章