1.3 ASP Server对象
正像在前面看到的那样,通过服务器端包含的经ISAPI访问Web服务器的页面,用传统动态页面指令和命令可以做相当多的事情。但同时也有一些明显的限制。
例如,可以从Request.ServerVariables集合检索到所有随同客户端的请求发送过来的HTTP报头的值。它几乎可以与使用SSI #echo匹敌,同时具备的主要优点是把这些值作为字符串返回到代码中(而#echo指令简单地把这些值插入到页面中),因此可以根据自己的愿望来检索和维护这些字符串。许多相同的参数应用于#fsize和#flastmod指令,使用带有VBScript和JScript脚本引擎中的对象的脚本,同样也可以容易地获取这个信息。在后续章节你将看到相关的细节。
#exec指令既非常有用,又受到一定的限制。实际上该指令仅运行系统命令或定制的CGI应用程序,并不能给脚本提供真正的对进程的控制。ASP Server对象提供了一种全新的方法,与#exec指令相比,能够更安全和更容易地运行其他的应用程序或组件。当然,对于一些情况,尤其是在确实需要执行一个操作系统命令或一个原有的CGI应用程序的地方,#exec是无法替代的。
为了研究Server对象,先概要介绍其所有可用的方法和属性,然后再进一步详细地进行讨论。
4.3.1 ASP Server对象成员概述
Server对象是专为处理服务器上的特定任务而设计的,特别是与服务器的环境和处理活动有关的任务。因此提供信息的属性只有一个,却有七种方法用来以服务器特定的方法格式化数据、管理其他网页的执行、管理外部对象和组件的执行以及处理错误。
1. Server对象的属性
Server对象的唯一一个属性用于访问一个正在执行的ASP网页的脚本超时值,如表4-2所示:
表4-2 Server对象的属性及说明
特 性
说 明
ScriptTimeout
整型。缺省值为90。
设置或返回页面的脚本在服务器退出执行和报告一个错误之前可以执行的时间(秒数)。达到该值后将自动停止页面的执行,并从内存中删除包含可能进入死循环的错误的页面或者是那些长时间等待其他资源的网页。这会防止服务器因存在错误的页面而过载。对于运行时间较长的页面需要增大这个值
2. Server对象的方法
Server对象的方法用于格式化数据、管理网页执行和创建其他对象实例,如表4-3所示。
表4-3 Server对象的方法及说明
方 法
说 明
CreateObject(“identifier”)
创建由identifier标识的对象(一个组件、应用程序或脚本对象)的一个实例,返回可以在代码中使用的一个引用。可以用于一个虚拟应用程序(global.asa页)创建会话层或应用程序层范围内的对象。该对象可以用其ClassID来标识,如“{clsid: BD96C556-65A3…37A9}”或一个ProgID串来标识,如“ADODB.Connection”
Execute(“url”)
停止当前页面的执行,把控制转到在url中指定的网页。用户的当前环境(即会话状态和当前事务状态)也传递到新的网页。在该页面执行完成后,控制传递回原先的页面,并继续执行Execute方法后面的语句
GetLastError()
返回ASP ASPError对象的一个引用,这个对象包含该页面在ASP处理过程中发生的最近一次错误的详细数据。这些由ASPError对象给出的信息包含文件名、行号、错误代码等等
HTMLEncode(“string”)
返回一个字符串,该串是输入值string的拷贝,但去掉了所有非法的HTML字符,如<、>、&和双引号,并转换为等价的HTML条目,即<、’>’、’&’、’"’等等
MapPath(“url”)
返回在url中指定的文件或资源的完整物理路径和文件名
Transfer(“url”)
停止当前页面的执行,把控制转到url中指定的页面。用户的当前环境(即会话状态和当前事务状态)也传递到新的页面。与Execute方法不同,当新页面执行完成时,不回到原来的页面,而是结束执行过程
URLEncode(“string”)
返回一个字符串,该串是输入值string的拷贝,但是在URL中无效的所有字符,如?、&和空格,都转换为等价的URL条目,即%3F、%26和+
4.3.2 创建其他对象的实例
在前一章中,讨论了ASP的虚拟应用程序概念,了解了虚拟应用程序通过Application Protection设置为ASP网页中的组件和其他对象提供进程隔离。这延续了第1章的讨论,即ASP的ObjectContext对象如何为ASP网页提供运行环境,以及如何使用在相同的环境中运行的其他组件和对象。
ASP Server对象提供创建这些组件和应用程序实例的功能,因此可用来扩充ASP脚本的能力。通过实现CreateObject方法的一个特定版本来实现这个功能。
1. 在VBScript和JScript中创建对象实例
在VB或VBA中,可使用多种方法创建对象的实例。可以使用New关键字来创建指定类型的一个新对象:
Dim objNewObject As New MyComponent
然而,不能在ASP中用VBScript或JScript这么做,因为这些脚本引擎不能实现数据类型定义。不能声明一个变量为任意指定的数据类型,其变量都是Variants类型,或一个等价的类型(根据使用的脚本语言而定)。
在VB和VBA中另一个方法是使用CreateObject或GetObject方法。CreateObject方法的参数是一个ClassID(通常情况)或一个ProgID字符串,它返回相应类型的一个新对象:
Set objNewObject = CreateObject(“ADODB.Connection”)
当拥有一个指定的文档类型,并且想创建一个可以处理这种文档的对象实例时,通常使用GetObject方法:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”)
也可以指定所需要的对象类型和文件名,在几种对象都能处理该文档类型的情况下,这种做法是非常有用的:
Set objExcel = GetObject(“C:\myfiles\sales.xlw”,”Excel.Application”)
VBScript支持CreateObject和GetObject方法。JScript也有getObject方法,与VBScript中的GetObject工作方式相同。JScript中的ActiveXObject实现了与VBScript的CreateObject方法相同的功能。但这个函数常与JScript的new运算符协同使用:
ObjNewObject = new ActiveXObject(“This.object”);
除了VB的NEW关键字在VBScript和JScript中不予支持以外,能够使用所有这些技术在一个ASP网页中创建对象的实例。然而,能够并不意味着应该,而且大多数情况下不应该在一个ASP网页中使用脚本引擎的对象创建函数。
2. 在ASP网页中创建对象实例
为了理解一般的脚本引擎对象创建方法为什么在ASP网页中使用效果不理想,需进一步对ASP中的环境和ObjectContext对象进行讨论。
使用脚本引擎的一般方法在一个ASP网页中创建一个对象实例时,该对象在当前执行的页面的环境中并未实例化。得不到ObjectContext对象的引用,所以不能使用该对象来访问页面的环境,即不能访问该页面环境中的值。
这意味着该对象不能使用内置的ASP对象,即不能够访问在Request、Response、Application和Session对象的集合中的值,也不能使用内置的ASP对象提供的方法和属性。该对象也不能够与此环境中任何现有的事务进行交互。如果发生错误,不能使用ObjectContext方法放弃一个事务。
当然,你可能不想与该网页的环境进行交互。但是有其他的理由说明使用一般的对象创建方法通常是不明智的。IIS自动地在COM+运行期包装程序hllhost.dll中实例化对象,使得该对象可以在当前的虚拟应用程序中完全地共享和重新使用(缺省的Web网站本身是一个虚拟的应用)。
你在上一章所看到的对一个虚拟应用程序的设置,既允许在Web服务器的内存空间中创建对象,也可以在共享的或独立的进程外DLLHost.dll实例中创建对象。如果使用一般的脚本引擎对象创建方法,将绕过所有的组件隔离和可扩展特性。而在使用ASP Server对象的CreateObject方法时会自动地提供这些特性。
3. Server对象的CreateObject方法
为了试验CreateObject方法,打开示例的Chapter04主菜单页,单击“Using the ASP Server Object”链接
这个链接打开一个名为show_server.asp的网页,该页面可以用来试验所有的Server对象的方法。它同时也显示Server对象唯一的属性ScriptTimeout的值、其缺省值是90秒
在该页面的“Create an Instance of a Component”区域,有一个文本框,可以在其中键入想要在该网页的环境中创建的对象的ProgID字符串,甚至可以键入一个ClassID数值。这里文本框的缺省值已经设置为一个来自ActiveX数据对象库的公用对象的ProgID:ADODB.Connection。
单击“Server.CreateObject”选项旁的按钮,把该页面提交给其自身,因为所有的控件都在一个带有ACTION属性的<FORM>上,而这个ACTION属性被设置为这个网页的路径和文件名:
…
FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
<P><DIV CLASS="subhead">Create an Instance of a Component</DIV>
<INPUT TYPE="SUBMIT" NAME="cmdCreateObject" VALUE=" ">
Server.CreateObject ("
<INPUT TYPE="TEXT" NAME="txtProgID" SIZE="25" VALUE="ADODB.Connection">
")<P>
…
</FORM>
…
当该页面重新载入时,该页中的一段ASP代码(位于<FORM>段的前面)将查看提交该窗体时,单击了哪个按钮。如果是名称为“cmdCreateObject”的按钮时,该代码将读取文本框中的ProgID字符串。为防止用户输入的ProgID无效而导致执行中止,关闭缺省的脚本错误处理,再尝试使用Server.CreateObject方法创建一个对象的实例。最后,再重新打开缺省的错误处理,通过使用IsObject函数检查是否创建了一个对象实例,并显示一个相应的信息:
QUOT = Chr(34) 'double-quote character
…
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdCreateObject")) Then
strProgID = Request.Form("txtProgID")
On Error Resume Next
Set objObject = Server.CreateObject(strProgID)
On Error Goto 0
If IsObject(objObject) Then
Response.Write "<B>Results:</B><BR>Sucessfully created object with ProgID of <B>" _
& QUOT & strProgID & QUOT & "</B><HR>"
Else
Response.Write "<B>Results:</B><BR>Failed to create object with ProgID of <B>" _
& QUOT & strProgID & QUOT & "</B><HR>"
End If
End If
…
所示的是创建ADODB.Connection对象的结果。可以看到该对象已被正常实例化,已可以在代码中使用。
本章不讨论如何使用这些对象,你可能已经对此很熟悉了。一旦创建了对象实例,就可以像在任何其他情况中一样使用它。调用对象的方法,读取或设置属性,与使用VB时一样;或者用浏览器中客户端的VBScript、JScript使用它。
在接下来的章节中将对对象和组件的使用进行更加详细的介绍。我们将研究由脚本引擎实现的一些对象,以及IIS 5.0/ASP 3.0中的可安装组件,还有一些其他的免费或商用的组件,并讨论在各种情况下如何选择相应的组件。在本书的后面,甚至会说明创建自己的能够在ASP中使用的组件是非常简单的。