在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类将复杂的编程模式转变得更简单,大大地提高了代码的可管理性!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航