查看文章 |
关于asp对象的讲解(3)
2008-05-18 3:29
4.3.2.2 方法 Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面示例将释放会话状态。 <% Session.Abandon %> 4.3.2.3 事件 Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。 1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。 尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。 为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 : <SCRIPT RUNAT=Server Language=VBScript> Sub Session_OnStart startPage = "/MyApp/StartHere.asp" currentPage = Request.ServerVariables("SCRIPT_NAME") if strcomp(currentPage,startPage,1) then Response.Redirect(startPage) end if End Sub </SCRIPT> 上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理 Session_OnStart 脚本并将用户重定向到启动页中。 2、Session_OnEnd 事件在会话被放弃或超时发生。 关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。 会话可以通过以下三种方式启动 : 1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。 2、用户在 Session 对象中存储了一个值。 3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 <OBJECT> 标签创建带有会话作用域的对象的实例。 如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。 <% Session.Timeout = 5 %> 当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。 <% Session.Abandon %> 在本节我们学习了两个在 WEB 页面特别是基于 WEB 的 BBS 或 Chat 上经常使用 ASP 内建对象,由于这两个对象在实际运用中很实用,因此在下一节中将运用至此我们所学过的 4 个 ASP 内建对象,给大家演示一个完整的 ASP 应用程序,相信通过这个练习,能大大加深你对 ASP 应用程序的理解和掌握。 4.4 Global.asa文件的使用及Chat程序 在上一节中给大家详细介绍了两个非常实用的 ASP 内建对象 Application 和 Session 的使用方法。由于这两者的 OnStart、OnEnd 事件的脚本都必须在 Global.asa 文件中声明 , 因此,本节将给大家详细介绍 Global.asa 文件的使用方法。为使大家熟练掌握至今所学过的知识,本篇还将举出一个 ASP 的 Chat 程序,供各位参考。 下面向大家介绍 Global.asa 文件的使用方法。 什么是 Global.asa 文件?它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的根目录中。每个应用程序只能有一个 Global.asa 文件。 在 Global.asa 文件中,如果包含的脚本没有用 <SCRIPT> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。我们可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 <SCRIPT> 标记中。 在 Global.asa 文件中声明的过程只能从一个或多个与 Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序的 ASP 页中,它们是不可用的。如果要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端包容 (SSI) 语句将该文件包含在调用该过程的 ASP 程序中。通常,包含文件的扩展名应为 .inc。 下面是一个很标准的 Global.asa 文件 : <SCRIPT LANGUAGE="VBScript" RUNAT="Server"> ‘’Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行 ‘’Session_OnEnd 当一个客户的会话超时或退出应用程序时运行 ‘’Application_OnStart 当任何客户首次访问该应用程序的首页时运行 ‘’Application_OnEnd 当该站点的 WEB 服务器关闭时运行 </SCRIPT> <SCRIPT LANGUAGE="VBScript" RUNAT="Server"> Sub Application_OnStart VisitorCountFilename = Server.MapPath ("/ex2") + "\VisitCount.txt" Set FileObject = Server.CreateObject("Scripting.FileSystemObject") Set Out= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE, FALSE) Application("visitors") = Out.ReadLine Application("VisitorCountFilename") = VisitorCountFilename End Sub ‘’========================================================= SUB Application_OnEnd Set FileOutObject = Server.CreateObject("Scripting.FileSystemObject") Set Out= FileOutObject.CreateTextFile (Application("VisitorCountFilename"), TRUE,FALSE) Out.WriteLine(application("visitors")) End Sub ‘’=========================================================Sub Session_OnStart Session.Timeout = 5 Application("visitors") = Application("visitors") + 1 Session("ID")=Session.SessionID End Sub </SCRIPT> 在这个 Global.asa 程序中,涉及到了 ASP 的 File Access 组件,它可以提供用于访问文件系统的方法、属性和集合。这将在以后 ASP 的组件中进行展开讨论。在这里,它起到了在服务器上创建新文件并对文件进行写操作的作用。这其实是一个 ASP 页面访问记数器应用程序的 Global 文件,首先当客户首次访问该应用程序的首页时 , 过程 Application_OnStart 定义了在服务器上指定的虚拟目录下新建一个 VisitCount.txt 的文本文件,并将文件的路径和内容保存在应用程序级的变量中。而当任何一个客户访问 ASP 应用程序中的任何一个页面时,过程 Session_OnStart 定义将应用程序级的变量 visitors 的值自动加一。这样,每当有客户访问页面时,变量 visitors 都将自动加一,以起到统计点击率的作用。由于变量 visitors 的值是存储在系统内存之中,所以如果服务器关闭或重新启动,存储在变量中的数据将自动丢失,所以通过定义过程 Application_OnEnd,在服务器关闭或重启之前将数据写入事先建立的文本文件之中,这样就能确保当服务器再次启动时,Application_OnStart 过程可以从 VisitCount.txt 文件中读取以前的统计数。 经过这段时间的学习,相信大家已经能够比较熟练的运用我们所学过的这些 ASP 内建对象来编写一些较简单的 ASP 应用程序,下面就举一个非常简单的 ASP WEB 聊天室程序: <%@ Language=VBScript %> <% Response.Buffer=true ‘’ 设置输出缓存,用于显示不同页面。 On error resume next ‘’ 忽略程序出错部分 If Request.ServerVariables("Request_Method")="GET" then %> <form method="POST" action="chat.asp"><p> <input type="text" name="nick" size="20" value="nick" style="background-color: rgb(192,192,192)"><br> <input type="submit" value=" 进入聊天室 " name="B1" style="color: rgb(255,255,0); font-size: 9pt; background-color: rgb(0,128,128)"> <p><input type="hidden" name="log" size="20" value="1"><br></p> </form> <% Response.End ‘’ 结束程序的处理 Else Response.clear ‘’ 清空缓存中的内容 dim talk If Request.Form("nick")<>"" then ‘’ 判断客户是是否在聊天界面中 Session("nick")=Request.Form("nick") End If 客户聊天界面 %> <form method="POST" action="chat.asp" name=form1> <p><%=Session("nick")%> 说话:<input type="text" name="talk" size="50"><br> <input type="submit" value=" 提交 " name="B1"> <input type="reset" value=" 取消 " name="B2"></p> </form> <A HREF="/asptest/shusheng/chat.asp"> 离开 </a><br><br> <% If Request.Form("log")<>1 then If trim(Request.Form("talk"))="" then talk=Session("nick")&" 沉默是金。" Else talk=trim(Request.Form("talk")) ‘’ 去掉字符后的空格 End If Application.lock Application("show")="<table border=‘’0‘’ cellpadding=‘’0‘’ cellspacing=‘’0‘’ width=‘’85%‘’ ><tr><td width=‘’100%‘’ bgcolor=‘’#C0C0C0‘’></td></tr><tr><td width=‘’100%‘’><font color=‘’#0000FF‘’> 来自 "&Request.ServerVariables("remote_addr")&" 的 "&Session("nick")&time&" 说:</font>"&talk&"</td></tr><tr><td width=‘’100%‘’ bgcolor=‘’#C0C0C0‘’></td></tr></table><br>"&Application("show") Application.UnLock Response.Write Application("show") End If End If %> 下面我们来对这个聊天室程序进行逐步的分析。 首先,由于聊天室的所有客户都要能够共享信息,所以不可避免的要用到具有应用程序级变量的对象 Application,这是建立 Chat 程序的关键所在,所有的谈话数据都存放在一个应用程序级变量中,以便让所有的客户读取。我们可以用所学过的 <% Application("show")=talk&Application("show") %> 接下来要考虑的是当不同的客户同时向 Chat 应用程序进行操作的时候如何处理。这个问题其实与在数据库中的两个用户同时写入同一个记录一样,如果两个用户同时对同一个应用程序级变量进行写操作,则一个用户所作的修改会被另一个用户的操作所覆盖,所以,如果对 Application 对象数据的并发访问不采取一定措施,则会导致当两个用户试图同时对 Asp 聊天室应用程序提交时,一个用户的提交内容会被另一个用户的提交内容所覆盖,在被参加到会话中的任何人看到之前就消失了。为了避免这类问题的出现,我们需要使用 Application 对象的 Lock 属性来约束只允许当前的用户编辑或增加 Application 对象的属性,这样当用户开始修改应用程序级变量开始,到 Application 对象被显式地 Unlocked 为止,Application 对象的属性只能被该用户编辑,如果此时有其他用户请求编辑 Application 对象,则这些用户要排队等待,知道应用程序被 Unlock 为止。如下所示 : Application.lock Application("show")=talk&Application("show") Application.UnLock 现在整个程序的核心部分你已经了解了,下面考虑如何保存客户信息,这里我们要用到一个会话级变量,即将客户的 nick 保存在 Session 中。如: Session("nick")=Request.Form("nick") 最后,我们要考虑的是如何仅在一个 .asp 文件中处理各种事件 , 如 : 客户登陆界面、客户聊天界面。由于客户第一次请求 .asp 文件时,采用的是简单的 HTTP GET 方式,但是当客户向页面上的表单字段中增加的数据并向自身提交表单后,.asp 文件会再次被请求,不过这次数据是经过 HTTP POST 方式进行传递的。文件被请求的方式可以用两种方法来确定。一是测试 Request.Form 集合是否包含成员,若没有,则表明没有发送给表单处理的数据。二是使用 Request.ServerVariables("Request_Method") 变量。如果表单是通过 HTTP GET 方式被请求的,则这个变量会返回“GET”,如果表单被提交处理则返回“POST”。由于后一种方法对于确定文件的请求方式更直接,所以我们使用如下代码进行判断 : if Request.ServerVariables("Request_Method")="GET" then 由于我们设置了 ASP 缓存,所以当程序判断页面请求方式为 GET 时,程序运行 Response.End,来结束后面的所有操作,否则则运行 Response.clear, 清空缓存中已有的内容,并继续程序的运行。这样我们就得以用同一个 .asp 文件根据不同情况给客户显示不同的界面。 4.5 ASP内建对象Server Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务的。有了 Server 对象,你就可以在服务器上启动 ActiveX 对象例程,并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数。 4.5.1 语法 Server.property|method 4.5.2 属性 ScriptTimeout 超时值,在脚本运行超过这一时间之后即作超时处理。如下代码指定服务器处理脚本在 100 秒后超时。 <% Server.ScriptTimeout=100 %> 这里需要注意的是,通过使用元数据库中的 AspScriptTimeout 属性可以为 Web 服务或 Web 服务器设置缺省的 ScriptTimeout 值。ScriptTimeout 属性不能设置为小于在原数据库中指定的值。例如,如果 NumSeconds 设置为 60,而元数据库设置包含了默认值 90 秒,则脚本在 90 秒后超时。 4.5.3 方法 1、HTMLEncode 方法 HTMLEncode 方法允许你对特定的字符串进行 HTML 编码,虽然 HTML 可以显示大部分你写入 ASP 文件中的文本,但是当你需要实际包含 HTML 标记中所使用的字符,就会遇到问题。这是因为,当浏览器读到这样的字符串时,会试图进行解释。例如下面的这段文本 : 这是对 HTMLEncode 方法的测试。<br> 这里应该不会另起一行。 会被浏览器显示为 : 这是对 HTMLEncode 方法的测试。 这里应该不会另起一行。 为了避免此类问题,我们就需要使用 Server 对象的 HTMLEncode 方法,采用对应的不由浏览器解释的 HTML Character Code 替代 HTML 标记字符。所以,用下面的代码才能显示正确的 HTMLEncode 字符串,从而在浏览器中按你的需要输出文本。 <% Response.write Server.HTMLEncode(" 这是对 HTMLEncode 方法的测试。<br> 这里应该不会另起一行。")%> 2、URLEncode 方法 就象 HTMLEncode 方法使客户可以将字符串翻译成可接受的 HTML 格式一样,Server 对象的 URLEncode 方法可以根据 URL 规则对字符串进行正确编码,当字符串数据以 URL 的形式传递到服务器时,在字符串中不允许出现空格,也不允许出现特殊字符。为此,如果你希望在发送字符串之前进行 URL 编码,可以使用 Server.URLEncode 方法。 3、MapPath 方法 MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。 语法如下 :Server.MapPath(Path) Path 指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始,则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始,则 MapPath 方法返回同 .asp 文件中已有的路径相对的路径。这里需要注意的是 MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。 对于下列示例,文件 data.txt 和包含下列脚本的 test.asp 文件都位于目录 C:\Inetpub\Wwwroot\asp 下。C:\Inetpub\Wwwroot 目录被设置为服务器的宿主目录。下列示例使用服务器变量 PATH_INFO 映射当前文件的物理路径。以下脚本 <%= server.mappath(Request.ServerVariables("PATH_INFO"))%> 输出 c:\inetpub\wwwroot\asp\test.asp 由于下列示例中的路径参数不是以斜杠字符开始的,所以它们被相对映射到当前目录,此处是目录 C:\Inetpub\Wwwroot\asp。以下脚本 <%= server.mappath("data.txt")%> <%= server.mappath("asp/data.txt")%> 输出 c:\inetpub\wwwroot\asp\data.txt c:\inetpub\wwwroot\asp\asp\data.txt 4、CreateObject 方法 Server.CreateObject 恐怕是 ASP 中最为实用,也是最强劲的功能了。它用于创建已经注册到服务器上的 ActiveX 组件实例。这是一个非常重要的特性,因为通过使用 ActiveX 组件能够使你轻松地扩展 ActiveX 的能力,正是使用了 ActiveX 组件,你可以实现至关重要的功能,譬如数据库连接、文件访问、广告显示和其他 VBScript 不能提供或不能简单地依靠单独使用 ActiveX 所能完成的功能。正是因为这些组件才使得 ASP 具有了强大的生命力。 其语法如下: Server.CreateObject("Component Name") 默认情况下,由 Server.CreateObject 方法创建的对象具有页作用域。这就是说,再当前 ASP 页处理完成之后,服务器将自动破坏这些对象。如果要创建有会话或应用程序作用域的对象,可以使用 <OBJECT> 标记并设置 SESSION 或 APPLICATION 的 SCOPE 属性,也可以在对话及应用程序变量中存储该对象。如下例程 : <% Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%> 这里需要注意的是,不能创建与内建对象同名的对象实例,否则,如下列脚本将返回错误。 <% Set Response = Server.CreateObject("Response") %> 至今为止,我们已经学习完了 ASP 所有的内建对象,从下一章起作者将开始介绍 ASP 内建 ActiveX 组件,这也是 ASP 运用中非常重要和实用的一部分。 |
最近读者:

