请输入您要查询的百科知识:

 

词条 asp
释义 aspASP是Active Server Page的缩写,意为“活动服务器网页”。ASP是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具。ASP的网页文件的格式是.asp,现在常用于各种动态网站中。

§ 基本概述

aspASP是一种服务器端脚本编写环境,可以用来创建和运行动态网页或Web应用程序。ASP网页可以包含HTML标记、普通文本、脚本命令以及COM组件等。利用ASP可以向网页中添加交互式内容(如在线表单),也可以创建使用HTML网页作为用户界面的web应用程序。 与HTML相比,ASP网页具有以下特点:

(1)利用ASP可以实现突破静态网页的一些功能限制,实现动态网页技术;

(2)ASP文件是包含在HTML代码所组成的文件中的,易于修改和测试;

(3)服务器上的ASP解释程序会在服务器端制定ASP程序,并将结果以HTML格式传送到客户端浏览器上,因此使用各种浏览器都可以正常浏览ASP所产生的网页;

(4)ASP提供了一些内置对象,使用这些对象可以使服务器端脚本功能更强。例如可以从web浏览器中获取用户通过HTML表单提交的信息,并在脚本中对这些信息进行处理,然后向web浏览器发送信息;

(5)ASP可以使用服务器端ActiveX组件来执行各种各样的任务,例如存取数据库、发现哦那个Email或访问文件系统等。

(6)由于服务器是将ASP程序执行的结果以HTML格式传回客户端浏览器,因此使用者不会看到ASP所编写的原始程序代码,可防止ASP程序代码被窃取。

§ 工作原理

asp当在Web站点中融入ASP功能后,将发生以下事情:

1、用户向浏览器地址栏输入网址,默认页面的扩展名是.asp。

2、浏览器向服务器发出请求。

3、服务器引擎开始运行ASP程序。

4、ASP文件按照从上到下的顺序开始处理,执行脚本命令,执行HTML页面内容。

5、页面信息发送到浏览器。

§ 运行环境

aspASP需要运行在PWS或IIS下。PWS或IIS服务在windows98或windows2000的光盘上附带着,可以通过“添加/删除程序”中的“添加/删除windows组件”来安装。

一般asp需与access数据库或SQL Server数据库结合使用,编出功能强大的程序。

能够运行ASP的web服务器软件Windows2000默认安装的是IIS5.0(internet information server),而windows xp默认安装的是IIS5.1,windows 2003默认安装的IIS6.0。

PWS(personal web server)运行在windows98环境下的简单个人网页服务器。

§ 意涵概述

aspASP( Application Service Provider,应用软体租赁服务提供者 )即是指“透过网路以租赁方式提供应用软体服务的业者”,即是指业者以应用软体为主体,透过网路一对多地传递服务,这种以服务为主的交易模式促使企业可藉由租赁的方式,以更符合成本效益的方式拥有软体的使用权,并且亦能因为业者集中式的管理而大幅降低企业维护的成本。基本上,ASP即具有“软体服务化,服务网路化”,“资讯委外服务与网路结合”与“产品通路化,通路产品化”等三大特性,其甚至可以被视为是ISP(Internet Service Provider)与ITS(Information Technology Service)的结合。

ASP的英文是Application Service Provider,中文的标准翻译就是“应用服务提供商”,是指为商业或者个人客户提供管理应用解决方案的公司或者企业。最近 ASP被媒体炒做十分火热,不是IT行业的人面对一堆技术名词专业术语很难弄清楚ASP的内容,本文试图用浅显的语言来为广大的读者揭开ASP神秘的面纱,对于IT行业的大热门ASP领域有一些基本的认识。

§ 定义阐述

aspASP是为客户提供服务的服务商,它和会计事物所、婚姻介绍所没有什么本质方面的区别。不同的是ASP主要是通过INTERNET(国际互联网络)作为主要工作和业务工具,采用一对多的方式,向企业、公司提供标准化的应用软件以及相关的技术咨询、管理租赁的服务,ASP的概念最早是1998年由美国人提出来的。目前被全球各大IT厂商看好并被认为是可以推动网络经济发展的,有稳固基础的第三种网络商业模式。

