一、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这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是inetpubwwwroot)
二、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文件,并将该文件放在站点的根目录下(缺省是inetpubwwwroot)。另外,application和session对象规定了在onend事件里除了application对象外其他asp内置对象(response、request、server、session...)一概不能使用。以下举一个虚拟社区统计在线人数的例子来说明如何使用这两个事件。
文件说明:
global.asa 位于d:inetpubwwwroot目录下
default.asp 位于d:inetpubwwwroot目录下,虚拟社区登录页面
login.asp 位于d:inetpubwwwroot目录下,用于检测用户输入的用户名及密码
index.asp 位于d:inetpubwwwroot目录下,虚拟社区首页
bbs.mdb 位于d:inetpubwwwroot目录下,存储用户信息的数据库
数据库(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("bs.mdb") '此处最好使用绝对路径bs.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:inetpubwwwrootbs.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("bs.mdb")改为:
application("db")=server.mappath("bbs.mdb")
然后在d:inetpubwwwroot目录下建立一个test子目录,写一个temp.asp在test目录里。
====test.asp====
<%response.write application("db")%>
================
再将temp.asp拷贝一份放在根目录下(d:inetpubwwwroot)。用记事本打开global.asa,再打开两个浏览器,浏览器a输入地址http://localhost/temp.asp,按回车,将在浏览器上输出:
d:inetpubwwwrootbs.mdb
然后,在记事本的窗口上点"文件"菜单,选"保存"(使global.asa的修改时间改变,从而使iis重启动所有服务),再在浏览器b输入地址http://localhost/test/temp.asp,按回车,在浏览器上输出的是:
d:inetpubwwwroot estbs.mdb
global.asa文件虽然是放在站点根目录下,但是如果在server.mappath中使用的是相对地址,而触发application_onstart事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心。
类别:web | 编辑 | 删除
| 评论(0) | 浏览(0)
全面解析asp server对象
2007-07-27 12:40
server对象提供对服务器上访问的方法和属性.大多数方法和属性是作为实用程序的功能提供的。
语法:
server.property|method
属性(property)
server对象只有一个属性:scripttimeout 程序能够运行的最大时间
方法(methods)
createobject 建立一个对象实例.
execute 执行一个asp文件
getlasterror 返回一个错误代码
htmlencode 对指定的html代码进行转换.
mappath 将一个相对路径转化为一个绝对路径.
transfer 将当前的所有状态信息发送给另一个asp文件
urlencode 以url形式转化指定的代码,包括空格
server对象的方法详细说明
createobject
语法
server.createobject( progid )
参数
progid
指定要创建的组件名称,格式如下: [vendor.]component[.version].
要点:
一般来说,用由server.createobject方法创建的对象拥有页面的范围.这就说,当这页的asp程序执行完后,这种对象会自动地消失.
为了创建一个拥有session或application范围的对象,你可以在global.asa文件中使用
execute
execute 方法呼叫一个asp文件并且执行它就像这个呼叫的asp文件存在这个asp文件中一样。这很像许多语言中的类的调用。
语法
server.execute( path )
参数
path
指定执行的那个asp文件的路径。如是它是一个绝对路径,那么它必须是一个在这个asp应用程序相同的地方(目录)。
讲解
server.execute 方法提供了一种将一个复杂asp应用程序分化为小块单位来执行的方法。通过这种方法,你能够建一个asp图书馆,你能够随便在你需要时调用你图书馆中的asp文件。这个就有点像ssi了!嘿嘿!
当iis根据指定的asp文件路径执行完这个asp文件之后,就会自动返回以前的asp文件。这个刚刚执行完的asp文件有可能改变了http head.但是和其它的asp文件一样,当程序试图改变http head时,就会报错!
这个path参数可以包括一个询问信息。
如果在被呼叫和呼叫的asp文件中都含有相同的子函数,那么这些子函数只在本asp文件中起作用。举个例子,如果在下面的asp1和asp2两个文件中都含有放弃程序的子函数。首先asp1呼叫asp2,那么asp2中的的ontransactionabort开始执行,当asp2执行完毕,asp1中的ontransactionabort才开始执行。
asp1:
< %@ transaction=
required
%>
< %
server.execute (".asp")
sub ontransactionabort
sub ontransactioncommit
%>
asp2.asp:
< %@
transaction=required
sub ontransactionabort
sub ontransactioncommit
%>
example
asp1
< % response.write("i am going to execute asp2 ")
server.execute("/myasps/asp2.asp")
%>
asp2
< % response.write("here i am")%>
getlasterror
getlasterror 方法返回一个asperror object 来描述一个错误信息.这个方法只适用于在asp文件发送任何内容给用户机之前.
语法
server.getlasterror ()
要点
如果一个500;100 用户错误已经被定义在一个asp应用程序中,它是指的一个以.asp为后缀的文件。这种情况下,在这个程序运行时当一个错误发生时,服务器就会自动的以server.transfer这种方式传送到这个正在执行的asp页面。asp应用程序就会将有效的处理这个错误。另外,这个asperror object一定要有效,这样你就能够看到服务器提供给你的错误信息来改这个文件了!
一般的web site 都是根据文件iishelpcommon500-100.asp来构造的。你能够用它来执行一个asp错误,当然你能够自己定义了!。如果你想改变为另外一个asp文件的来执行这些用户错误。那么你可以用iis中的snap-in.
注意:当iis发现了一个asp文件或者global.asa文件中的一个错误,那么一个500;100用户错误产生。以下的程序将不能执行!
example
下面的三个例子证明不同的错误会产生的用户错误。三个错误是:
编译错误
运行错误
逻辑错误
第一个例子证明了一个编译错误,就是当iis试图包含一个文件时产生的。这个错误会产生是因为在这个包含文件中没有定义所需的参数。第二个例子显示的是一个运行错误,这个程序中断的原因是程序中没有“next".第三个例子显示的是一个逻辑错误,因为这个程序试图除以一个0. 不行啦!
example 1
< %
response.write "hello"
%>
example 2
< %
dim i
for i=1 to 1
nxt
%>
example 3
< %
dim i,j
dim sum
sum=0
j=0
for i=1 to 10
sum=sum+1
next
sum=sum/j
%>
htmlencode
htmlencode方法对指定的字符串进行html编码.
语法
serverlencode( string )
参数
string 要进行编码的字符
例子
下面的程序:
< %= serverlencode("the paragraph tag: ") %>
输出为:
the paragraph tag:
注意 程序执行后在浏览器中看到的是:
the paragraph tag:
但是如果你用"查看源文件"看一下的话,源代码就不是了.
mappath
mappath 方法将相对路径转化为服务器上的物理路径
语法
server.mappath( path )
参数
path
相对路径。这个路径是以"/"或""开头的路径,如果这个路径中没有"",那么mappath方法就会返回以当前目录为基础的路径。
讲解
mappath 方法不能检查路径在这个服务器下是否存在。因为 mappath 转化路径时是不管这个路径是否在这个服务器下存在的。
你能够用它来将一个相对路径转化为一个物理路径,然后再在这个路径下进行各种操作。
example
在下面的例子中,data.txt文件存在 c:inetpubwwwrootscript 目录中,而且一个test.asp 文件包括下面的代码。c:inetpubwwwroot 是该服务器的主目录 。
下面的例子中,首先用环境变量"path_info"获得当前文件的物理路径。
下面是script 代码:
< %= server.mappath(request.servervariables("path_info"))%>
显示为:
c:inetpubwwwrootscript est.asp 因为下面的例子中路径参数没有以"/"开头,所以它是以当前目录转化的,asp文件是放在c:inetpubwwwrootscript中的.以下是 scripts的内容:
< %= server.mappath("data.txt")%>
< %= server.mappath("script/data.txt")%>
显示为:
c:inetpubwwwrootscriptdata.txt
c:inetpubwwwrootscriptscriptdata.txt
以下的两个例子是以"/"开头的.以下是scripts的内容:
< %= server.mappath("script")%>
显示为:
c:inetpubwwwrootscriptdata.txt
c:inetpubwwwrootscript
直接用"/"或""就会得到服务器的主目录:
< %= server.mappath("")%>
显示为:
c:inetpubwwwroot
c:inetpubwwwroot
transfer
transfer 方法会把一个正在执行的asp文件的所有信息传给另外一人asp文件。
语法
server.transfer (path)
参数
path
将要接收信息的asp文件的位置。
要点
当你调用server.transfer时,所有内建对象的状态信息都会包含在这次传送之中。这就是说,所有在保存在session或application中的信息都会被传送,而且,所有当前请求的信息都会被接收信息的asp文件所接受。
example
下面的例子示范了从一个asp文件传送到另一个asp文件例子!
asp1
< % dim sessvar1 response.write session.sessionid
response.write ("")
response.write("i am going to asp2 ")
server.
transfer
("/myasps/asp2.asp")
% >
asp(ApplicationServiceProvider,应用软体租赁服务提供者)即是指「透过网络以租赁方式提供应用软体服务的业者」,即是指业者以应用软体为主体,透过网路一对多地传递服务,这种以服务为主的交易模式促使企业可藉由租赁的方式,以更符合成本效益的方式拥有软体的使用权,并且亦能因为业者集中式的管理而大幅降低企业维护的成本.
基本上,asp即具有「软体服务化,服务网路化」,「资讯委外服务与网路结合」与「产品通路化,通路产品化」等三大特性,其甚至可以被视为是ISP(InternetService Provider)与ITS(Information Technology Service)的结合.
根据流行的观点,asp有如下五个核心内涵:
a. asp着重应用为中心,提供对于应用方面的访问和管理。
b. asp服务可以为用户提供没有在服务器、人员、系统和系统授权等前期资源投入情况下就可以在“定制”的全新应用系统环境进行访问的服务,如ISP,而这样的服务一般按月份asp收取服务费。
c. asp采用集中管理的方式---asp一般都有一个管理中心,所有的客户通过INTERNET来进行远程访问,获得技术支持和咨询服务。
d. 一对多的服务,也就是讲,asp提供的是标准化的产品包,产品都是最低程度的自定义或者没有实现客户定制化,对于行业用户来讲已经达到实用方便的标准。
e. 按照合同交付,在asp客户的眼中,asp是一家根据客户协议内容提供相关服务,保证应用服务系统服务可以得到确实履行的机构。
2. asp为什么会火?
从大的方面来讲,困扰国内企业生存、发展的核心问题是管理问题。随着互联网络的普及和应用的深入,企业用户可以随时随地直接租用asp的服务器和软件系统来进行自己的业务管理,这样做的好处在于;第一,企业可以节省大笔用于IT建设方面的资金,大幅度降低企业管理信息化的成本。第二,asp的用户可以采用各种方式获得应用和服务,软件类服务产品完全可以通过网络在非常短的时间内组成一个完善的、高效的、先进的企业管理系统,迅速获得企业一体化的运营管理方案。
网络经济发展突飞猛进,电子商务一日千里,网络和网站从门户到内容、从注意力到垂直性,目前逐渐转向热衷asp也是一个主要的原因。
笔者资料中,国内最早对asp触电的是网友“飞鸟”,在1998年6月自发组织了研究、交流和探讨asp技术的“飞鸟之家”,现在已经发展成为chinaasp.com,成为国内最早的asp应用技术服务提供商网站。上海的互易网络有限公司结合国内实际情况,推出了为国内企业服务的asp平台互易网,向企业提供以电子商务为核心的,企业内、外部网络设施和应用的远程构架和托管服务,创造虚拟企业门户(EP)直接将asp应用到商业增殖环节中去。
此外,ISP也全面转向asp的怀抱,成为ISP进一步发展的产物。软件商对于asp更是情有独钟。业界最新的消息是,中国第三电信“网通”已经制定asp发展战略,国内最大的管理咨询公司“汉普”将把旗下八个子公司定位在企业内部资源计划管理(ERP)领域的asp中,北京“联成互动”瞄准客户关系管理(CRM)领域的asp,北京“数码方舟”定位在网络办公的asp,HP正在和中国建设银行讨论共建金融领域的asp。
asp正在IT经济大潮中显山露水,其发展前景不可估量。
3. asp的发展阶段和面临的问题
以网络服务商、软件厂商和ISP为主力的各种IT角色,正在根据自己的优势条件出发对asp领域进行多种方面的尝试。就目前阶段来讲,asp提供的服务不计其数五花八门,没有标准化和量化的概念,硬件厂商向asp的“土壤”和势力方向靠拢,软件厂商和ISP则直接参与到asp业务的第一线。
笔者估计,经过一段时间的试探和发展,asp将向服务集成方面发展,产品和服务初步的标准化将很快建立起来,接着进入到市场细化和标准制定、asp产品成熟时期,asp的稳步增长,最终将成为IT行业商务模式的核心!
目前在asp发展的道路上,主要面临的问题是观念的转变方面:用租赁代替购买,服务集成代替产品经销商、服务经济代替产品经济等等。具体到实际方面来讲,安全和服务的质量是asp和客户共同关心的头等大事,要实现asp提出的“租赁高科技”的口号,asp任重而道远!
ASP的其他解释
aspirin,阿斯匹林
aspartic acid,天门冬氨酸
asp全称(AlisoftSalerPartner)即为“阿里软件销售合作伙伴”,是阿里软件(上海)有限公司管理软件事业部为推动“钱掌柜”产品市场销售,更好的为客户,尤其是中小企业老板提供产品服务,而设立的一种伙伴合作模式。其主要职责是在授权区域内从事阿里软件“钱掌柜”系列产品的客户推动与产品咨询工作。保证我们的产品让更多的企业中小企业老板使用,并为最终用户提供软件应用技术服务与指导。
asp,是美国武装系统暨程序公司(Armament System and Procedures, Lnc.,)的英文缩写简称。
一、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这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是inetpubwwwroot)
二、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文件,并将该文件放在站点的根目录下(缺省是inetpubwwwroot)。另外,application和session对象规定了在onend事件里除了application对象外其他asp内置对象(response、request、server、session...)一概不能使用。以下举一个虚拟社区统计在线人数的例子来说明如何使用这两个事件。
文件说明:
global.asa 位于d:inetpubwwwroot目录下
default.asp 位于d:inetpubwwwroot目录下,虚拟社区登录页面
login.asp 位于d:inetpubwwwroot目录下,用于检测用户输入的用户名及密码
index.asp 位于d:inetpubwwwroot目录下,虚拟社区首页
bbs.mdb 位于d:inetpubwwwroot目录下,存储用户信息的数据库
数据库(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("bs.mdb") '此处最好使用绝对路径bs.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:inetpubwwwrootbs.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("bs.mdb")改为:
application("db")=server.mappath("bbs.mdb")
然后在d:inetpubwwwroot目录下建立一个test子目录,写一个temp.asp在test目录里。
====test.asp====
<%response.write application("db")%>
================
再将temp.asp拷贝一份放在根目录下(d:inetpubwwwroot)。用记事本打开global.asa,再打开两个浏览器,浏览器a输入地址http://localhost/temp.asp,按回车,将在浏览器上输出:
d:inetpubwwwrootbs.mdb
然后,在记事本的窗口上点"文件"菜单,选"保存"(使global.asa的修改时间改变,从而使iis重启动所有服务),再在浏览器b输入地址http://localhost/test/temp.asp,按回车,在浏览器上输出的是:
d:inetpubwwwroot estbs.mdb
global.asa文件虽然是放在站点根目录下,但是如果在server.mappath中使用的是相对地址,而触发application_onstart事件的用户第一次访问的页面又不是属于根目录的话,得到数据库的物理地址将不会是期望的结果,希望大家要特别小心。
类别:web | 编辑 | 删除
| 评论(0) | 浏览(0)
全面解析asp server对象
2007-07-27 12:40
server对象提供对服务器上访问的方法和属性.大多数方法和属性是作为实用程序的功能提供的。
语法:
server.property|method
属性(property)
server对象只有一个属性:scripttimeout 程序能够运行的最大时间
方法(methods)
createobject 建立一个对象实例.
execute 执行一个asp文件
getlasterror 返回一个错误代码
htmlencode 对指定的html代码进行转换.
mappath 将一个相对路径转化为一个绝对路径.
transfer 将当前的所有状态信息发送给另一个asp文件
urlencode 以url形式转化指定的代码,包括空格
server对象的方法详细说明
createobject
语法
server.createobject( progid )
参数
progid
指定要创建的组件名称,格式如下: [vendor.]component[.version].
要点:
一般来说,用由server.createobject方法创建的对象拥有页面的范围.这就说,当这页的asp程序执行完后,这种对象会自动地消失.
为了创建一个拥有session或application范围的对象,你可以在global.asa文件中使用
execute
execute 方法呼叫一个asp文件并且执行它就像这个呼叫的asp文件存在这个asp文件中一样。这很像许多语言中的类的调用。
语法
server.execute( path )
参数
path
指定执行的那个asp文件的路径。如是它是一个绝对路径,那么它必须是一个在这个asp应用程序相同的地方(目录)。
讲解
server.execute 方法提供了一种将一个复杂asp应用程序分化为小块单位来执行的方法。通过这种方法,你能够建一个asp图书馆,你能够随便在你需要时调用你图书馆中的asp文件。这个就有点像ssi了!嘿嘿!
当iis根据指定的asp文件路径执行完这个asp文件之后,就会自动返回以前的asp文件。这个刚刚执行完的asp文件有可能改变了http head.但是和其它的asp文件一样,当程序试图改变http head时,就会报错!
这个path参数可以包括一个询问信息。
如果在被呼叫和呼叫的asp文件中都含有相同的子函数,那么这些子函数只在本asp文件中起作用。举个例子,如果在下面的asp1和asp2两个文件中都含有放弃程序的子函数。首先asp1呼叫asp2,那么asp2中的的ontransactionabort开始执行,当asp2执行完毕,asp1中的ontransactionabort才开始执行。
asp1:
< %@ transaction=
required
%>
< %
server.execute (".asp")
sub ontransactionabort
sub ontransactioncommit
%>
asp2.asp:
< %@
transaction=required
sub ontransactionabort
sub ontransactioncommit
%>
example
asp1
< % response.write("i am going to execute asp2 ")
server.execute("/myasps/asp2.asp")
%>
asp2
< % response.write("here i am")%>
getlasterror
getlasterror 方法返回一个asperror object 来描述一个错误信息.这个方法只适用于在asp文件发送任何内容给用户机之前.
语法
server.getlasterror ()
要点
如果一个500;100 用户错误已经被定义在一个asp应用程序中,它是指的一个以.asp为后缀的文件。这种情况下,在这个程序运行时当一个错误发生时,服务器就会自动的以server.transfer这种方式传送到这个正在执行的asp页面。asp应用程序就会将有效的处理这个错误。另外,这个asperror object一定要有效,这样你就能够看到服务器提供给你的错误信息来改这个文件了!
一般的web site 都是根据文件iishelpcommon500-100.asp来构造的。你能够用它来执行一个asp错误,当然你能够自己定义了!。如果你想改变为另外一个asp文件的来执行这些用户错误。那么你可以用iis中的snap-in.
注意:当iis发现了一个asp文件或者global.asa文件中的一个错误,那么一个500;100用户错误产生。以下的程序将不能执行!
example
下面的三个例子证明不同的错误会产生的用户错误。三个错误是:
编译错误
运行错误
逻辑错误
第一个例子证明了一个编译错误,就是当iis试图包含一个文件时产生的。这个错误会产生是因为在这个包含文件中没有定义所需的参数。第二个例子显示的是一个运行错误,这个程序中断的原因是程序中没有“next".第三个例子显示的是一个逻辑错误,因为这个程序试图除以一个0. 不行啦!
example 1
< %
response.write "hello"
%>
example 2
< %
dim i
for i=1 to 1
nxt
%>
example 3
< %
dim i,j
dim sum
sum=0
j=0
for i=1 to 10
sum=sum+1
next
sum=sum/j
%>
htmlencode
htmlencode方法对指定的字符串进行html编码.
语法
serverlencode( string )
参数
string 要进行编码的字符
例子
下面的程序:
< %= serverlencode("the paragraph tag: ") %>
输出为:
the paragraph tag:
注意 程序执行后在浏览器中看到的是:
the paragraph tag:
但是如果你用"查看源文件"看一下的话,源代码就不是了.
mappath
mappath 方法将相对路径转化为服务器上的物理路径
语法
server.mappath( path )
参数
path
相对路径。这个路径是以"/"或""开头的路径,如果这个路径中没有"",那么mappath方法就会返回以当前目录为基础的路径。
讲解
mappath 方法不能检查路径在这个服务器下是否存在。因为 mappath 转化路径时是不管这个路径是否在这个服务器下存在的。
你能够用它来将一个相对路径转化为一个物理路径,然后再在这个路径下进行各种操作。
example
在下面的例子中,data.txt文件存在 c:inetpubwwwrootscript 目录中,而且一个test.asp 文件包括下面的代码。c:inetpubwwwroot 是该服务器的主目录 。
下面的例子中,首先用环境变量"path_info"获得当前文件的物理路径。
下面是script 代码:
< %= server.mappath(request.servervariables("path_info"))%>
显示为:
c:inetpubwwwrootscript est.asp 因为下面的例子中路径参数没有以"/"开头,所以它是以当前目录转化的,asp文件是放在c:inetpubwwwrootscript中的.以下是 scripts的内容:
< %= server.mappath("data.txt")%>
< %= server.mappath("script/data.txt")%>
显示为:
c:inetpubwwwrootscriptdata.txt
c:inetpubwwwrootscriptscriptdata.txt
以下的两个例子是以"/"开头的.以下是scripts的内容:
< %= server.mappath("script")%>
显示为:
c:inetpubwwwrootscriptdata.txt
c:inetpubwwwrootscript
直接用"/"或""就会得到服务器的主目录:
< %= server.mappath("")%>
显示为:
c:inetpubwwwroot
c:inetpubwwwroot
transfer
transfer 方法会把一个正在执行的asp文件的所有信息传给另外一人asp文件。
语法
server.transfer (path)
参数
path
将要接收信息的asp文件的位置。
要点
当你调用server.transfer时,所有内建对象的状态信息都会包含在这次传送之中。这就是说,所有在保存在session或application中的信息都会被传送,而且,所有当前请求的信息都会被接收信息的asp文件所接受。
example
下面的例子示范了从一个asp文件传送到另一个asp文件例子!
asp1
< % dim sessvar1 response.write session.sessionid
response.write ("")
response.write("i am going to asp2 ")
server.
transfer
("/myasps/asp2.asp")
% >
1.函数array()
功能:创建一个数组变量
格式:array(list)
参数:list 为数组变量中的每个数值列,中间用逗号间隔
例子:
<% i = array ("1","2","3") %>
结果: i 被赋予为数组
2.函数Cint()
功能:将一表达式/其它类型的变量转换成整数类型(int)
格式:Cint(expression)
参数:expression 是任何有效的表达式/其它类型的变量
例子:
<%
f = "234"
response.write cINT(f) + 2
%>
结果: 236
函数Cint()将字符"234"转换 成整数234.如果表达式为空, 或者无效时,返回值为0;
3.函数:Creatobject()
功能:创建及返回一个ActiveX对象.
格式:Creatobject(obname)
参数bname 是对象的名称
例子:
<%
Set con = Server.CreateObject("ADODB.Connection")
%>
结果:
4.函数Cstr()
功能:将一表达式/其它类型的变量转换成字符类型(string)
格式:Cstr(expression)
参数:expression是任何有效的表达式/其它类型的变量
例子:
<%
s = 3 + 2
response.write "The result is: " & cStr(s)
%>
结果:函数Cstr()将整数 5 转换 成字符"5".
5.函数Date()
功能:返回当前系统(server端)的日期
格式: Date()
参数:无
例子<% date () %>
结果:05/10/00
5.1 Instr()
函数返回字符或字符串在另一个字符串中第一次出现的位置.
表达式 Instr([start, ] strToBeSearched, strSearchFor [, compare])
允许数据类型: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符.compare比较方式(详细见asp常数)
实例: <%
strText = "This is a test!!"
pos = Instr(strText, "a")
response.write pos
%>
返回结果: 9
6.函数Dateadd()
功能:计算某个指定的时间和
格式: dateadd(timeinterval,number,date)
参数:timeinterval是时间单位(月,日..); number是时间间隔值,date是时间始点.
例子:
<%
currentDate = #8/4/99#
newDate = DateAdd("m",3,currentDate)
response.write newDate
%> <%
currentDate = #12:34:45 PM#
newDate = DateAdd("h",3,currentDate)
response.write newDate
%>
结果:
11/4/99
3:34:45 PM
其中
"m" = "month";
"d" = "day";
如果是currentDate 格式,则,
"h" = "hour";
"s" = "second";
7.函数Datediff()
功能:计算某量个指定的时间差
格式: datediff(timeinterval,date1,date2[,firstdayofweek[,firstdayofyear]])
参数: timeinterval 是时间单位; date1,date2是有效的日期表达式,firstdayofweek,firstdayofyear 是任意选项.
例子:
<%
fromDate = #8/4/99#
toDate = #1/1/2000#
response.write "There are " & _
DateDiff("d",fromDate,toDate) & _
" days to millenium from 8/4/99."
%>
结果:There are 150 days to millenium from 8/4/99.
8.函数day()
功能:返回一个整数值,对应于某月的某日
格式: day(date)
参数: date是一个有效的日期表达式;
例子<% =date(#8/4/99#) %>
结果:4
9.函数formatcurrency()
功能:转换成货币格式
格式: formatcurrency(expression [,digit[,leadingdigit[,paren[,groupdigit]]]])
参数: expression 是有效的数字表达式;digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项.
例子<%=FormatCurrency(34.3456)%>
结果34.35
10.函数Formatdatetime()
功能:格式化日期表达式/变量
格式: formatdatetime(date[,nameformat])
参数: date为有效的日期表达式/变量;nameformat是指定的日期格式常量名称.
例子<% =formatdatetime("08/04/99",vblongdate) %>
结果:Wednesday,August 04,1999
说明:
描述
返回表达式,此表达式已被格式化为日期或时间。
语法
FormatDateTime(Date[, NamedFormat])
FormatDateTime 函数的语法有以下参数:
参数 描述
Date 必选项。要被格式化的日期表达式。
NamedFormat 可选项。指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate。
设置
NamedFormat 参数可以有以下值:
常数 值 描述
vbGeneralDate 0 显示日期和/或时间。如果有日期部分,则将该部分显示为短日期格式。如果有时间部分,则将该部分显示为长时间格式。如果都存在,则显示所有部分。
vbLongDate 1 使用计算机区域设置中指定的长日期格式显示日期。
vbShortDate 2 使用计算机区域设置中指定的短日期格式显示日期。
vbLongTime 3 使用计算机区域设置中指定的时间格式显示时间。
vbShortTime 4 使用 24 小时格式 (hh:mm) 显示时间。
说明
下面例子利用 FormatDateTime 函数把表达式格式化为长日期型并且把它赋给 MyDateTime:
Function GetCurrentDate
"FormatDateTime 把日期型格式化为长日期型。
GetCurrentDate = FormatDateTime(Date, 1)
End Function
11.函数Isnumeric()
功能:返回一个布尔值,判断变量是否为数字变量,或者是可以转换成数字的其它变量.
格式:isnumeric(expression)
参数:expression 是任意的变量.
例子:
<%
i="234"
response.write isnumeric(i)
%>
结果: true.
12.函数Isobject()
功能:返回一个布尔值,判断变量是否为对象的变量,
格式: isobject(expression)
参数: expression 是任意的变量.
例子:
<%
set con =server.creatobject("adodb.connection")
response.write isobject(con)
%>
结果: true
13.函数:Lbound()
功能:返回一个数组的下界.
格式:Lbound(arrayname[,dimension])
参数:arrayname 是数组变量,dimension 是任意项
例子:
<%
i = array("1","2","3")
response.write lbound(i)
%>
结果:0
14.函数Lcase()
功能:将一字符类型变量的字符全部变换小写字符.
格式:Lcase(string)
参数:string是字符串变量
例子:
<%
str="THIS is Lcase!"
response.write Lcase(str)
%>
结果:this is lcase!
15.函数left()
功能:截取一个字符串的前部分;
格式:left(string,length)
参数:string字符串,length截取的长度.
例子: <% =left("this is a test!",6) %>
结果:this i
16.函数len()
功能:返回字符串长度或者变量的字节长度
格式:len(string *varname)
参数:string字符串;varname任意的变量名称
例子:
<%
strtest="this is a test!"
response.write left(strtest)
%>
结果:15
17.函数ltrim()
功能:去掉字符串前的空格.
格式:ltrim(string)
参数:string 字符串.
例子: <% =ltrim (" this is a test!")
结果:this is a test!
18.函数Mid()
功能:从字符串中截取字符串.
格式:mid(string,start [,length])
参数:string字符串,start截取的起点,length要截取的长度.
例子:
<%
strtest="this is a test, Today is Monday!"
response.write mid(strtest,17,5)
%>
结果:Today
19.函数minute()
功能:返回一数值, 表示分钟
格式:minute(time)
参数: time是时间变量
例子lt;% =minute(#12:23:34#) %>
结果:23
20.函数month()
功能:返回一数值, 表示月份
格式:month(time)
参数:time是日期变量
例子<% =month(#08/09/99) %>
结果:9
21.函数monthname()
功能:返回月份的字符串(名称).
格式:Monthname(date [,abb])
参数: date是日期变量,abb=true时 则月份的缩写,
例子:
<% =monthname(#4/5/99#) %>
结果:April
22.函数Now()
功能:返回系统的当前时间和日期.
格式:now()
参数:无
例子:
<% =now() %>
结果: 05/10/00 8:45:32 pm
23.函数:replace()
功能:在字符串中查找,替代指定的字符串.
格式:replace(strtobesearched,strsearchfor,strreplacewith [,start[,count[,compare]]])
参数:strtobesearched是字符串; strsearchfor是被查找的子字符串;strreplacewith 是用来替代的子字符串.start,count,compare 是任意选项.
例子:
<%
strtest="this is an apple."
response.write replace(strtest,"apple","orange")
%>
结果:this is an orange.
24.函数right()
功能:截取一个字符串的后部分
格式:right(string,length)
参数:string字符串,length截取的长度.
例子:
<%
strtest="this is a test!"
response.write right(strtest,3)
%>
结果:st!
25.函数rnd()
功能:返回一个随机数值
格式:rnd[(number)]
参数:number是任意数值.
例子:
<%
randomize()
response.write rnd()
%>
结果:0/1数值之一,无randomize(), 则不能产生随机数.
26.函数round()
功能:完整数值
格式:round(expression[,numright])
参数:expression数字表达式;numright任意选项.
例子:
<%
i=12.33654
response.write round(i)
%>
结果: 12
27.函数rtrim()
功能:去掉字符串后的空格.
格式:rtrim(string)
参数:string 是字符串
例子:
<%
response.write rtrim("this is a test! ")
%>
结果:this is a test!
28.函数second()
功能:返回一个整数值.
格式:second(time)
参数:time是一个有效的时间表达式;
例子lt;% =second(# 12:28:30#) %>
结果:30
29.函数strReverse()
功能:返回与原字符串排列逆向的字符串.
格式:strreverse(string)
参数:string是字符串
例子<% =strreverse("this is a test!")
结果:!tset a si siht
30.函数time()
功能:返回当前系统的时间值.
格式:time()
参数:无
结果:9:58:28 Am
31.函数trim()
功能:删去字符串前,后的空格.
格式:trim(string)
参数:string 字符串.
例子:
<%
strtest=" this is a test! "
response.write trim(strtest)
%>
结果:this is a test!
32.函数UBound()
功能:返回一个数组的上界.
格式:Ubound(expression [,dimension])
参数:expression 是数组表达式/数组变量,dimension 是任意项
例子:
<%
i = array("1","2","3")
response.write ubound(i)
%>
结果: 2
33.函数:UCase()
功能:将一字符类型变量的字符全部变换成大写字符.
格式:Ucase(string)
参数:string是字符串变量
例子:
<%
str="THIS is Lcase!"
response.write Lcase(str)
%>
结果:THIS IS LCASE!
34.函数Vartype()
功能:返回变量的常量代码(整数)
格式:Vartype(varname)
参数:varname是任何类型的变量名称.
例子:
<%
i=5
response.write vartype(i)
%>
结果:2 (2表示整数,须要参考asp常量代码.)
35.函数Weekday()
功能:返回一个整数,对应一周中的第几天.
格式:Weekday(date [,firstofweek])
参数: date为日期变量,firstofweek为任选项.
例子:
<%
d= # 5/9/00 #
response.write weekday(d) %>
结果:3(3 表示是星期二)
36.函数weekdayname()
功能:返回字符串,对应星期几.
格式:weekdayname(weekday[,abb[,firstdayofweek]])
参数:weekday为日期变量,abb,firstdayofweek为任选项.
例子:
<%
d = #8/4/99#
response.write weekdayname(d)
%>
结果: Wednesday
37.函数year()
功能:返回日期表达式所在的年份.
格式:year(date)
参数: date是有效的日期表达式
例子:
<% =year(#8/9/99#) %>
结果:1999
38.函数Mod()功能:取余数.
例子:3 Mod 2
结果:1
附录5:asp网页提升速度方法5则
技巧之一:提高使用Request集合的效率
访问一个asp集合来提取一个值是费时的、占用计算资源的过程。因为这个操作包含了一系列对相关集合的搜索,这比访问一个局部变量要慢得多。因此,如果打算在页面中多次使用Request集合中的一个值,应该考虑将其存贮为一个局部变量。例如将代码写成下面的形式以加快脚本引擎处理速度:
strTitle=Request.Form("Title")
strFirstName=Request.Form("FirstName")
strLastName=Request.Form("LastName")
If Len(strTitle) Then strTitle=strTitle & " "
If strFirstName="" Then strFullName=strTitle & " " & strLastName
Elseif Len(strFirstName)=1 Then
strFullName=strTitle & strFirstName & ". " & strLastName
Else
strFullName=strTitle & strFirstName & " " & strLastName
End If
技巧之二:直接访问适当的集合
如果不是别无选择,否则不要使用strPage=Request("page")的这样的形式来获取参数,因为这将按顺序搜索全部的集合—QueryString、Form、Cookies、ClientCertificate、ServerVarible直到发现第一个匹配值的名称。这样做比直接访问适当的集合效率低,并且是不安全的,除非能绝对保证这个值不会出现在另外一个集合中。
例如,可能希望搜索满足客户请求的WEB服务器名称,这通过出现在每个查询中的Request.ServerVarables集合中寻找“SERVER_NAME”来实现。然而,假如其他的集合也包含名为“SERVER_NAME”的值(键名不区分大小写),当使用Request("server_Name")时,就会得到错误的结果。总而言之,应尽可能直接访问适当的集合。
技巧之三:在费时操作前使用Response.IsClientConnected属性
使用Response.IsClientConnected是观察用户是否仍连到服务器并正在载入asp创建的网页的有用方式。如果用户断开连接或停止下载,我们就不用再浪费服务器的资源创建网页,因为缓冲区内容将被IIS丢弃。所以,对那些需要大量时间计算或资源使用较多的网页来说,值得在每一阶段都检查游览者是否已离线:
…… Code to create first part of the page
If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If
…… Code to create next part of page
技巧之四:优化asp中的ADO操作
通常面言,数据构成了WEB站点的实际内容。所以,优化ADO操作以加速asp代码执行,十分有用:
a.仅选择所需的列:当打开ADO记录集时,除非需要获得所有的列,否则不应自动地使用表名(即SELECT*)。使用单独的列意味着将减少发送到服务器或从服务器取出的数据量。即使需要使用全部列,单独地命名每个列也会获得最佳的性能,因为服务器不必再解释这些列的名字。
b. 尽可能的使用存储过程。存储过程是预先编译的程序,含有一个已经准备好的执行计划,所以比SQL语句执行更快。
c. 使用适当的光标和锁定模式。如果所做的全部工作只是从记录集中读取数据,并将其显示在屏幕上,那么就使用缺省的只能前移、只读的记录集。ADO用来维护记录和锁定的细节的工作越少,执行的性能就越高。
d. 使用对象变量。当遍历记录集时一个肯定能提高性能的方法是使用对象变量指向集合中的成员。例如:
While Not RsGc.EOF
Response.Write "工程名称:" & RsGc("GcMC") & "(工程代码:" & RsGc("GcCode") & ")
"
RsGc.MoveNext
Wend
可以用改写为下面的代码以加快执行:
set GcMc=RsGc("GcMc")
set GcCode=RsGc("GcCode")
While Not rsGc.EOF Response.Write "工程名称:" & GcMc & "(工程代码:" & GcCode & ")
" RsGc.MoveNext
Wend
新的代码建立了对象变量的引用,所以可以使用对象变量而不是实际的变量,这意味着脚本引擎的工作减少了,因为在集合中进行索引的次数变少了。
技巧五:不要混用脚本引擎
我们知道,asp页面中既可以使用VBScript,也可以使用JScript。但是在同一个页面上同时使用JScript和VBScript则是不可取的。因为服务器必须实例化并尝试缓存两个(而不是一个)脚本引擎,这在一定程度上增加了系统负担。因此,从性能上考虑,不应在同一页面中混用多种脚本引擎。
附录4:asp常用函数介绍
1.函数array()
功能:创建一个数组变量
格式:array(list)
参数:list 为数组变量中的每个数值列,中间用逗号间隔
例子:
<% i = array ("1","2","3") %>
结果: i 被赋予为数组
2.函数Cint()
功能:将一表达式/其它类型的变量转换成整数类型(int)
格式:Cint(expression)
参数:expression 是任何有效的表达式/其它类型的变量
例子:
<%
f = "234"
response.write cINT(f) + 2
%>
结果: 236
函数Cint()将字符"234"转换 成整数234.如果表达式为空, 或者无效时,返回值为0;
3.函数:Creatobject()
功能:创建及返回一个ActiveX对象.
格式:Creatobject(obname)
参数bname 是对象的名称
例子:
<%
Set con = Server.CreateObject("ADODB.Connection")
%>
结果:
4.函数Cstr()
功能:将一表达式/其它类型的变量转换成字符类型(string)
格式:Cstr(expression)
参数:expression是任何有效的表达式/其它类型的变量
例子:
<%
s = 3 + 2
response.write "The result is: " & cStr(s)
%>
结果:函数Cstr()将整数 5 转换 成字符"5".
5.函数Date()
功能:返回当前系统(server端)的日期
格式: Date()
参数:无
例子<% date () %>
结果:05/10/00
5.1 Instr()
函数返回字符或字符串在另一个字符串中第一次出现的位置.
表达式 Instr([start, ] strToBeSearched, strSearchFor [, compare])
允许数据类型: Start为搜索的起始值,strToBeSearched接受搜索的字符串 strSearchFor要搜索的字符.compare比较方式(详细见asp常数)
实例: <%
strText = "This is a test!!"
pos = Instr(strText, "a")
response.write pos
%>
返回结果: 9
6.函数Dateadd()
功能:计算某个指定的时间和
格式: dateadd(timeinterval,number,date)
参数:timeinterval是时间单位(月,日..); number是时间间隔值,date是时间始点.
例子:
<%
currentDate = #8/4/99#
newDate = DateAdd("m",3,currentDate)
response.write newDate
%> <%
currentDate = #12:34:45 PM#
newDate = DateAdd("h",3,currentDate)
response.write newDate
%>
结果:
11/4/99
3:34:45 PM
其中
"m" = "month";
"d" = "day";
如果是currentDate 格式,则,
"h" = "hour";
"s" = "second";
7.函数Datediff()
功能:计算某量个指定的时间差
格式: datediff(timeinterval,date1,date2[,firstdayofweek[,firstdayofyear]])
参数: timeinterval 是时间单位; date1,date2是有效的日期表达式,firstdayofweek,firstdayofyear 是任意选项.
例子:
<%
fromDate = #8/4/99#
toDate = #1/1/2000#
response.write "There are " & _
DateDiff("d",fromDate,toDate) & _
" days to millenium from 8/4/99."
%>
结果:There are 150 days to millenium from 8/4/99.
8.函数day()
功能:返回一个整数值,对应于某月的某日
格式: day(date)
参数: date是一个有效的日期表达式;
例子<% =date(#8/4/99#) %>
结果:4
9.函数formatcurrency()
功能:转换成货币格式
格式: formatcurrency(expression [,digit[,leadingdigit[,paren[,groupdigit]]]])
参数: expression 是有效的数字表达式;digit表示小数点后的位数;leadingdigit,paren,groupdigit是任意选项.
例子<%=FormatCurrency(34.3456)%>
结果34.35
10.函数Formatdatetime()
功能:格式化日期表达式/变量
格式: formatdatetime(date[,nameformat])
参数: date为有效的日期表达式/变量;nameformat是指定的日期格式常量名称.
例子<% =formatdatetime("08/04/99",vblongdate) %>
结果:Wednesday,August 04,1999
说明:
描述
返回表达式,此表达式已被格式化为日期或时间。
语法
FormatDateTime(Date[, NamedFormat])
FormatDateTime 函数的语法有以下参数:
参数 描述
Date 必选项。要被格式化的日期表达式。
NamedFormat 可选项。指示所使用的日期/时间格式的数值,如果省略,则使用 vbGeneralDate。
设置
NamedFormat 参数可以有以下值:
常数 值 描述
vbGeneralDate 0 显示日期和/或时间。如果有日期部分,则将该部分显示为短日期格式。如果有时间部分,则将该部分显示为长时间格式。如果都存在,则显示所有部分。
vbLongDate 1 使用计算机区域设置中指定的长日期格式显示日期。
vbShortDate 2 使用计算机区域设置中指定的短日期格式显示日期。
vbLongTime 3 使用计算机区域设置中指定的时间格式显示时间。
vbShortTime 4 使用 24 小时格式 (hh:mm) 显示时间。
说明
下面例子利用 FormatDateTime 函数把表达式格式化为长日期型并且把它赋给 MyDateTime:
Function GetCurrentDate
"FormatDateTime 把日期型格式化为长日期型。
GetCurrentDate = FormatDateTime(Date, 1)
End Function
11.函数Isnumeric()
功能:返回一个布尔值,判断变量是否为数字变量,或者是可以转换成数字的其它变量.
格式:isnumeric(expression)
参数:expression 是任意的变量.
例子:
<%
i="234"
response.write isnumeric(i)
%>
结果: true.
12.函数Isobject()
功能:返回一个布尔值,判断变量是否为对象的变量,
格式: isobject(expression)
参数: expression 是任意的变量.
例子:
<%
set con =server.creatobject("adodb.connection")
response.write isobject(con)
%>
结果: true
13.函数:Lbound()
功能:返回一个数组的下界.
格式:Lbound(arrayname[,dimension])
参数:arrayname 是数组变量,dimension 是任意项
例子:
<%
i = array("1","2","3")
response.write lbound(i)
%>
结果:0
14.函数Lcase()
功能:将一字符类型变量的字符全部变换小写字符.
格式:Lcase(string)
参数:string是字符串变量
例子:
<%
str="THIS is Lcase!"
response.write Lcase(str)
%>
结果:this is lcase!
15.函数left()
功能:截取一个字符串的前部分;
格式:left(string,length)
参数:string字符串,length截取的长度.
例子: <% =left("this is a test!",6) %>
结果:this i
16.函数len()
功能:返回字符串长度或者变量的字节长度
格式:len(string *varname)
参数:string字符串;varname任意的变量名称
例子:
<%
strtest="this is a test!"
response.write left(strtest)
%>
结果:15
17.函数ltrim()
功能:去掉字符串前的空格.
格式:ltrim(string)
参数:string 字符串.
例子: <% =ltrim (" this is a test!")
结果:this is a test!
18.函数Mid()
功能:从字符串中截取字符串.
格式:mid(string,start [,length])
参数:string字符串,start截取的起点,length要截取的长度.
例子:
<%
strtest="this is a test, Today is Monday!"
response.write mid(strtest,17,5)
%>
结果:Today
19.函数minute()
功能:返回一数值, 表示分钟
格式:minute(time)
参数: time是时间变量
例子lt;% =minute(#12:23:34#) %>
结果:23
20.函数month()
功能:返回一数值, 表示月份
格式:month(time)
参数:time是日期变量
例子<% =month(#08/09/99) %>
结果:9
21.函数monthname()
功能:返回月份的字符串(名称).
格式:Monthname(date [,abb])
参数: date是日期变量,abb=true时 则月份的缩写,
例子:
<% =monthname(#4/5/99#) %>
结果:April
22.函数Now()
功能:返回系统的当前时间和日期.
格式:now()
参数:无
例子:
<% =now() %>
结果: 05/10/00 8:45:32 pm
23.函数:replace()
功能:在字符串中查找,替代指定的字符串.
格式:replace(strtobesearched,strsearchfor,strreplacewith [,start[,count[,compare]]])
参数:strtobesearched是字符串; strsearchfor是被查找的子字符串;strreplacewith 是用来替代的子字符串.start,count,compare 是任意选项.
例子:
<%
strtest="this is an apple."
response.write replace(strtest,"apple","orange")
%>
结果:this is an orange.
24.函数right()
功能:截取一个字符串的后部分
格式:right(string,length)
参数:string字符串,length截取的长度.
例子:
<%
strtest="this is a test!"
response.write right(strtest,3)
%>
结果:st!
25.函数rnd()
功能:返回一个随机数值
格式:rnd[(number)]
参数:number是任意数值.
例子:
<%
randomize()
response.write rnd()
%>
结果:0/1数值之一,无randomize(), 则不能产生随机数.
26.函数round()
功能:完整数值
格式:round(expression[,numright])
参数:expression数字表达式;numright任意选项.
例子:
<%
i=12.33654
response.write round(i)
%>
结果: 12
27.函数rtrim()
功能:去掉字符串后的空格.
格式:rtrim(string)
参数:string 是字符串
例子:
<%
response.write rtrim("this is a test! ")
%>
结果:this is a test!
28.函数second()
功能:返回一个整数值.
格式:second(time)
参数:time是一个有效的时间表达式;
例子lt;% =second(# 12:28:30#) %>
结果:30
29.函数strReverse()
功能:返回与原字符串排列逆向的字符串.
格式:strreverse(string)
参数:string是字符串
例子<% =strreverse("this is a test!")
结果:!tset a si siht
30.函数time()
功能:返回当前系统的时间值.
格式:time()
参数:无
结果:9:58:28 Am
31.函数trim()
功能:删去字符串前,后的空格.
格式:trim(string)
参数:string 字符串.
例子:
<%
strtest=" this is a test! "
response.write trim(strtest)
%>
结果:this is a test!
32.函数UBound()
功能:返回一个数组的上界.
格式:Ubound(expression [,dimension])
参数:expression 是数组表达式/数组变量,dimension 是任意项
例子:
<%
i = array("1","2","3")
response.write ubound(i)
%>
结果: 2
33.函数:UCase()
功能:将一字符类型变量的字符全部变换成大写字符.
格式:Ucase(string)
参数:string是字符串变量
例子:
<%
str="THIS is Lcase!"
response.write Lcase(str)
%>
结果:THIS IS LCASE!
34.函数Vartype()
功能:返回变量的常量代码(整数)
格式:Vartype(varname)
参数:varname是任何类型的变量名称.
例子:
<%
i=5
response.write vartype(i)
%>
结果:2 (2表示整数,须要参考asp常量代码.)
35.函数Weekday()
功能:返回一个整数,对应一周中的第几天.
格式:Weekday(date [,firstofweek])
参数: date为日期变量,firstofweek为任选项.
例子:
<%
d= # 5/9/00 #
response.write weekday(d) %>
结果:3(3 表示是星期二)
36.函数weekdayname()
功能:返回字符串,对应星期几.
格式:weekdayname(weekday[,abb[,firstdayofweek]])
参数:weekday为日期变量,abb,firstdayofweek为任选项.
例子:
<%
d = #8/4/99#
response.write weekdayname(d)
%>
结果: Wednesday
37.函数year()
功能:返回日期表达式所在的年份.
格式:year(date)
参数: date是有效的日期表达式
例子:
<% =year(#8/9/99#) %>
结果:1999
38.函数Mod()功能:取余数.
例子:3 Mod 2
结果:1