本章介绍ASP开发中常用到的一些基本知识,包括对7个ASP内置对象的介绍,以及在它们的使用过程中应当注意的问题,使用ADO连接数据库的基础知识以及ADO连接不同数据库的方法,常用SQL语句的使用方法,最后给出了在开发中常用的一些模块,使用这些模块可以大大增强程序功能和加快开发速度。本章作为开发ASP时的一个参考,目的是提供一些比较全面和系统的知识,以便读者在开发时可以随时查阅。
ASP内置对象是ASP的核心,ASP的主要功能都建立在些内置对象的基础之上。关于ASP内置对象的介绍有很多资料,下面仅就与开发关系最密切的知识做一重点介绍,并对在使用过程中容易出错的知识点给出详细的解释和说明。读者在开发时,最方便的参考资料还是IIS自带的文档或MSDN,因为来自那里的信息才最权威,最真实。
下面分别介绍在IIS 5.1的文档中,提到的ASP的7个内置对象的功能。
可以使用 Application 对象在应用程序的所有访问者间共享信息,此处的应用程序与在IIS中所创建的一个应用程序所对应(如何创建应用程序请参见第1章)。
可以使用 Request 对象来获取客户端传来的任何信息。包括通过 POST 方法或 GET 方法、cookies 以及客户端证书从 HTML 表单传递的参数。通过 Request 对象也可以访问发送到服务器的二进制数据,如文件上载。
可以使用 Response 对象来控制发送给客户端的信息。这包括直接发送信息到浏览器、重定向浏览器到其他URL或设置cookie值。
通过Server对象可以访问服务器上的方法和属性。最常用的方法就是用来创建COM组件的Server.CreateObject方法。其他方法可对字符串应用URL或HTML编码、将虚拟目录映射到物理路径,以及设置脚本超时期间等。
可以使用Session对象来存储特定会话(Session)所需的信息,当一个客户端访问服务器时,就会建立一个会话。当用户在应用程序不同页面间跳转时,不会丢弃存储在 Session 对象中的变量,这些变量在用户访问应用程序页的整个期间都会保留。可以使用 Session 对象来显式结束会话并设置闲置会话的超时时限。
准确地说,是服务器会对每一个独立的浏览器建立一个会话,当你分别启动两个浏览器访问同一网址时,就会在服务器端创建两个不同的会话,但使用window.open等方法新开的浏览器子窗口与其父窗口共享一个会话。 |
可以使用ObjectContext对象来提交或中止由ASP脚本启动的事务。
可以使用 ASPError 对象来捕捉 ASP 错误并向用户返回详细的信息描述。
下面分别介绍每个对象的成员及其使用方法。
[NextPage]
Application对象通常用来实现以下功能。
l 存储应用程序级全局变量。
l 锁定与解锁全局变量。
l 网站计数器。
下面来看实现这些功能的具体方法。
Application对象包含的集合、方法和事件见表2-1。
表2-1 Application对象包含的集合、方法和事件
类 型 |
名 称 |
说 明 |
集合 |
Contents |
没有使用<OBJECT>元素定义的存储于Application 对象中的所有变量的集合。可以省略Contents直接访问,如:Application("NumVisits") |
StaticObjects |
使用<OBJECT>元素定义的存储于Application对象中的所有变量的集合 | |
方法 |
Contents.Remove |
通过传入变量名来删除指定的存储于Contents中的变量 |
Contents.RemoveAll |
删除全部存于Contents中的变量 | |
Lock |
锁定在Application中存储的变量,不允许其他客户端修改,调用Unlock或本页面执行完毕后解锁 | |
Unlock |
手动解除对Application变量的锁定 | |
事件 |
Application_OnStart |
声明于global.asa中,应用程序首次执行时触发 |
Application_OnEnd |
声明于global.asa中,应用程序结束时触发 |
(1)在Application对象中存储对象时,仍要用Set关键字,使用时可以直接用Application对象调用其方法。如: Set Application("myObj") = Server.CreateObject("MyComponent") Application("myObj").myMethod (2)调用Lock方法的效果是累计的,即调用几次Lock方法,需要对应调用几次Unlock方法来解锁,如果调用UnLock方法次数小于Lock方法次数,则存储于Application对象中的变量仍处于锁定状态,当然,当此页面执行完毕后,会自行解锁。 |
Application对象的应用比较简单,在程序设计时使用得也相对比较少,关于它的使用方法参见例程2-1。
例程2-1 Application对象的使用范例
<%
'在Application对象中存储字符串和数字
Application("greeting") = "Welcome to My Web World!"
Application("num") = 25
'在Application对象中存储数组及使用方法
Dim MyArray(5)
MyArray(0) = "hello"
MyArray(1) = "some other string"
Application("StoredArray") = MyArray
'使用数组,需要先取出来后,再用下标引用
LocalArray = Application("StoredArray")
LocalArray(1) = " there"
'在Application中存储对象(MyComponent对象为虚构对象)
Set Application("myObj") = Server.CreateObject("MyComponent")
'直接用Application对象调用某一对象的方法
Application("myObj").myMethod
'取出对象后再调用其方法
Set MyLocalObj = Application("myObj")
MyLocalObj.myMethod
'对Application中变量的锁定与解锁
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application("datLastVisited") = Now()
Application.Unlock
%>
Application对象虽然使用简单,但在使用时,仍要注意一些常犯的错误,下面列举几种比较典型的错误使用方法。
如下语句是错误的:
<%
Set Application("var1") = Session
Set Application("var2") = Request
……
%>
如下语句是错误的:
<% Application("StoredArray")(3) = "new value" %>
在没有讲ADO的使用时,谈这个似乎有些过早,而且这样做也不会导致编译和执行错误,但却对数据库操作的效率有十分有害的影响。因为让多个客户端共用一个数据库连接,固然节省了资源,但当用户数稍多之后数据库连接必然会成为整个应用程序的瓶颈,比较好的解决办法是使用数据库连接池来实现,详细方法参见关于ADO的介绍和对数据库连接优化的部分。
[NextPage]
Request对象通常用来实现以下功能。
l 读取网址参数。
l 读取表单传递的数据。
l 读取Cookie的数据。
l 读取服务器环境变量。
l 上传文件。
下面来看实现这些功能的具体方法。
Request对象包含的集合、属性和方法见表2-2。
表2-2 Request对象包含的集合、属性和方法
|
类 型 |
名 称 |
说 明 |
|
集合 |
ClientCertificate |
客户证书集合 |
|
Cookies |
客户发送的所有Cookies值的集合 | |
|
Form |
客户提交的表单(Form)元素的值,变量名与表单中元素的name属性一致 | |
|
QueryString |
URL参数中的值,如果Form的Method属性设为“GET”,则会把所有的Form元素名称和值自动添加到URL参数中 | |
|
ServerVariables |
预定义的服务器变量 | |
|
属性 |
TotalBytes |
客户端发送的HTTP请求中Body部分的总字节数 |
方法 |
BinaryRead(count) |
从客户端提交的数据中获取count字节的数据,返回一个无符号型的数组 | |
(1)如果要查询的变量在以上5个集合中都不存在,则返回空(EMPTY)。 (2)在以上5个集合中查找变量值时,虽然可以省略集合名,直接用Request(variable)来获取变量值,但MS以及其他专业人士强烈反对这种做法,因为这会使查询效率降低,而且会由于变量重名而带来让人费神的逻辑错误,建议在查询时指明集合名称。例如: 推荐: Request.Form ("username") 反对: Request.(" username") 如果非要使用省略集合名称的方法,当一个变量在不止一个集合中存在时,那么服务器要找到并返回这个变量就要在全部集合中检索,对于集合的自动检索顺序是: l QueryString l Form l Cookies l ClientCertificate l ServerVariables (3)使用Request.Form时有两个局限性:其一是只能接收小数据量的数据,具体为当由Form提交的数据字节数大于100KB时,便无法使用Request.Form了;其二是Request.Form与Request.BinaryRead不能同时使用,否则会发生错误。 |
关于Reguest对象的使用方法参见例程2-2。
例程2-2 Reguest对象的使用范例
<%
'使用ClientCertificate的范例,注:由于ClientCertificate使用较少,
'而且内容比较烦琐,在此只做简单介绍,读者可以参考IIS 5.1文档,查看其具体用法
strIssuer = Request.ClientCertificate("Issuer")
strSubject = Request.ClientCertificate("Subject")
'Cookeis的简单使用方法
strMyCookie = Request.Cookies("myCookie")
'例如对这样的URL:http://localhost/login.ASP?username=admin&key=AKgHmOLU
'使用Request.QueryString方法
strUserName = Request.QueryString("username")
strKey = Request.QueryString("key")
'例如对这样的URL:http://localhost/login.ASP,该URL没有参数
'使用Request.Form方法
strUserName = Request.Form("username")
strPassword = Request.Form("password")
strKey = Request.Form("key")
'Request.ServerVariables的参数有几十个服务器环境变量可以使用,
'下面用REMOTE_ADDR来获得客户端的IP
strIP = Request.ServerVariables(REMOTE_ADDR)
%>
Request对象使用时一般出现语法性错误的情况比较少,更多的情况是如何合理使用它来提高应用程序效率。在MSDN中的一篇名为“25+ ASP Tips to Improve Performance and Style”的文章中,给出了28条优化ASP性能的建议,其中有一条是关于Request对象优化的,大致思想如下。
(1)尽量不要使用服务器变量。
访问服务器变量会使 Web 站点向服务器发出一个特殊请求,并收集所有服务器变量,而不只是所请求的那个变量。所以第一次请求服务器变量时,就会使性能受到影响。后面再对其他服务器变量的请求,则不会对性能产生影响。
(2)避免使用非限定的Request对象。
这个前面已经提到,建议使用集合名称来查询对象,而不要使用类似Request("Data")的形式。
[NextPage]
Response对象通常用来实现以下功能。
l 输出内容到网页(客户端)。
l 网页重定向(尽量使用Server.Transfer代替它)。
l 写入Cookie。
l 下载文件。
下面来看实现这些功能的具体方法。
Response对象包含的集合、属性和方法见表2-3。
表2-3 Response对象包含的集合、属性和方法
类 型 |
名 称 |
说 明 |
集合 |
Cookies |
设置客户端Cookie的值,如果指定名称不存在,则创建之,如果存在,则更新它的值 |
(续表)
类 型 |
名 称 |
说 明 |
属性 |
Buffer |
是否启用缓存,此句必须放在ASP文件的第一行。启用Buffer之后,只有所有脚本执行完毕后才会向客户端输出 |
CacheControl |
设置代理服务器是否可以缓存ASP,以及缓存的级别 | |
Charset |
设置字符集,如简体中文为“gb2312”,与在网页中的meta段写charset=gb2312具有相同作用 | |
CodePage |
表示消息正文所使用的代码页,例如简体中文是936 | |
ContentType |
设置HTTP内容类型,如“text/html” | |
Expires |
设置或返回一个页面缓存在浏览器中的有效时限,以分钟计算 | |
ExpiresAbsolute |
设置页面缓存在浏览器中到期的绝对时间 | |
IsClientConnected |
判断客户端是否已经断开连接 | |
LCID |
设定或获取日期、时间或货币的显示格式 | |
Status |
设置服务器的返回状态,以一个三位数加简要说明的格式, 如Response.Status = "401 Unauthorized" | |
方法 |
AddHeader(HeaderName, HeaderValue) |
向HTTP头中加入额外的信息,其中HeaderName可以重复,信息一但加入,无法删除 |
AppendToLog |
向Web 服务器手动加入一条日志 | |
BinaryWrite |
向HTTP输出流中写入不经过任何字符转换的数据,用于各客户端传送图片或下载文件 | |
Clear |
清空缓存 | |
End |
停止处理ASP文件,直接向客户端输入现在的结果 | |
Flush |
向客户端立即发送缓存中的内容 | |
Redirect |
向浏览器发送一个重定向的消息,浏览器接收到此消息后重定向到指定页 | |
Write |
向HTTP输出流中写入一个字符串 |
(1)为让网站国际化,建议显式设置Codepage属性。系统查找CodePage的顺序是: l Response.CodePage。 l Session.CodePage。 l 页面@CodePage指令。 l 虚拟目录设置Metabase属性AspCodePage。 l 以上都没有设置时,取默认值ANSI。 (2)在调用Response.End时,会自动调用Response.Flush,将缓存中现有内容向客户端发送,如果不希望这样做,可以先调用Response.Clear清空缓存。 (3)注意Response.Redirect只是向浏览器发送一个重定向的消息,浏览器根据消息中的URL再次向服务器发出新的请求,因此浏览器与服务器之间存在两次往返,降低了效率并加长了用户的等待时间,建议使用Server.Transfer,它的功能是直接将处理移交到另一页,而不需要浏览器再次发送请求。 |
Response对象的属性和方法较多,但最常使用的却比较集中,下面仅就其中使用率最高的几个属性和方法做简要示范,如例程2-3所示。
例程2-3 Response对象的使用范例
<%
'使用缓存
Response.Buffer = True
'设置字符集
Response.CharSet = "gb2312"
'设置代码页
Response.CodePage = 936
'设置文档类型
Response.ContentType = "text/HTML"
'设置缓存过期时间,如果设为-1,则立即过期
Response.Expires = -1
'用IsClientConnected判断客户端是否仍连接
If Response.IsClientConnected Then
'获取SessionID
SessionID = Session.SessionID
Response.Write "SessionID=" & SessionID & "<br>"
End If
'向客户端输入信息
Response.Write "这是一个演示Respose对象用法的例程式"
'注意:启用下面两句后客户端将得不到任何信息
'Response.Clear()
'Response.End()
%>
Response对象的属性和方法虽然很多,但在使用时一般不容易出错,而涉及更多的是如何优化的问题。下面就初学者常犯的错误与注意事项加以说明,详细的优化方法请参考本书第3章“创建高性能的ASP应用程序”中的内容。
(1)在向客户端输出部分内容后不能再调用Response.Redirect方法。
在IIS 5.0中虽然默认缓冲是打开的,但如果在这之前执行了Response. Buffer =False或Response.Flush语句之后,再调用Response.Redirect方法,将会出错,因为Response.Flush会将缓冲中的现有数据向客户端输出。
(2)当输出较多时,适时使用Flush方法。
因为虽然缓冲可以在整体上加快ASP处理速度,但在缓冲内容输出之前,也会造成客户端没有任何迹象的等待,当输出内容较多时此问题尤为严重,所以在适当的时候向客户端输出一些内容是有必要的。
(3)尽可能使用Server.Transfer代替Response.Redirect。
这个原因前面已经说过了,请参见Response对象。
(4)使用CodePage使你的网站走向国际化。
[NextPage]
Server对象通常用来实现以下功能。
l 创建组件实例。
l 获取服务器的物理路径。
l 对字符串进行HTML编码。
l 转向执行其他ASP文件。
下面来看实现这些功能的具体方法。Server对象包含的属性和方法见表2-4。
表2-4 Server对象包含的属性和方法
类 型 |
名 称 |
说 明 |
属性 |
ScriptTimeout |
设置脚本超时。当一个ASP页面在一个脚本超时期限之内仍没有执行完毕,ASP将终止执行并显示超时错误 |
方法 |
CreateObject |
创建一个服务器组件的实例,如果此组件中实现了OnStartPage 和 OnEndPage方法,那么在调用CreateObject创建实例时将会执行OnStartPage方法 |
Execute |
用来执行一个ASP文件,被执行的ASP文件被看做是当前调用Execute方法的ASP文件的一部分 | |
GetLastError |
返回一个ASPError对象,用来描述错误的详细信息。值得注意的是,必须向客户端发送一些数据后这个方法才会起作用 | |
HTMLEncode |
将输入的HTML字符串换为HTML编码,如输入“<p>”,输出“<P>” | |
MapPath |
将虚拟路径映射为绝对路径。如使用Access数据库时,为防止下载,将其放在站点应用程序之外,然后通过此方法找到数据库在服务器上的绝对路径 | |
Transfer |
停止执行此ASP文件,转向执行另外一个ASP文件。如想用此方法代替Response.Redirect方法,需要在调用Transfer方法前调用Response.Clear清空缓存 | |
URLEncode |
将输入的字符串进行URL编码,如输入“http://www.trfsoft.com”,输出“http%3A%2F%2Fwww%2Etrfsoft%2Ecom” |
(1)Execute和Transfer方法都不会清空当前页面向缓冲输出的内容而直接转向执行另一页,不同的是,Execute执行完后会返回继续执行下面的语句,而Transfer会完全放弃它下面的语句。 (2)这里最常用的是CreateObject和MapPath两个方法。 |
Session对象通常用来实现以下功能。
l 存储与某次访问相关的信息。
l 设置这个访问的代码页,日期格式等。
l 处理访问开始与结束事件。
下面来看实现这些功能的具体方法。Session对象包含的集合、属性、方法和事件见表2-5。
表2-5 Session对象包含的集合、属性、方法和事件
类 型 |
名 称 |
说 明 |
集合 |
Contents |
使用脚本命令(赋值语句)向Session中存储的数据,可以省略Contents而直接访问,如:Session("var") |
StaticObjects |
使用<OBJECT>标记定义的存储于Session对象中的变量集合。运行期间不能删除 | |
属性 |
CodePage |
设置当前Session的代码页,参见Response对象的CodePage属性 |
LCID |
设定当前Session的日期、时间或货币的显示格式,参见Response的LCID属性 | |
SessionID |
返回Session的唯一标识 | |
Timeout |
设置Session的超时时间,以分钟为单位,在IIS中默认设置为20分钟 | |
方法 |
Abandon |
当ASP文件执行完毕时释放Session中存储的所有变量,当下次访问时,会重新启动一个Session对象。如果不显式调用此方法,只有当Session超时时才会自动释放Session中的变量 |
Contents.Remove |
删除Contents集合中的指定变量 | |
Contents.RemoveAll |
删除Contents集合中的全部变量 | |
事件 |
Session_OnEnd |
声明于global.asa中,客户端首次访问时或调用Abandon后触发 |
Session_OnStart |
声明于global.asa中,Session超时或者调用Abandon后触发 |
(1)Session.Abandon调用后,在本ASP页内存储于Session中的变量仍可以使用,直到下一次请求,即访问下一个ASP页面时才会生效,此时SessionID值已改变,并且会再次执行Session_OnStart过程。在Session.Abandon后调用Server.Execute和Server.Transfer时,由于是发生在同一次请求中,所以Session中的变量仍有效。 (2)Contents.RemoveAll方法用于删除Contents集合中的全部变量,它的作用效果是即时的,并且不会放弃(Abandon)当前Session对象,即下次请求时SessionID不变。 (3)Session对象常使用的是变量的存取,如Session("UserName") = strName。 |
ObjectContext对象通常用来实现以下功能。
l 放弃一个事务。
l 接受一个事务。
下面来看实现这些功能的具体方法。ObjectContext对象包含的方法和事件见表2-6。
表2-6 ObjectContext对象包含的方法和事件
类 型 |
名 称 |
说 明 |
方法 |
SetAbort |
放弃当前事务 |
SetComplete |
此方法只是说明可以接受此事务,不必放弃,并不是立刻接受此事务。只有当前文件执行完毕,或者所有参与此事务的组件都调用SetComplete,才接受此事务 | |
事件 |
OnTransactionAbort |
放弃此事务时触发此过程 |
OnTransactionCommit |
接受此事务时触发此过程 |
(1)某个ASP页面欲使用这种事务机制,或者说要使用ObjectContext,需要在文件的开头加上<%@ Transaction = Required %>。 (2)只要调用一次ObjectContext.SetAbort,就可以放弃此事务。 (3)一般不用显式调用SetComplete,因为ASP默认是如果没有调用SetAbort,则执行完此ASP文件即接受事务。 (4)OnTransactionAbort过程与OnTransactionCommit过程要与上述事务放在同一个文件中。 |
ASPError对象通常用来实现以下功能:
处理ASP应用的错误。
下面来看实现这个功能的具体方法。ASPError对象包含的属性见表2-7。
表2-7 ASPError对象包含的属性
类 型 |
名 称 |
说 明 |
属性 |
ASPCode |
返回错误代码 |
Number |
返回COM标准的错误代码 | |
Source |
返回错误的源代码,如果可以的话,还会返回它所在的行号 | |
Category |
返回一个字符串,用于表明错误类型,如是IIS错误、脚本错误还是组件错误 | |
File |
发生错误的文件名 | |
Line |
发生错误所在的行号 | |
Column |
发生错误所在的列 | |
Description |
错误描述 | |
ASPDescription |
如果这个错误与ASP相关的话,可以返回更详细的错误描述 |
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