在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范围的变量，否则无法实现。