和传统的外包服务(Outsourcing)相比,ASP的主要区别在于:ASP是一对多的经营模式,提供的服务有兼容性和可协调性,并且ASP的收费方式一般是按月收费。

业界认为:ASP一般有这样一些“成员”:电信运营商、传统IT服务厂商、互联网络接入服务商(ISP)、独立软件供应商(ISV)、系统集成商和单纯的ASP公司。

根据流行的观点,ASP有如下五个核心内涵:

a、ASP着重应用为中心,提供对于应用方面的访问和管理。

b、ASP服务可以为用户提供没有在服务器、人员、系统和系统授权等前期资源投入情况下就可以在“定制”的全新应用系统环境进行访问的服务,如ISP,而这样的服务一般按月份ASP收取服务费。

c、ASP采用集中管理的方式---ASP一般都有一个管理中心,所有的客户通过INTERNET来进行远程访问,获得技术支持和咨询服务。

d、一对多的服务,也就是讲,ASP提供的是标准化的产品包,产品都是最低程度的自定义或者没有实现客户定制化,对于行业用户来讲已经达到实用方便的标准。

e、按照合同交付,在ASP客户的眼中,ASP是一家根据客户协议内容提供相关服务,保证应用服务系统服务可以得到确实履行的机构。

§ 应用范围

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以网络服务商、软件厂商和ISP为主力的各种IT角色,正在根据自己的优势条件出发对ASP领域进行多种方面的尝试。就目前阶段来讲,ASP提供的服务不计其数五花八门,没有标准化和量化的概念,硬件厂商向ASP的“土壤”和势力方向靠拢,软件厂商和ISP则直接参与到ASP业务的第一线。

笔者估计,经过一段时间的试探和发展,ASP将向服务集成方面发展,产品和服务初步的标准化将很快建立起来,接着进入到市场细化和标准制定、ASP产品成熟时期,ASP的稳步增长,最终将成为IT行业商务模式的核心。

在ASP发展的道路上,主要面临的问题是观念的转变方面:用租赁代替购买,服务集成代替产品经销商、服务经济代替产品经济等等。具体到实际方面来讲,安全和服务的质量是ASP和客户共同关心的头等大事,要实现ASP提出的“租赁高科技”的口号,ASP任重而道远!

§ 内置函数

asp1、日期/时间函数

这些函数包括对“年”、“月”、“日”、“时”、“分”、“秒”、“星期”等的显示。

(1)Now函数:根据计算机系统设定的日期和时间,返回当前的日期和时间值。使用方法now();

(2)Date函数:只返回当前计算机系统设定的日期值。使用方法:date();

(3)Time函数:只返回当前计算机系统设定的时间值。使用方法:time();

(4)Year函数:返回一个代表某年的整数。使用方法:year(date),其中date参数是任意的可以代表日期的参数,比如“year(date())”就表示是从“date()”得出的日期中提取其中“年”的整数。

