一般我们在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方法保存和检索数据。将上述例子作为摸板,给每一个实例加上变量文件名就可以制作你自己的组件。
分享到:
相关推荐
在VB(Visual Basic)环境中制作ASP组件,是利用VB的编程能力来增强ASP的功能,使得开发者能够创建自定义的服务器控件和类库,以满足特定的业务需求。 在VB中制作ASP组件涉及以下几个关键知识点: 1. **ASP基础**...
在ASP源码中,"化境ASP无组件上传类 (啊估修改版) v2.0.zip" 提供了一个无需额外组件即可实现文件上传功能的类库。这个类库是由啊估修改的,可能对原始版本进行了优化或增强了某些特性,以适应更广泛的使用场景。 ...
ASP无组件上传带进度条是一种在ASP(Active Server Pages)环境下实现文件上传并显示上传进度的技术,无需额外的服务器组件。这种技术对于提高用户体验尤其重要,因为它允许用户在上传大文件时了解进度,减少了用户...
ASP无组件上传模块是ASP(Active Server Pages)编程中用于实现文件上传功能的一种技术,它无需额外安装服务器组件,能够简化服务器配置,提高系统资源利用率。以下是对这些上传程序模块的详细解读: 1. ASP+上传...
【描述】"无组件上传带进度条"表明我们要实现的是一个基于ASP的文件上传系统,该系统不仅能够处理文件上传,还能在上传过程中显示进度条,让用户了解文件上传的状态。在ASP中实现进度条显示通常需要JavaScript或者...
1、无组件类的调用方法: Dim Upload set Upload = new AnUpLoad 2、组件的调用方法: Dim Upload Set Upload = server.CreateObject("Anasp.Anupload") 注意:上传属性的设置必须在调用Upload.GetData()之前。 简单...
ASP无组件批量上传技术是一种在ASP(Active Server Pages)环境中实现大文件或多个文件同时上传的方法,无需额外安装服务器上的组件。这种技术对于网站开发者来说非常实用,因为它减少了服务器资源的依赖,提高了...
在ASP中实现文件上传功能,通常需要借助组件,如Upload、CFtp等,但这里提到的是“一个成功的asp无组件上传代码”,意味着它提供了一种无需额外组件的文件上传解决方案。这种技术对于那些不希望或不能安装服务器组件...
ASP无组件上传源码是一种基于ASP(Active Server Pages)技术实现的文件上传功能,无需额外安装服务器组件。在ASP环境中,文件上传功能通常通过HTTP协议的POST方法来实现,允许用户从客户端上传文件到服务器。这种...
在ASP(Active Server Pages)开发中,实现无组件的文件上传并带有进度条功能是一项技术挑战,因为ASP本身并不直接支持这种高级特性。通常,我们需要借助JavaScript、Ajax和服务器端的脚本来完成这一任务。以下将...
ASP无组件上传程序是Web开发中的一个技术主题,主要针对使用Active Server Pages(ASP)语言进行服务器端编程的情况。在ASP环境中,有时需要实现文件上传功能,但并不想或者不能安装额外的组件或控件。这个"asp无...
在ASP中,无组件上传通常是指不依赖第三方组件或控件实现文件上传功能的技术。这种技术对于那些对服务器资源有限或者希望简化部署过程的开发者来说尤其有用。接下来,我们将深入探讨ASP无组件上传的核心知识点及其...
【ASP AJAX无刷新文件上传技术详解】 在网页开发中,用户常常需要进行文件上传操作,传统的文件上传方式通常会伴随着页面的刷新,这不仅影响用户体验,也可能导致数据丢失。为了解决这一问题,ASP(Active Server ...
ASP上传组件是Web开发中的一种工具,主要用于在服务器端处理用户通过浏览器上传的文件。这个组件,如Aspupload2,特别强调了对高版本Internet Explorer(IE)浏览器和谷歌浏览器(Chrome)的支持,这意味着它已经...
**ASP组件介绍** ASP(Active Server Pages)是微软推出的一种服务器端脚本环境,用于创建动态、交互式的Web应用程序。ASP组件则是ASP技术中的一个重要组成部分,它们提供了许多预定义的功能,帮助开发者更高效地...
ASP组件是用于扩展ASP功能的独立可执行模块,它们可以提供如数据库访问、邮件发送、加密解密等功能。在ASP的无组件上传解决方案中,可能是指通过纯ASP脚本来处理文件上传,避免了对额外组件的依赖,使得系统更加轻便...
"化境ASP无组件上传类"可能是一个专为ASP设计的自定义上传类,允许开发者在不依赖任何额外组件的情况下实现文件上传功能。 文件上传在Web应用中很常见,例如用户提交表单时附带文件,如图片、文档等。通常,ASP中...
ASP风声无组件上传类是一种在ASP(Active Server Pages)环境中实现文件上传功能的程序类库,无需安装额外的服务器组件。它具有高效、稳定、兼容性好等优点,适用于那些需要在ASP平台上处理文件上传需求的Web应用...
在ASP源码中,无组件上传类配合Flash实现多文件上传是一种常见的技术,尤其在Web开发早期,这种方式广泛用于提高文件上传的用户体验。在本文中,我们将详细探讨这种技术的原理、实现方式以及其在实际应用中的优缺点...
7. **状态管理**:ASP.NET控件需要处理HTTP无状态性,通过视图状态(ViewState)、隐藏字段或cookie来保存和恢复控件的状态。 8. **调试与测试**:创建自定义控件后,必须对其进行充分的测试,确保它们在不同环境下...