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