如何制作无状态的ASP组件 (转)

如何制作无状态的ASP组件

  一般我们在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方法保存和检索数据。将上述例子作为摸板,给每一个实例加上变量文件名就可以制作你自己的组件。  
 

时间: 2024-10-21 16:07:53

如何制作无状态的ASP组件 (转)的相关文章

如何制作无状态的ASP组件

2000-08-05· 青苹果电脑工作室·Yesky 一般我们在web或其它有关的无状态应用中使用组件时,脚本运行完毕后我们都会丢失组件的所有参照.当然可以简单地将组件的参照保存在会话(session )变量中,但这浪费资源.更聪明的方法是用会话变量或隐式表单标签保存组件的一些信息.当重新制作组件的实例时,试图用保存在会话变量中的信息恢复组件的状态.但两种方法的弊端都在于:从资源的角度来看过于昂贵,甚至恰好难以实现. 很幸运有个好消息.我们都知道可持续性的整个前提是能够将变量恢复到这样的状态,以

Microsoft的 ASP 组件指南

microsoft 作者:J.D. MeierMicrosoft Corporation2000 年 1 月 24 日 简介 组件.有人喜欢它们,有人则害怕.害怕组件的人通常都能给您讲一个骇人的经历.让我们面对它:当开始在 ASP 下使用组件时,并不知道什么能伤害您.如果您摔倒了,那么站起来,自己拍干净,然后接着来.在这篇文章中,我将提供从实践中获得的一般指南,帮助您建立更好的基于组件的 ASP 解决方案. 为什么使用组件? 在我开始讨论组件指南之前,值得考虑将组件添加到 ASP 应用程序的价值

J2EE探险者: 用于无状态网络的J2EE技术

在最近几年里,Java 行业的发展呈指数级增长.作为一名企业应用程序开发人员.架构设计师或者技术经理,您可以从许多供应商.最佳实践.规范和组件类型中为您的 Java 技术实现进行选择.J2EE 探险者系列的目的是帮助您从这些选择中找到一条途径,对于任何一种给定的情形,协助您挑选合适的技术. 在本文,也就是第 1 部分中,我们将探讨无状态 J2EE 组件,并评估出最合适的组件来用于您的企业体系结构.说到无状态.请求处理组件,可供选择的 J2EE 技术主要有两种:servlet 或 Enterpri

ASP 组件|无组件上传

ASP 组件|无组件上传 最后更新:2006-08-25 21:22 纯Javascript打造的ASP上传组件,支持多文件上传.进度条.数据库存放和文件系统存放 组件下载地址(为方便版本同步,未在此处上传附件): http://www.zope.org/Members/Rimifon/FyUpload.sct(右键下载) 相关说明:有组件上传方式请右键"FyUpload.sct"注册,然后可以使用: Server.CreateObject("Rimifon.Upload&q

【OpenManage大解密】自动更新、无状态计算池配置

拼功能?拼价格?你已经Out啦!不落到企业用户场景里去谈功能的产品,都是耍流氓!今天我们就从戴尔智能管理员OpenManage开始,落到用户三大场景中去解密其用途和价值,且很多功能参数绝对您以前没有听说过!解密,即刻开始!         在<[OpenManage大解密]分钟级部署千台服务器?>中,我们介绍了戴尔iDRAC生命周期控制器和OpenManage Essentials的批量部署这个高级特性,以及"无状态服务器池/非虚拟化服务器可移动性"对云计算IaaS的意义.

HTTP协议是无状态协议,怎么理解

HTTP协议是无状态协议,怎么理解?   Http是一个无状态协议,同一个会话的连续两个请求互相不了解,他们由最新实例化的环境进行解析,除了应用本身可能已经存储在全局对象中的所有信息外,该环境不保存与会话有关的任何信息.  自己的理解,在asp.net里:每次提交服务器的页面没有任何关系,每次记录在页面的信息下次提交是记不住的,(除了应用本身可能已经存储在全局对象中的所有信息外)在.net里实际就是ViewState,ViewState是asp.net中保存页面信息的基本单位,应用时就是保存在控

分布式架构中的 无状态

状态化的判断是指两个来自相同发起者的请求在服务器端是否具备上下文关系.如果是状态化请求,那么服务器端一般都要保存请求的相关信息,每个请求可以默认地使用以前的请求信息.而无状态请求则不行,服务器端所能够处理的过程,他的处理信息必须全部来自于请求所携带的信息以及其他服务器端自身所保存的.并且可以被所有请求所使用的公共信息. 无状态的服务器程序,最著名的就是WEB服务器.状态化的服务器有更广阔的应用范围,比如MSN.网络游戏等服务器.他在服务端维护每个连接的状态信息,服务端在接收到每个连接的发送的请求

深入RESTful无状态原则

前言 在上篇RESTful基础知识中整体的介绍了RESTful架构设计思想的框架,在往后的RESTful主题博文中,我们在这个框架的基础上不断的为其填充更加深入的知识材料.  RESTful基础知识,传送门:http://blog.csdn.net/jmilk/article/details/50452595 无状态原则 Statelessness:无状态原则是RESTful架构设计中一个非常重要的原则,无状态是相对于有状态而言的.在理解什么是无状态的交互请求之前,首先我们需要了解什么是有状态,

手把手教你使用VB来创建ASP组件

创建 一.什么是组件 组件是包含可以更改的数据形式的代码的对象,是可用代码的封装,这些代码可以用来执行应用程序的一些功能,如从数据库中检索某些信息等功能.现在经常听人说起COM,其使它的意思是组件对象模型(Component Object Model),是由微软开发的可以在Windows平台上执行的对象模型,COM定义了组件之间的交互能力.为COM编写的组件可以重复使用,并不依赖于编写所用的语言,比如说,一个组件可以用VB,VC++甚至是Java来编写,总之,只要遵守COM规范就可以了. 二.为