在Active Server Pages中使用组件

前面的章节介绍了怎样使用Active Server Pages的内置对象,例如Request对象和 Response对象。Active Server Pages组件和这些对象十分近似。不过,组件和Active Server Pages的结合并不十分紧密,只是来扩展内置对象的核心函数。

 

你可以利用你所喜欢的语言,诸如Visual Basic, C++, Java,以及Delphi等等来创建自己的组件。这样做你可以参考本书的第28章。你还可以从第三方公司购买一些现成的组件使用。例如:Software FX公司销售一些可以使你利用Active Server Pages轻松制作图表的组件(参见http://www.softwarefx.com)。最后,微软提供了相当数量的免费的ActiveX组件,你会在这章和下一章来学会一些使用它们的的手段方法。

 

在你使用一个组件之前,你需要首先创建一个它的事例,你可以在任何一个ASP文件中随意的运用内置对象的属性、方法、集合,但是对于组件,你必须在特定范围内创建事例来运用它,下面部分,你会学会怎样在页面,session, application的范围 内创建组件事例。

 

在页面范围内创建组件

很多场合下,你创建的事例实在页面范围内,那么一个组件就只能生存在特定的页面内,这时你不能将这个组件在其他页面中应用,或者去其他页面重新创建,创建这么一种组件,你需要使用Server.CreateObject()方法。

 

注意

为了保险起见,不提倡使用VBScript的CreatObject方法以及JSCript的JSCript的新的CreateObject语句来创建组件事例,这样做会带来意想不到的问题,一般都是使用Active Server Pages的Server.CreateObject()方法。

 

下面是在页面范围内创建一个组件的例子:

 

<%

Set MyBrow=Server.CreateObject(MSWC.BrowserType)

%>

 

这个脚本就创建了一个浏览器能力检测组件的事例,这个事例赋给变量MtBrow。请注意这里面使用了VBScript的Set语句。因为你在对一个组件的事例进行赋值操作,那么这个Set语句就是必不可少的。

 

注意

如果希望对每一个组件的创建都有所了解,那么参见附录A。

这种创建方法和JScript十分类似,不过,在JScript中你必须利用Var语句来进行这种操作。

 

注意

Jscript和VBScript最大的区别是前者区分大小写而后者不是。编写脚本时请特别注意。

 

下面是利用Var语句的例子:

<%

var MyBrow=Server.CreatObject(MSWC.BrowserType)

%>

 

微软提醒您尽量创建页面范围的组件事例,这样对服务器的负担就相对小一些。当页面结束时,该组件事例相应结束,释放所有占用的资源和内存。

 

在Session范围内创建组件事例

在Session范围内进行这种操作有两种方法,一种还是利用Server.CreatObject()方法,和前面一样,见下面的例子:

 

<%

Set Session(MyBrow)=Server.CreateObject(MSWC.BrowserType)

%>

 

这个脚本将浏览器能力检测组件事例赋给了Session变量MtBrow。那么这个变量就可以随着这个用户在每一个页面中使用。你可以将这个脚本放在Global.asa或者其他任何Active Server Pages中。

 

这样创建的缺点是,该对象会立即被创建,即使不去使用,也在白白的占用资源。

幸好,还有一种在Session范围内进行组件创建的方式,你可以在Global.asa中利用微软的<OBJECT>标记进行创建。如下:

 

<OBJECT RunAt=Server SCOPE=Session ID=MyBeow ProGid=MSWC.BrowserType</Object>

 

这个例子中使用了HTML的<OBJECT>标记来创建一个浏览器能力检测组件的事例。其中的SCOPE属性指示该组件将在session范围内进行创建。ID属性为这个事例进行认证以区分于其他事例。这样你就可以在你的脚本中进行引用。PROGID被用来限定组件的注册名。这是Server在进行事例创建时进行认证的依据。这和你用Server.CreateObject()方法时指定的名称是一致的。

 

当你在Global.asa中使用<OBJECT>对象时,你必须把它放在任何一个事件之外,千万不要把它放在某一个事件的脚本程序中。

 

注意

你还可以利用组件注册码来代替注册名,(如果你真的喜欢这样做),这里面需要指定ClassID属性,见下面这个脚本:

<OBJECT RUANT=Server SCOPE=Session ID=MyBrow

CLASSID=0ACE4881-8305-11CF-9427-444553540000></OBJECT>

 

当一个组件以上述两种任何一种方式创建之后,对于这个Session的用户来说就可以在Session结束前在任何界面操作这个事例的方法、熟悉功能、集合。

 

不过,这样对于每一个用户都要创建一个特定的事例,这样在用户较多时对资源的占用就比较可怕了。

 

那么你什么时候需要创建一个Session范围内的组件事例呢?在第21章中,你会学会怎样使用Ad Rotator组件,这种组件用于以不同频率显示不同的广告条,如果你希望在相当多的页面上进行这种选择,那么就需要将Ad Rotator组件事例赋给 Session变量。

 

在Application范围内创建组件

当你在Application范围内创建了组件事例,那么你可以把它当作内置对象进行处理,一旦创建,在任何页面,对于任何用户,使用任何方法、集合以及属性都是可以的。直到这个Application结束(网站服务终止,Global.asa改变,该application卸载)。

 

注意

如果一个application范围的组件被创建,那么它的OnStartPage()和OnEndPage方法就无法调用。也许你在使用时会遇到这个问题。

你可以用和创建一个Session范围的组件十分类似的方法创建一个application范围的组件。第一种自然还是利用Server.CreateObject()方法进行,见下例:

 

<%

Set Application(MyBrow)=Server.CreateObject(MSWC.BrowserType)

%>

 

这里面,浏览器能力检测组件被赋给了一个application变量。你可以把这个脚本放在Global.asa文件的application_OnStart事件中,也可以在你认为合适的页面中进行。在这个组件事例创建成功后,你就完全可以把它当作Active Server Page的内置 对象来处理。

你当然还可以利用HTML的<Object>标记进行这种操作,如下:

 

<OBJECT RUNAT=Server SCOPE=Application ID=MyBrow

PROGID=MSWC.BrowserType></OBJECT>

 

在上面这个例子中,<Object>被用来创建一个application范围的组件事例。其中的SCOPE属性指定了这是一个application范围的事例而不是Session范围。其他的和上一个小节没有什么区别。

 

同样,你可以把<Object>放在Global.asa文件中,不过,再次提醒,千万不要自作聪明的放在任何事件的脚本程序中。

 

什么时候你需要创建一个application范围的组件呢?第17章检测站上用户的那个小节就是个典型的例子,该字典对象的事例用来跟踪所有人的信息,同时覆盖几乎所有页面,因此必须用application范围的变量,否则无法实现。