另外,还可以这样应用:“year(#5 20,2006#)”表示提取“2006年5月20日”中“年”的整数值。关于“5 20,2006”,也可使用“5-20-2006”、“5/20/2006”等形式表现,即“某月某日”和“某年”的组合。同时注意使用“#”进行包括以表示日期值。

(5)Month函数:返回1到12之间的整数值,表示一年中某月。使用方法:month(date)。关于参数date的说明和year函数相同。但要注意日期的正确性,比如“#13-31-2006#”,根本就没有“13”月,肯定是错误的了。

(6)Day函数:返回1到31之间的整数值,表示一个月中的某天。使用方法:day(date)。关于参数date的说明和year函数相同。同样要注意日期的正确性,比如“#2-30-2006#”其中对“2”月定义的“30”日这天就是错误的。

(7)Hour函数:返回0到23之间的整数值,表示一天中的某个小时。使用方法:hour(time)。其中参数time是任意的可代表时间的表达式。比如“hour(time())”就表示是从“time()”得出的时间中提取其中“小时”的整数。同样,参数time还可以这样应用“hour(#11:45:50#)”表示从“11”时“45”分“50”秒中提取当前小时数。当然,定义的时间要符合时间的规范。

(8)Minute函数:返回0到59之间的整数值,表示一小时中的某分钟。使用方法:minute(time)。time参数的说明和hour函数相同。

(9)Second函数:返回0到59之间的整数值,表示一分钟中的某秒。使用方法:second(time)。time参数的说明和hour函数相同。

(10)Weekday函数:返回一个星期中某天的整数。使用方法:weekday(date)。关于参数date的说明和year函数相同。该函数返回值为“1”到“7”,分别代表“星期日”、“星期一”…“星期六”。比如当返回值是“4”时就表示“星期三”。

(11)WeekDayName函数:返回一个星期中具体某天的字符串。相对weekday函数而言即翻译出“星期几”,使用方法:weekdayname(weekday)。参数weekday即星期中具体某天的数值。比如“weekdayname(weekday(date()))”就表示当前是“星期几”。因为“date()”表示的是当前的时间,而“weekday(date())”就表示的是一星期中具体某天的整数。

当然weekdayname函数最终显示的字符串内容还与当前操作系统语系有关,比如中文操作系统将显示“星期一”这类的中文字符,而英文操作系统则显示为“Mon”(Monday简写)。

在VBScript中还有一些关于时间间隔的计算函数:

(1)DateAdd函数:返回指定时间间隔的日期、时间。可以计算出相隔多少年、或相隔几个月、又或相隔几个小时等的新日期、时间。使用方法:dateadd(interval, number, date)。

其中参数interval表示需要添加的时间间隔单位。其是以字符串的形式表达的,比如“yyyy”表示年,“q”表示季度,“m”表示月份,“d”表示天数,“ww”表示周数,“h”表示小时数,“n”表示分钟数,“s”表示秒数。

而参数number则表示添加的时间间隔数。其是以数值的形式表达的,可以为负值。参数date则要求是日期、时间的正确格式。

比如dateadd("d",100,"2006-5-20")就表示2006年5月20号以后的100天的日期值:2006-8-28。再比如dateadd("h",-12,"2005-5-20 10:00:00")就表示2005年5月20号上午10点前的12小时的日期时间:2005-5-19 22:00:00。

(2)DateDiff函数:返回两个日期时间之间的间隔。可计算出两个日期相隔的年代、小时数等。使用方法:datediff(interval,date1,date2)。

参数interval和dateadd函数中的interval参数内容描述相同,date1和date2参数分别就是相互比较的两个日期时间。另外,当date1的日期时间值大于date2时,将显示为负值。

比如DateDiff("yyyy","1982-7-18",date)表示某人的出生到现在已经多少年了。又比如DateDiff("d","1982-7-18","2062-7-18")则计算了80年过了多少天:29220。asp2、字符串处理函数

在脚本的功能处理中,通常需要对一些字符串进行一些修饰性处理。比如过滤掉字符串中的敏感字眼以符合最终显示的要求;又比如一段较长的字符串,需要提取开头的几个字符时。

(1)Asc函数:返回字符串中第一个字母对应的ANSI字符代码。使用方法:asc(string)。其中string参数表示字符串。

(2)Chr函数:返回指定了ANSI 字符代码对应的字符。使用方法:chr(chrcode)。参数chrcode是相关的标识数字。该函数的功能和asc函数形成对应。

比如:asc(“a”)表示小写字母“a”的ANSI 字符“97”;同样chr(97)表示的就是“小写字母a”。另外chr(chrcode)中参数chrcode值为0到31的数字时,表示不可打印的ASCII码。比如“chr(10)”表示换行符,“chr(13)”表示回车符等,这常用于输入和显示格式的转换中。

(3)Len函数:返回字符串内字符的数目(字节数)。使用方法:len(string)。比如len(“love”)的值就是4。

(4)LCase函数:返回所有字符串的小写形式。使用方法:lcase(string)。比如lcase(“CNBruce”)返回为“cnbruce”。

(5)UCase函数:返回所有字符串的大写形式。与lcase函数形成对应。同样,ucase(“CNBruce”)返回为“CNBRUCE”。

(6)Trim函数、LTrim函数和RTrim函数:分别返回前导和后续不带空格、前导不带空格或后续不带空格的字符串内容。比如:

trim(“ cnbruce ”)返回为“cnbruce”,前导和后续都不带空格;

ltrim(“ cnbruce ”)返回为“cnbruce ”,前导不带空格;

rtrim(“ cnbruce ”)返回为“ cnbruce”,后续不带空格;

该函数常用于注册信息中,比如确保注册用户名前或后的空格。

(7)Left函数:返回从字符串的左边算起的指定数目的字符。使用方法:left(string,length)。比如left(“brousce”,5)返回为“brous”,即前五位字符。

(8)Right函数:返回从字符串的左边算起的指定数目的字符。使用方法:right(string,length)。比如right(“brousce”,4)返回为“usce”,即后四位字符。

(9)instr函数:返回某字符串在另一字符串中第一次出现的位置。比如现在查找字母“A”在字符串“A110B121C119D1861”中第一次出现的位置,则可以 instr(my_string,"A110B121C119D1861")

(10)Mid函数:从字符串中返回指定数目的字符。比如现在的“110”则应该是从字符串“A110B121C119D1861”的第2位取得3个单位的值:mid("A110B121C119D1861",2,3)

(11)Replace函数:在字符串中查找、替代指定的字符串。replace(strtobesearched,strsearchfor,strreplacewith)其中strtobesearched是字符串,strsearchfor是被查找的子字符串,strreplacewith是用来替代的子字符串。比如 replace(rscon,“<”,“<") 则表示将rscon中所有“<”的字符替换为“<”。

3、类型转换函数

Cbool(string) 转换为布尔值

Cbyte(string) 转换为字节类型的值

Ccur(string) 转换为货币类值

Cdate(string) 转换为日前类型的值

Cdbl(string) 转换为双精度值

Cint(string) 转换为整数值

Clng(string) 转换为长整型的值

Csng(string) 转换为单精度的值

Cstr(var) 转换为字符串值

Str(var) 数值转换为字符串

Val(string) 字符串转换为数值

4、运算函数

Abs(nmb) 返回数子的绝对值

Atn(nmb) 返回一个数的反正切

Cos(nmb) 返回一个角度的余炫值

Exp(nmb) 返回自然指数的次方值

Int(nmb) 返回数字的整形(进位)部份

Fix(nmb) 返回数字的整形(舍去)部份

Formatpercent(表达式) 返回百分比

Hex(nmb) 返回数据的16进制数

Log(nmb) 返回自然对数

Oct(nmb) 返回数字的8进制数

Rnd 返回大于“0”而小于“1”的随机数,但此前需 randomize 声明产生随机种子

Sgn(nmb) 判断一个数字的正负号

Sin(nmb) 返回角度的正铉值

Sqr(nmb) 返回数字的二次方根

Tan(nmb) 返回一个数的正切值

5、其他函数

IsArray(var) 判断一个变量是否是数组

IsDate(var) 判断一个变量是否是日期

IsNull(var) 判断一个变量是否为空

IsNumeric(var) 判断表达式是否包含数值

IsObject(var) 判断一个变量是否是对象

TypeName(var) 返回变量的数据类型

Array(list) 返回数组

Split(liststr) 从一个列表字符串中返回一个一维数组

LBound(arrayP 返回数组的最小索引

Ubound(array) 返回数组的最大索引

CreateObject(class) 创建一个对象

GetObject(pathfilename) 得到文件对象

§ 成员对象

asp一、Application对象的成员概述

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

1、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")的方法,因为这样更为直观,如果用序号来表示的话则要考虑赋值的先后顺序。

2、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.writeapplication.contents(1)&"

"

response.writeapplication.contents(2)&"

"

response.writeapplication.contents(3)&"

"

response.write"AfterRemoveb:"

application.contents.remove("b")

response.writeapplication.contents(1)&"

"

response.writeapplication.contents(2)&"

"

执行结果:

a

128

False

AfterRemoveb:

a

False

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

3、Application对象事件

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

OnEnd:当最后一个用户的会话已经结束并且该会话的OnEnd事件所有代码已经执行完毕后发生,或最后一个用户访问服务器一段时间(一般为20分钟)后仍然没有人访问该服务器产生。想要定义application对象的OnStart和OnEnd事件里做什么需要将代码写在Global.asa这个文件里(下文有举例),并且将该文件放在站点的根目录下(一般是Inetpubwwwroot)asp二、Session对象的成员概述

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

1、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

2、Session对象的属性

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

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

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

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

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

3、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事件,注意两者的区别。

4、Session对象的事件

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

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

这两个事件和Application的OnStart、OnEnd事件一样,也是必须放在Global.asa文件里,下

面就重点和大家研究一下这四个事件的使用。asp三、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===

<scriptLANGUAGE="VBScript"RUNAT="Server">

SubApplication_OnStart

application("online")=0

EndSub

subApplication_OnEnd

ndSub

SubSession_OnStart

EndSub

SubSession_OnEnd

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

application.lock

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

application.unlock

endif

EndSub

</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

endif

application.lock

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

conn.Execute("updatebbssetonline=1whereid="&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:inetpubwwwrootbbs.mdb)存储在application变量中,并在Application_OnStart事件中预先处理。同理,在Session_OnEnd事件中不能用session("pass")来代替session.contents("pass")(以下有详尽说明)。asp四、本文实例中值得引起注意的两点

1、OnEnd事件里的session.contents刚开始接触global.asa的朋友经常会将上面Session_OnEnd事件里的if session.contents("pass") then 写成if session("pass") then,这样的话系统不会提示错误,但是永远也不会执行then后面的内容,这是因为在OnEnd事件里禁止使用Session对象,但是可以用Session对象的集合来调用session变量。因为IIS并没提示任何错误信息,所以笔者曾经在这上面浪费了很多时间。在此希望大家引以为鉴。

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

application("db")=Server.MapPath("bbs.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:inetpubwwwrootbbs.mdb

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

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

§ 集合列表

aspRequest.ServerVariables("Url")

返回服务器地址

Request.ServerVariables("Path_Info")

客户端提供的路径信息

Request.ServerVariables("Appl_Physical_Path")

与应用程序元数据库路径相应的物理路径

Request.ServerVariables("Path_Translated")

通过由虚拟至物理的映射后得到的路径

Request.ServerVariables("Script_Name")

执行脚本的名称

Request.ServerVariables("Query_String")

查询字符串内容

Request.ServerVariables("Http_Referer")

请求的字符串内容

Request.ServerVariables("Server_Port")

接受请求的服务器端口号

Request.ServerVariables("Remote_Addr")

发出请求的远程主机的IP地址

Request.ServerVariables("Remote_Host")

发出请求的远程主机名称

Request.ServerVariables("Local_Addr")

返回接受请求的服务器地址

Request.ServerVariables("Http_Host")

返回服务器地址

Request.ServerVariables("Server_Name")

服务器的主机名、DNS地址或IP地址

Request.ServerVariables("Request_Method")

提出请求的方法比如GET、HEAD、POST等等

Request.ServerVariables("Server_Port_Secure")

如果接受请求的服务器端口为安全端口时,则为1,否则为0

Request.ServerVariables("Server_Protocol")

服务器使用的协议的名称和版本

Request.ServerVariables("Server_Software")

应答请求并运行网关的服务器软件的名称和版本

Request.ServerVariables("All_Http")

客户端发送的所有HTTP标头,前缀HTTP_

Request.ServerVariables("All_Raw")

客户端发送的所有HTTP标头,其结果和客户端发送时一样,没有前缀HTTP_

Request.ServerVariables("Appl_MD_Path")

应用程序的元数据库路径

Request.ServerVariables("Content_Length")

客户端发出内容的长度

Request.ServerVariables("Https")

如果请求穿过安全通道(SSL),则返回ON如果请求来自非安全通道,则返回OFF

Request.ServerVariables("Instance_ID")

IIS实例的ID号

Request.ServerVariables("Instance_Meta_Path")

响应请求的IIS实例的元数据库路径

Request.ServerVariables("Http_Accept_Encoding")

返回内容如:gzip,deflate

Request.ServerVariables("Http_Accept_Language")

返回内容如:en-us

Request.ServerVariables("Http_Connection")

返回内容:Keep-Alive

Request.ServerVariables("Http_Cookie")

Request.ServerVariables("Http_User_Agent")

返回内容:Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1;SV1)

Request.ServerVariables("Https_Keysize")

安全套接字层连接关键字的位数,如128

Request.ServerVariables("Https_Secretkeysize")

服务器验证私人关键字的位数如1024

Request.ServerVariables("Https_Server_Issuer")

服务器证书的发行者字段

Request.ServerVariables("Https_Server_Subject")

服务器证书的主题字段

Request.ServerVariables("Auth_Password")

当使用基本验证模式时,客户在密码对话框中输入的密码

Request.ServerVariables("Auth_Type")

是用户访问受保护的脚本时,服务器用於检验用户的验证方法

Request.ServerVariables("Auth_User")

代证的用户名

Request.ServerVariables("Cert_Cookie")

唯一的客户证书ID号

Request.ServerVariables("Cert_Flag")

客户证书标志,如有客户端证书,则bit0为0如果客户端证书验证无效,bit1被设置为1

Request.ServerVariables("Cert_Issuer")

用户证书中的发行者字段

Request.ServerVariables("Cert_Keysize")

安全套接字层连接关键字的位数,如128

Request.ServerVariables("Cert_Secretkeysize")

服务器验证私人关键字的位数如1024

Request.ServerVariables("Cert_Serialnumber")

客户证书的序列号字段

Request.ServerVariables("Cert_Server_Issuer")

服务器证书的发行者字段

Request.ServerVariables("Cert_Server_Subject")

服务器证书的主题字段

Request.ServerVariables("Cert_Subject")

客户端证书的主题字段

Request.ServerVariables("Content_Type")

客户发送的form内容或HTTPPUT的数据类型

§ 动态语言

asp最常用的三种动态网页语言有ASP(ActiveServerPages),JSP(JavaServerPages),PHP(HypertextPreprocessor)。简介ASP全名ActiveServerPages,是一个WEB服务器端的开发环境,利用它可以产生和执行动态的、互动的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(Javascript)作为自己的开发语言。

PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法,并耦合PHP自己的特性,使WEB开发者能够快速地写出动态产生页面。它支持目前绝大多数数据库。而且你可以不受限制地获得源码,甚至可以从中加进你自己需要的特色。

JSP是Sun公司推出的新一代网站开发语言,Sun公司借助自己在Java上的不凡造诣,将Java从Java应用程序和JavaApplet之外,又有新的硕果,就是JSP,JavaServerPage。JSP可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。

三者都提供在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成Servlet并由Java虚拟机解释执行,这种编译操作仅在对JSP页面的第一次请求时发生。在ASP、PHP、JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP、PHP、JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP、PHP、JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。将JSP支持加入到他们的产品中,您可以使用自己所选择的服务器和工具,修改工具或服务器并不影响目前的应用。

§ 编程实例

<!--#include file="upload.asp"-->

<%

const upload_type=0 '上传方法:0=无惧无组件上传类,1=FSO上传 2=lyfupload,3=aspupload,4=chinaaspupload

dim upload,file,formName,SavePath,filename,fileExt

dim upNum

dim EnableUpload

dim Forumupload

dim ranNum

dim uploadfiletype

dim msg,founderr

msg=""

founderr=false

EnableUpload=false

SavePath = "../DateBasc/" '存放上传文件的目录

if right(SavePath,1)<>"/" then SavePath=SavePath&"/" '在目录后加(/)

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

</head>

<body leftmargin="2" topmargin="0" marginwidth="0" marginheight="0">

<%

if EnableUploadFile="No" then

response.write "系统未开放文件上传功能"

else

if session("admin")="" and session("UserName")="" then

response.Write("请登录后再使用本功能!")

else

select case upload_type

case 0

call upload_0() '使用化境无组件上传类

case else

'response.write "本系统未开放插件功能"

'response.end

end select

end if

end if

%>

</body>

</html>

<%

sub upload_0() '使用化境无组件上传类

set upload=new upload_file '建立上传对象

for each formName in upload.file '列出所有上传了的文件

set file=upload.file(formName) '生成一个文件对象

if file.filesize<100 then

msg="请先选择你要上传的文件!"

founderr=true

end if

if file.filesize>(MaxFileSize*1024) then

msg="文件大小超过了限制,最大只能上传" & CStr(MaxFileSize) & "K的文件!"

founderr=true

end if

fileExt=lcase(file.FileExt)

Forumupload=split(UpFileType,"|")

for i=0 to ubound(Forumupload)

if fileEXT=trim(Forumupload(i)) then

EnableUpload=true

exit for

end if

next

if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then

EnableUpload=false

end if

if EnableUpload=false then

msg="这种文件类型不允许上传!\\只允许上传这几种文件类型:" & UpFileType

founderr=true

end if

strJS="<SCRIPT language=javascript>" & vbcrlf

if founderr<>true then

randomize

ranNum=int(900*rnd)+100

FileName=SavePath&upload.form("name")&".xls"

file.SaveToFile Server.mappath(FileName) '保存文件

msg="文件上传成功!"

end if

strJS=strJS & "alert('" & msg & "');" & vbcrlf

if session("filename")<>"" then

strJS=strJS & "document.location='add_danan.asp','right';" & vbcrlf

else

strJS=strJS & "history.go(-1);" & vbcrlf

end if

strJS=strJS & "</script>"

response.write strJS

next

set upload=nothing

end sub

%>

下面是upload.asp文件

<%

'----------------------------------------------------------------------

'转发时请保留此声明信息,这段声明不并会影响你的速度!

'******************* 无组件上传类 ********************************

'修改者:梁无惧

'原作者:稻香老农

'声明:此上传类是在化境编程界发布的无组件上传类的基础上修改的.

'在与化境编程界无组件上传类相比,速度快了将近50倍,当上传4M大小的文件时

'服务器只需要10秒就可以处理完,是目前最快的无组件上传程序,当前版本为0.96

'源代码公开,免费使用,对于商业用途,请与作者联系

'文件属性:例如上传文件为c:\\myfile\\doc.txt

'FileName 文件名 字符串 "doc.txt"

'FileSize 文件大小 数值 1210

'FileType 文件类型 字符串 "text/plain"

'FileExt 文件扩展名 字符串 "txt"

'FilePath 文件原路径 字符串 "c:\\myfile"

'使用时注意事项:

'由于Scripting.Dictionary区分大小写,所以在网页及ASP页的项目名都要相同的大小

'写,如果人习惯用大写或小写,为了防止出错的话,可以把

'sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)

'改为

'(小写者)sFormName = LCase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))

'(大写者)sFormName = UCase(Mid (sinfo,iFindStart,iFindEnd-iFindStart))

'**********************************************************************

'----------------------------------------------------------------------

dim oUpFileStream

Class upload_file

dim Form,File,Version

Private Sub Class_Initialize

'定义变量

dim RequestBinDate,sStart,bCrLf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,oFileInfo

dim iFileSize,sFilePath,sFileType,sFormvalue,sFileName

dim iFindStart,iFindEnd

dim iFormStart,iFormEnd,sFormName

'代码开始

Version="无组件上传类 Version 0.96"

set Form = Server.CreateObject("Scripting.Dictionary")

set File = Server.CreateObject("Scripting.Dictionary")

if Request.TotalBytes < 1 then Exit Sub

set tStream = Server.CreateObject("adodb.stream")

set oUpFileStream = Server.CreateObject("adodb.stream")

oUpFileStream.Type = 1

oUpFileStream.Mode = 3

oUpFileStream.Open

oUpFileStream.Write Request.BinaryRead(Request.TotalBytes)

oUpFileStream.Position=0

RequestBinDate = oUpFileStream.Read

iFormEnd = oUpFileStream.Size

bCrLf = chrB(13) & chrB(10)

'取得每个项目之间的分隔符

sStart = MidB(RequestBinDate,1, InStrB(1,RequestBinDate,bCrLf)-1)

iStart = LenB (sStart)

iFormStart = iStart+2

'分解项目

Do

iInfoEnd = InStrB(iFormStart,RequestBinDate,bCrLf & bCrLf)+3

tStream.Type = 1

tStream.Mode = 3

tStream.Open

oUpFileStream.Position = iFormStart

oUpFileStream.CopyTo tStream,iInfoEnd-iFormStart

tStream.Position = 0

tStream.Type = 2

tStream.Charset ="gb2312"

sInfo = tStream.ReadText

'取得表单项目名称

iFormStart = InStrB(iInfoEnd,RequestBinDate,sStart)-1

iFindStart = InStr(22,sInfo,"name=""",1)+6

iFindEnd = InStr(iFindStart,sInfo,"""",1)

sFormName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)

'如果是文件

if InStr (45,sInfo,"filename=""",1) > 0 then

set oFileInfo= new FileInfo

'取得文件属性

iFindStart = InStr(iFindEnd,sInfo,"filename=""",1)+10

iFindEnd = InStr(iFindStart,sInfo,"""",1)

sFileName = Mid (sinfo,iFindStart,iFindEnd-iFindStart)

oFileInfo.FileName = GetFileName(sFileName)

oFileInfo.FilePath = GetFilePath(sFileName)

oFileInfo.FileExt = GetFileExt(sFileName)

iFindStart = InStr(iFindEnd,sInfo,"Content-Type: ",1)+14

iFindEnd = InStr(iFindStart,sInfo,vbCr)

oFileInfo.FileType = Mid (sinfo,iFindStart,iFindEnd-iFindStart)

oFileInfo.FileStart = iInfoEnd

oFileInfo.FileSize = iFormStart -iInfoEnd -2

oFileInfo.FormName = sFormName

file.add sFormName,oFileInfo

else

'如果是表单项目

tStream.Close

tStream.Type = 1

tStream.Mode = 3

tStream.Open

oUpFileStream.Position = iInfoEnd

oUpFileStream.CopyTo tStream,iFormStart-iInfoEnd-2

tStream.Position = 0

tStream.Type = 2

tStream.Charset = "gb2312"

sFormvalue = tStream.ReadText

form.Add sFormName,sFormvalue

end if

tStream.Close

iFormStart = iFormStart+iStart+2

'如果到文件尾了就退出

loop until (iFormStart+2) = iFormEnd

RequestBinDate=""

set tStream = nothing

End Sub

Private Sub Class_Terminate

'清除变量及对像

if not Request.TotalBytes<1 then

oUpFileStream.Close

set oUpFileStream =nothing

end if

Form.RemoveAll

File.RemoveAll

set Form=nothing

set File=nothing

End Sub

'取得文件路径

Private function GetFilePath(FullPath)

If FullPath <> "" Then

GetFilePath = left(FullPath,InStrRev(FullPath, "\\"))

Else

GetFilePath = ""

End If

End function

'取得文件名

Private function GetFileName(FullPath)

If FullPath <> "" Then

GetFileName = mid(FullPath,InStrRev(FullPath, "\\")+1)

Else

GetFileName = ""

End If

End function

'取得扩展名

Private function GetFileExt(FullPath)

If FullPath <> "" Then

GetFileExt = mid(FullPath,InStrRev(FullPath, ".")+1)

Else

GetFileExt = ""

End If

End function

End Class

'文件属性类

Class FileInfo

dim FormName,FileName,FilePath,FileSize,FileType,FileStart,FileExt

Private Sub Class_Initialize

FileName = ""

FilePath = ""

FileSize = 0

FileStart= 0

FormName = ""

FileType = ""

FileExt = ""

End Sub

'保存文件方法

Public function SaveToFile(FullPath)

dim oFileStream,ErrorChar,i

SaveToFile=1

if trim(fullpath)="" or right(fullpath,1)="/" then exit function

set oFileStream=CreateObject("Adodb.Stream")

oFileStream.Type=1

oFileStream.Mode=3

oFileStream.Open

oUpFileStream.position=FileStart

oUpFileStream.copyto oFileStream,FileSize

oFileStream.SaveToFile FullPath,2

oFileStream.Close

set oFileStream=nothing

SaveToFile=0

end function

End Class

%>

随便看

 

百科全书收录594082条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/12/19 8:35:47