打印本文 打印本文 关闭窗口 关闭窗口
在ASP中用“VBScript5”编写COM组件
作者:武汉SEO闵涛  文章来源:敏韬网  点击数895  更新时间:2009/4/23 10:26:08  文章录入:mintao  责任编辑:mintao
233a  ∫恢币岳次叶枷M赩BScript能加入“类”的功能。终于,在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类提供了privatepublic的范围关键字。

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

下载此处下载本文相关资料。
156

打印本文 打印本文 关闭窗口 关闭窗口