设为首页
|
加入收藏
|
联系我们
|
用户登录
首页
学校概况
学校简介
现任领导
历任领导
发展历史
一中标识
联系方式
政务公开
知识园地
融媒体中心
领导关怀
交流访问
教师风采
学子风采
校园文化
节日文化
艺体活动
德育管理
学生资助
家校共育
安全教育
法律规章
心理健康
未成年人思想道德建设
教育教学
通知公告
办事指南
教师发展
规章制度
政策文件
语言文字工作
高考榜
新高考改革
招生考试
中考信息
高考信息
学考信息
网上报名
国际办学
最新快报
留学百科
办学成绩
名师风采
Distance
对外交流
社团活动
联系我们
党建工作
党务公开
党史日志
党建品牌
党风廉政
党员风采
组织机构
科室动态
电教之窗
一中工会
平安校园
团委
艺体中心
总务办公
数字校园
全民阅读
办公平台
网上资源
视频点播
网络安全
市一中网盘
校园一卡通
网上图书馆
信息公开
信息公开咨询指南
主动公开目录
主动公开内容
信息公开制度
2025年05月01日 星期四 农历 乙巳年(蛇)四月初四
站内搜索:
电教之窗
电教之窗
AI助力教学
知识园地
教学探讨
规章制度
日常办公
一中工会
通知
先模风采
送温暖
教工生活
民主管理
政策法规
工会机构
工作信息
平安校园
规章制度
学习园地
物业保洁
综合治理
日常办公
团委
文件公告
网上团校
评比奖惩
团的活动
学习园地
规章制度
艺体中心
日常办公
艺术活动
体育活动
学习园地
总务办公
健康与卫生
学习园地
校产管理
岗位职责
办公采购
饮食服务
基建维修
日常办公
知识园地
首页
>
电教之窗
>
知识园地
深入研究Application和Session对象
发布时间:2011-09-21
点击量:
2120
用ASP编写虚拟社区、网上购物等程序时,Application和Session对象具有举足轻重的作用,能够灵活合理地运用这两个对象是提高程序质量的关键。下面让笔者根据自己在这方面的经验,向大家深入介绍一下ASP的这两个内建对象。
一、Application对象的成员概述
Application对象成员包括Application对象的集合、方法和事件。
⒈Application对象的集合
Contents集合:没有使用
元素定义的存储于Applicaiton对象中的所有变量的集合
StaticObjects:使用
元素定义的存储于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)&"
"
response.write application.contents(2)&"
"
response.write application.contents(3)&"
"
response.write "After Remove b:"
application.contents.remove("b")
response.write application.contents(1)&"
"
response.write application.contents(2)&"
"
执行结果:
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 :没有使用
元素定义的存储于特定Session对象的所有变量的集合。
StaticObject:使用
元素定义的、存储于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事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心。
友情链接:
--全国中学--
浙江学军中学
河北衡水中学
湖南长沙一中
重庆八中
--山东省中学--
东营市二中
山东省实验中学
历城二中
山东省潍坊第一中学
山东省临沂第一中学
广饶一中
胜利一中
--在线学习--
东营市志愿服务网
国家中小学智慧教育平台
中央宣传部出版物数据中心
东营市安全教育平台
--全国高校--
清华招生网
北大招生网
山东石油化工学院
--教育部门--
东营市教育局开发区分局
山东省教育厅
山东省教育云服务平台
教育部
东营市教育局
教育部阳光高考平台
山东省教育招生考试院
山东省教科院
东营市教育局
山东省学籍平台