`
yydy1983
  • 浏览: 47696 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

深入研究Application和Session对象

阅读更多
 用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对象是提高程序质量的关键。下面让笔者根据自己在这方面的经验,向大家深入介绍一下ASP的这两个内建对象。

  一、Application对象的成员概述

  Application对象成员包括Application对象的集合、方法和事件。

  ⒈Application对象的集合

  Contents集合:没有使用<OBJECT>元素定义的存储于Applicaiton对象中的所有变量的集合

  StaticObjects:使用<OBJECT>元素定义的存储于Application对象中的所有变量 的集合

  例:在default.asp中有如下赋值

  application("a")="a"

  application("b")=128

  application("c")=false

  则有contents集合

  application.contents(1)="a" '也可写为application.contents("a")="a"

  application.contents(2)=128 '也可写为application.contents("b")=128

  application.contents(3)=false '也可写为application.contents("c")=false

  在此笔者推荐你在调用时使用类如application.contents("a")的方法,因为这样更为直观,如果用序号来表示的话则要考虑赋值的先后顺序。

  ⒉Application对象的方法

  Contents.Remove("变量名"):从Application.Contents集合中删除指定的变量

  Contents.RemoveAll() :把Application.Contents集合中的所有变量删除

  Lock() :锁定Application对象,使得只有当前的ASP页对内容能进行访问

  Unlock() :解除对Application对象的锁定

  例:在default.asp中:

  application("a")="a"

  application("b")=128

  application("c")=false

  response.write application.contents(1)&"<br>"

  response.write application.contents(2)&"<br>"

  response.write application.contents(3)&"<br>"

  response.write "After Remove b:"

  application.contents.remove("b")

  response.write application.contents(1)&"<br>"

  response.write application.contents(2)&"<br>"

  执行结果:

  a

  128

  False

  After Remove b:

  a

  False

  如果要删除集合中所有变量用application.contents.removeall即可,至于Lock和Unlock方法在实际中经常用到,读者也比较熟悉,在此就不在累赘。

  ⒊Application对象事件

  OnStart:第一个访问服务器的用户第一次访问某一页面时发生

  OnEnd :当最后一个用户的会话已经结束并且该会话的OnEnd事件所有代码已经执行完毕后发生,或最后一个用户访问服务器一段时间(一般为20分钟)后仍然没有人访问该服务器产生。

  想要定义application对象的OnStart和OnEnd事件里做什么需要将代码写在Global.asa这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是Inetpub\wwwroot\)
二、Session对象的成员概述

  Session对象的成员比Application对象多一项属性,即:集合、属性、方法、事件

  ⒈Session对象的集合

  Contents :没有使用<OBJECT>元素定义的存储于特定Session对象的所有变量的集合。

  StaticObject:使用<OBJECT>元素定义的、存储于Session对象中的所有变量的集合。

  例:在default.asp中有如下赋值

  session("a")="a"

  session("b")=128

  session("c")=false

  则有contents集合

  session.contents(1)="a" '也可写为session.contents("a")="a"

  session.contents(2)=128 '也可写为session.contents("b")=128

  session.contents(3)=false '也可写为session.contents("c")=false

  ⒉Session对象的属性

  CodePage: 可读/可写。整型。定义用于在浏览器中显示页内容的代码页。代码页是字符集的数字值,不同的语言使用不同的代码页。例如,ANSI代码页为1252,日文代码页为932,简体中文代码页为936。

  LCID : 可读/可写。整型。定义发送给浏览器的页面地区标识。LCID是唯一地标识地区的一个国际标准缩写,例如,2057定义当前地区的货币符号是"£"。

  SessionID: 只读。长整型。返回本会话的会话标识符。每创建一个会话,由服务器自动分配一个标识符。可以根据它的值判断两个用户是谁先访问服务器。

  Timeout : 可读/可写。整型。为会话定义以分钟为单位的超时限定。如果用户在这个时间内没有刷新或请求任何一个网页,则该用户产生的会话自动结束。缺省值是20。

以上属性在实际应用中作用不大,而且基本上不需要怎么修改,这几个属性也没什么特殊的地方。

  ⒊Session对象的方法

  Contents.Remove("变量名"): 从Session.contents集合中删除指定的变量

  Contents.Removeall() : 删除Session.contents集合中的所有变量

  Abandon() : 结束当前用户会话并且撤消当前Session对象。

  Session对象的Contents.Remove("变量名")和Contents.Removeall()方法与Application对象的基本上没什么区别,为帮助理解,大家可以参照上面的例子将Application改为Session。这里要说明一下的是Contents.Removeall()和Abandon()的区别,执行这两个方法都会释放当前

  用户会话的所有Session变量,不同的是Contents.Removeall()单纯地释放Session变量的值而不终止当前的会话,而Abandon()除了释放Session变量外还会终止会话引发Session_OnEnd事件,希望大家注意两者的区别。

  ⒋Session对象的事件

  OnStart: 当ASP用户会话产生时触发,一旦有任一用户对本服务器请求任一页面即产生该事件。

  OnEnd : 当ASP用户会话结束时触发,当使用Abandon()方法或超时也会触发该事件。

  这两个事件和Application的OnStart、OnEnd事件一样,也是必须放在Global.asa文件里,下面就重点和大家研究一下这四个事件的使用。
三、Global.asa

  ASP的Application和Session对象体现了其他ASP内置对象所没有的特征--事件。每一个访客访问服务器时都会触发一个OnStart事件(第一个访客会同时触发Application和Session的OnStart事件,但Application先于Session),每个访客的会话结束时都会触发一个OnEnd事件(最后一个访客会话结束时会同时触发Application和Session的OnEnd事件,但Session先于Application)。

  OnStart和OnEnd这两个事件一般应用在虚拟社区中统计在线人数、修改用户的在线离线状态等。要具体定义这两个事件,需要将代码写在Global.asa文件,并将该文件放在站点的根目录下(缺省是\Inetpub\wwwroot\)。另外,Application和Session对象规定了在OnEnd事件里除了Application对象外其他ASP内置对象(Response、Request、Server、Session...)一概不能使用。以下举一个虚拟社区统计在线人数的例子来说明如何使用这两个事件。

  文件说明:

  global.asa 位于d:\Inetpub\wwwroot\目录下

  default.asp 位于d:\Inetpub\wwwroot\目录下,虚拟社区登录页面

  login.asp 位于d:\Inetpub\wwwroot\目录下,用于检测用户输入的用户名及密码

  index.asp 位于d:\Inetpub\wwwroot\目录下,虚拟社区首页

  bbs.mdb 位于d:\Inetpub\wwwroot\目录下,存储用户信息的数据库

  数据库(ACCESS)结构:

   ===bbs表===

  id 用户ID,长整型

  name 用户名,文本型

  code 密码,文本型

  online 在线状态,是/否

 
  ===global.asa===

  <script LANGUAGE="VBScript" RUNAT="Server">

  Sub Application_OnStart

   application("online")=0

  End Sub

  sub Application_OnEnd

  nd Sub

  Sub Session_OnStart

  End Sub

  Sub Session_OnEnd

   if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

    application.lock

    application("online")=application("online")-1

    application.unlock

   end if

  End Sub

  </script>

  ==============

  ===login.asp===

   ......'密码验证,连接数据库,检测用户输入的用户名及密码是否正确

  if 密码验证通过 then

   session("name")=rs("name")

   session("id")=rs("id")

   session("pass")=true

  else

   rs.close

   conn.close

   response.write "密码错误!"

   response.end

  end if

  application.lock

  application("online")=application("online")+1

  conn.Execute ("update bbs set online=1 where id="&session("id"))'将用户的状态设为在线

  application.unlock

  rs.close

  conn.close

  response.redirect "index.asp" '初始化数据后跳转到社区首页

  ===========

  在本例中,用application("online")变量记录已经登录社区的在线人数,因为一旦有用户访问服务器而不管用户是否登录,都会产生OnStart事件,所以不能在OnStart事件里使Applicaiton("online")加一。因为不管是否是登录用户的会话结束都会产生OnEnd事件(假如有访客访问了服务器但并不登录社区,他的会话结束后也会产生OnEnd事件),所以在Session_OnEnd事件里用了句if语句来判断是否为已登录用户的OnEnd事件,如果是才将在线人数减一。

  这只是一个统计在线人数的简单例子,对于一个完整的虚拟社区来说,仅仅统计有多少人在线是不够的,在本例中数据库里有个online字段是用来记录用户的在线状态,用户登录的时候,在login.asp里将online设为1,但用户离线时并没有将online设为0,要完善它,就要修改一下Session_OnEnd事件,在该事件里将online设为0。

  ===global.sas===

  <script LANGUAGE="VBScript" RUNAT="Server">

  Sub Application_OnStart

   application("online")=0

   set application("conn")=Server.CreateObject("ADODB.Connection")

   application("db")=Server.MapPath("\bbs.mdb") '此处最好使用绝对路径\bbs.mdb,下文有详细介绍

  End Sub

  sub Application_OnEnd

   set application("conn")=nothing

  End Sub

   Sub Session_OnStart

  End Sub

  Sub Session_OnEnd

   if session.contents("pass") then '判断是否为登录用户的Session_OnEnd

     application("con").open ="driver={Microsoft Access Driver (*.mdb)};dbq="&application("db")

      application.lock

      application("online")=application("online")-1

      application("con").Execute ("update friends set online=0 where id="&session.contents("id"))

      application.unlock

      application("con").close

   end if

  End Sub

  </script>

  ==============

  至此,完整的代码已经完成了。因为在Application和Session的OnEnd事件里不能使用Server对象,所以要将数据库的连接及数据库在服务器上的物理地址(d:\inetpub\wwwroot\bbs.mdb)存储在application变量中,并在Application_OnStart事件中预先处理。同理,在Session_OnEnd事件中不能用session("pass")来代替session.contents("pass")(以下有详尽说明)。

  四、本文实例中值得引起注意的两点

  ⒈OnEnd事件里的session.contents

  刚开始接触global.asa的朋友经常会将上面Session_OnEnd事件里的

  if session.contents("pass") then 写成

  if session("pass") then,

  这样的话系统不会提示错误,但是永远也不会执行then后面的内容,这是因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。因为IIS并没提示任何错误信息,所以笔者曾经在这上面浪费了很多时间。在此希望大家引以为鉴!

  ⒉Application_OnStart事件里用Server.MapPath获取数据库的物理地址时应使用绝对地址为了说明这个问题,大家可以做个实验:将上面Application_OnStart事件里的

  application("db")=Server.MapPath("\bbs.mdb")改为:

  application("db")=Server.MapPath("bbs.mdb")

然后在d:\inetpub\wwwroot\目录下建立一个test子目录,写一个temp.asp在test目录里。

  ====test.asp====

  <%response.write application("db")%>

  ================

再将temp.asp拷贝一份放在根目录下(d:\inetpub\wwwroot\)。用记事本打开global.asa,再打开两个浏览器,浏览器A输入地址http://localhost/temp.asp,按回车,将在浏览器上输出:

  d:\inetpub\wwwroot\bbs.mdb

然后,在记事本的窗口上点"文件"菜单,选"保存"(使global.asa的修改时间改变,从而使IIS重启动所有服务),再在浏览器B输入地址http://localhost/test/temp.asp,按回车,在浏览器上输出的是:

  d:\inetpub\wwwroot\test\bbs.mdb

global.asa文件虽然是放在站点根目录下,但是如果在server.mappath中使用的是相对地址,而触发Application_OnStart事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心。
分享到:
评论

相关推荐

    Demo10-Application,Session,cookie.rar

    在ASP.NET中,Application、Session和Cookie是三个非常重要的概念,它们主要用于管理...通过实践和研究"Demo10-Application,Session,cookie.rar"中的示例,开发者能够更深入地理解这些概念,并将其应用到自己的项目中。

    Struts2访问request,session,application的四种方式

    这个对象包含了request、session和application等重要信息。例如,你可以使用`ActionContext.getContext().get("key")`来获取请求或会话中的值,而`ActionContext.getContext().getValueStack()`则可以获取ValueStack...

    asp6大对象详解

    ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,用于创建动态网页或Web应用程序。在ASP中,有六个核心的对象,...深入研究这些资源,将有助于你更好地掌握ASP编程基础,为后续的Web开发打下坚实的基础。

    ASP最全面解析_经典教材_免费下载.pdf

    根据提供的文件信息,我们将详细解析ASP(Active Server Pages)相关的知识点,主要涉及Server对象、Application和Session对象以及connection对象的研究和优化。 首先,Server对象是ASP中的一个内置对象,它提供了...

    ASP源码—信息收集系统.zip

    ASP的核心组件包括Request对象、Response对象、Session对象和Application对象等。 1. Request对象:它用于从客户端获取数据,如表单提交的数据、URL参数、cookies等。在信息收集系统中,Request对象可能会用来抓取...

    ASP动态网站系统开发代码

    例如,Application对象用于在所有用户间共享数据,Session对象则跟踪单个用户的会话信息。Server对象提供了对服务器上的资源进行操作的方法,而Response和Request对象是客户端和服务器间通信的关键。 在这个压缩包...

    李兴华 Java Web 开发实战经典_带源码_高清pdf 带书签 上

    6.2.5、深入研究page属性范围 6.3、request对象 6.3.1、乱码解决 6.3.2、接收请求参数 6.3.3、显示全部的头信息 6.3.4、角色验证 6.3.5、其他操作 6.4、response对象 6.4.1、设置头信息 6.4.2、页面跳转 ...

    JavaWeb开发技术大全光盘(二)

    JavaWeb开发技术是现代互联网应用开发的重要组成部分,它涵盖了从服务器端编程到前端交互的一系列技术。本资源“JavaWeb开发技术大全光盘(二...无论你是想了解基础概念,还是提升高级技能,这个资料集都值得深入研究。

    同策论坛网站社区源码

    通过深入研究“同策论坛网站社区源码”,不仅能了解ASP的基本概念和应用,还能学习到如何设计和实现一个功能完善的社区论坛系统,包括用户交互、数据存储、权限控制等多个方面,对于提升ASP编程技能和网站开发能力...

    yuandaima.rar_asp源代码

    ASP,全称Active Server Pages,是微软开发的一种服务器端脚本环境,用于创建动态交互式网页。...通过深入研究这些源码,你将能够更好地掌握服务器端脚本的精髓,以及如何构建高效、动态的Web应用。

    ASP实例开发源码-免费家教网-宽屏幕版.zip

    6. Session与Application:Session对象用于跟踪单个用户的会话信息,而Application对象则用于存储在整个应用程序范围内共享的数据。 7. 宽屏幕版:这个实例可能针对的是宽屏显示器,意味着它在设计时考虑到了高分辨...

    ASP网站实例开发源码——综合信息网站系统源代码6套.zip

    例如,Response对象用于向客户端发送数据,Request对象则用于接收客户端的数据,Session和Application对象则用于存储用户会话信息和全局变量。 3. 数据库连接与操作:在这些综合信息网站系统中,通常会涉及到数据库...

    ASP动态网站建设论文 毕业论文

    Session对象允许开发者跟踪单个用户在整个网站的访问过程,存储和检索用户特定的信息;Application对象则在所有用户之间共享数据,适合存储整个应用程序范围内的变量。 5. **数据库集成**:ASP可以轻松地与各种...

    基于ASP的仿360搜索首页源码 v1.0.zip

    Session对象为每个用户创建独立的存储空间,而Application对象则在整个应用程序范围内共享数据。 8. **文件操作**:ASP可以使用FileSystemObject(FSO)进行文件系统操作,如读取、写入和创建文件。 在“仿360搜索...

    初学asp必须研究的100个例 严重推荐!

    5. **Session对象**:Session对象用于在用户会话期间存储数据,这对于实现用户状态管理至关重要。了解如何设置和读取Session变量,以及处理Session过期问题。 6. **Application对象**:Application对象用于在整个...

    ASP源码—WTS工作跟进系统 v1.18.zip

    ASP(Active Server Pages)是一种...通过深入研究这个源码包,我们可以学习到如何使用ASP构建一个实用的工作管理应用,包括与数据库的交互、用户认证、任务跟踪等功能,同时也能够提升对ASP编程技巧和最佳实践的理解。

    ASP实例编程100例

    8. **状态管理**:Session和Application对象用于保持用户状态,理解何时使用Session和何时使用Application至关重要。 9. **安全性**:包括如何防止SQL注入、XSS攻击等,确保Web应用的安全性。 10. **性能优化**:...

    ASP实例开发源码-思尔特asp企业网站管理系统.zip

    Application和Session对象则用于在整个应用程序或用户会话期间保存数据。 3. ASP中的VBScript: VBScript是ASP最常用的脚本语言,它的语法简洁,易于理解。开发者可以使用VBScript进行条件判断、循环控制、函数...

    ASP手册简明中文版

    Application和Session对象则分别用于在整个应用程序和单个用户会话中存储数据。 手册可能会详细介绍ASP的语法结构,包括如何声明变量、使用条件语句(如If...Then...Else)、循环结构(如For...Next和Do...Loop),...

    ASP基于WEB网上日记本毕业设计(源代码).rar

    Session对象用于跟踪单个用户的会话,而Application对象则用于在整个应用程序生命周期内共享数据。 8. **错误处理和调试**:ASP提供了Error对象和On Error语句来进行错误处理,同时,开发者可以通过View Source和...

Global site tag (gtag.js) - Google Analytics