分享
 
 
 

在ASP中用“VBScript5”编写COM组件

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

在VBScript5.0中,微软加入了强大的类功能。在许多情况下VBScript类使用起来都非常顺手。这个新的特征改变了ASP代码的方式,比如说,到目前为止,我们用VB或者VC++编写组件,并且在ASP页面中使用它们。我们中的大部分人不需要考虑使用面向对象的方法,只需要在ASP页面中编写代码。现在是改变的时候了。

为什么使用VBScript类

在ASP开发中,我们可以有众多的选择去做面向对象的编程,比如VB,VC++,Dephi,等等。但是,对于ASP编程人员来说,面向对象的基于VBSCript的开发确实是一个新颖的方法。在VBScript5和更高版本,微软在脚本语言中加入了类的扩展性。之所以要选择VBScript类方式,以下是几个因素:

简单而且功能强大

当你没有时间去创建、编译和开发COM组件时,使用VBScript类就是很好的替代方法,它能以同样的方式完成同样的工作。

非常适用于商业用途

一个典型的Web N层体系结构如下图所示:

代码的简单性以及易维护性,使得VBScript类对象非常适用于商业用途。比如说,如果你用VB编写了一个商业用途的组件对象,每当商业规则发生变化时,你都必须重新编译、生成并且注册这个组件,而且有时,还需要重新启动Web服务器。

对于用VB编写的商业组件,如果转换为VBScript组件,你就可以随意改变商业规则了。下面让我们比较以下VB组件与VBScript类的优点与不足。

VBScript类与COM组件的比较

VBScript类的优点

1、VBScript类代码容易使用和管理。

2、VBScript类对象是多线程的。

3、无论做任何改变,都不需要重新编译、生成和注册组件。

4、从一个服务器移植ASP应用到另一个服务器非常得简单,这只需要从一个服务器拷贝文件到另一个服务器,而不需要在新的服务器上重新生成并且注册组件。

5、VBScript类对象与ASP页面在同一内存空间运行,有利于应用程序的性能。而MTS中的COM组件是运行在MTS内存池中的。

VBScript类的不足

1、VBScript类是解释执行的。

2、与其他COM组件比较,VBScript类的错误捕捉比较困难。比如说,在VB类组件中,你可以判断错误类型:

....

... If lngQty $#@60; 10 then

Err.Raise VBObjectError + 100,"Method: Check", "Quantity is less than 10."

End if

....

....

3、在VBScript类中,变量类型的种类有限。

4、VBScript类有些局限性,比如:不能存取系统注册表、环境变量、Win32 API等等。

5、在VBScript类中不提供一些用户事件。

6、调试VBScript类有些难度。

7、没有方法管理VBScript类对象的不同版本。

8、VBScript类不具备MTS事物处理模式。

eShop的例子

上面讨论了为什么使用VBScript类,以及使用VBScript类的优缺点。下面举个例子来描述使用VBScript类的优点。

不象VB,VBScript使用“Class......End”语句来分离类内容。与VB一样,对于属性与方法,VBScript类提供了private和public的范围关键字。

下面将调用程序“eShop”,进而执行卖书功能。这里是数据库设计:

注意:在上图数据库结构中,ISBN是做为表tbl_MA_Transaction与tbl_LU_Books的联系关键字,CreditCardID是做为表tbl_MA_Transaction与tbl_LU_CreditCard的联系关键字。

||||||程序设计

在eShop的例子中,用户将选择书籍、数量和信用卡的类型,并输入信用卡号码和邮寄地址。这个应用程序执行3层结构。下面用VB创建一个基于商业层次的组件。

下图是eShop应用的图示:

我知道许多开发者都对商业规则与数据检查感到困惑。在以上eShop的例子中,数据检查包括:用户姓名、地址、所在城市、州以及邮政编码是否为空;进一步检查数量字段是否是一个合法的数字值。

那么什么是商业规则呢?商业规则就是控制商业的条例,比如说:

1、不会出售小于2本数量的书(听上去这很怪,是吗?)

2、eShop例子中只卖书给美国用户

3、根据州与邮政编码计算税金。比如:对于CA洲的用户,征收8.5%的税金。

以上就是商业规则。它们根据数量范围、地理位置控制着商业行为。

VB类的解决方法

让我们在VB类中执行商业规则1和3:

Add a private property

This is a write only property

Property Let Value(vData As Variant)

On Error GoTo ErrHand

If IsArray(vData) = False Then

Err.Raise 8000, "Property: Value", "Invalid data. An array is expected!"

GoTo CleanExit

ElseIf UBound(vData) $#@60;= 10 Then

Err.Raise 8000, "Property: Value", "Invalid data. An 10 elements array is expected!"

GoTo CleanExit

Else

mvarISBN = vData(CnIsbn)

...

...

mvarZip = vData(CnZip)

End If

CleanExit:

Exit Property

ErrHand:

Err.Raise Err.Number, "Property: Value, " & Err.Source, Err.Description

Exit Property

End Property

Add the Business rule checking Method

Public Function Check(vData As Variant) As Boolean

On Error GoTo ErrHand

Check = False

Assign the values to the property

Value = vData

mvarSalesTax = 0

Check the business rules

If mvarQty $#@60; 2 Then

Err.Raise 8000, "Method: Check", "Our minimum selling quantity is 2."

GoTo CleanExit

ElseIf UCase(mvarState) = "CA" Then

mvarSalesTax = 8.5

End If

Call the Data layer components to

insert the data into the database.

...

...

...

Check = True

CleanExit:

Exit Function

ErrHand:

Err.Raise Err.Number, "Method: Check, " & Err.Source, Err.Description

Exit Function

End Function

||||||在ASP中调用VB组件对象

下面是调用VB组件的ASP代码:

$#@60;%

Dim objBus

Dim blnRtnValue

Dim ErrNo

On error resume next

Set objBus = CreateObject("TheeShop.BU_eShop")

BlnRtnValue = ObjBus.Check(Array(...))

if err.number $#@60;$#@62; 0 then

ErrNo = err.number

If ErrNo = 8000 then

Do something

elseif ErrNo = 8001 the

Do something

end if

end if

If BlnRtnValue = True then

Response.Write "You order was successful!"

End if

Set objBus = Nothing

%$#@62;

完成了测试后,就需要编译并生成组件,安装在服务器上。有时候,需要重新启动服务器才能让组件生效。

一个较好的解决办法

在动态的商业世界中,你不可能真正地预见商业规则。比如,在一个晴朗日子的早上,你的公司就可能改变一下政策。管理者可能让你修改代码,从而允许最小购书量从2减少到1,或者,政府提高货减少了税率。遇到这种情况,你就必须要修改VB组件,重新编译,重新启动服务器,重新注册新的组件。这将花费很多时间与精力!

在数字化的世界中重新启动服务器是不容易的。随时都会有用户访问你的站点,所以你要找到一个访问者最少的时间去做重新启动的工作。而且,你不能确定还要修改多少次商业规则,所以可能重复地做着上述工作。

但是,使用VBScript类就是一个较好的解决办法。当你用VBScript类开发商业组件时,改变和更新这些规则都是很简单的,这就象编辑ASP页面一样。与VB组件比较,改变商业规则后的组件更新,使用VBScript类,需要更少的时间。

VBScript类代码

下面来看看VBScript类的例子。在VBScript类中,商业规则的执行将改变一些。我们将用一个叫做Check的public方法创建商业组件对象,这个方法接受2个参数:Quantity 和 State。如果商业行为失败,方法返回-9。成功的话,就返回税率百分比。

$#@60;%

Class BU_eShop

****************************************

Declare private class variables.

****************************************

Private mvarSalesTax

****************************************

Define class methods.

****************************************

Function Check(vQty, vState)

On error resume next

Check = -9 Return Failed

mvarSalesTax = 8.5

If Cint(vQty) $#@60; 2 then

Exit Function

Elseif ucase(vState) = "CA" then

Check = mvarSalesTax

Else

Check = 0

End if

End Function

End Class

%$#@62;

注意:将VBScript类保存在一个单独的include文件中,是一个好的编程思路。以上的例子就是保存在Bu_eShop.inc中。

在ASP中调用VBScript对象组件

下面是在ASP调用VBScript商业组件对象的代码:

$#@60;!-- #include file="Bu_eShop.inc" --$#@62;

$#@60;%

Dim objBus

Dim objData

Dim RtnData

Set objBus = New BU_eShop

RtnData = ObjBus.Check(vQty, vState)

If RtnData = -9 then

Response.Write "$#@60;H4$#@62;Sorry!, the business rule failed$#@60;/H4$#@62;$#@60;BR$#@62;"

End if

Then call the Data conponent with the data and Sales Tax information.

...

...

Set objData = Nothing

Set ObjBus = Nothing

%$#@62;

总结

VBScript类的功能非常强大,而且简单易用,它们给ASP应用开发带来了一些新鲜的感觉。而且,VBScript类将复杂的编程模式转变得更简单,大大地提高了代码的可管理性!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有