5常用对象与组件 在本章亓始讨论理论性的知识,不过这些理论性的知识又非得说明 不可,在接下来的实作章节我们都会再把相关的理论提出来解释, 如果我们翘马上应用本教材范例的话。先跳过本章也没问题。遢到 问题再回过头来找答案就行了。但是最好还是讨论一下,有个初步 的影响。 5-1 Application记录对象 ∧ Application对象是用來管理蓬个应用程序,可提供给各尸端用 户共事信丸,在实务上会被用来追踪目前使用中的人数及针对特定 用户显示特定数据。 ▲利用 Application对录来记录变量内容,则网页结束执行时其 变量内容仍可保留,也就是说 Application对意是一个“静态” 变量,如下所示:(App01.asp) pplication对象为“共用信息”,在不同浏览器执行或按重 新整理时,其值是累加的,例如我们重新执行App01.asp网页,我 卯可以清楚地发现:Var变量内的值仍为上一次执行后保留下来 的执行结果,而会产生下图的结果
5常用对象与组件 在本章开始讨论理论性的知识,不过这些理论性的知识又非得说明 不可,在接下来的实作章节我们都会再把相关的理论提出来解释, 如果我们想马上应用本教材范例的话,先跳过本章也没问题,遇到 问题再回过头来找答案就行了。但是最好还是讨论一下,有个初步 的影响。 5-1 Application 记录对象 ▲Application 对象是用来管理整个应用程序,可提供给客户端用 户共享信息,在实务上会被用来追踪目前使用中的人数及针对特定 用户显示特定数据。 ▲利用Application 对象来记录变量内容,则网页结束执行时其 变量内容仍可保留,也就是说Application 对象是一个“静态” 变量,如下所示:(App01.asp): ▲Application 对象为“共用信息”,在不同浏览器执行或按重 新整理时,其值是累加的,例如我们重新执行App01.asp网页,我 们可以清楚地发现:var变量内的值仍然为上一次执行后保留下来 的执行结果,而会产生下图的结果:
▲ Application对象的生命周期:起始于PWS/IIS开始运行且有人 开始连接时。终止PWS/IIS或一定时间内(默认为20分钟)没人连 接时。与就是说, Application对象并不是永远存在的!除非我 们将 Application对象中的数据写录到文件中将其保存起来,在 后续的单元中,我们将会特别介绍文件数据的写录与读取。 ▲虽然 Application对象可以在网页结束后,将其对象内的数据 保留下来,但是,当有两位甚至两位以上的浏览都同时进行网页链 接时,则它们所获得的数据库值将是相同的,进而使我们统计的数 据产生错误;为了避免两位甚至两位以上的浏览者同时进行网页链 接造成ASP程序执行错误,可以利用 Application对象的操作方法 Application.Lock对象上锁与 Application.Un1ock取消对象 上锁,如下所示:(lock.asp)
▲Application 对象的生命周期:起始于PWS/IIS开始运行且有人 开始连接时。终止PWS/IIS或一定时间内(默认为20分钟)没人连 接时。与就是说,Application 对象并不是永远存在的!除非我 们将Application 对象中的数据写录到文件中将其保存起来,在 后续的单元中,我们将会特别介绍文件数据的写录与读取。 ▲虽然Application 对象可以在网页结束后,将其对象内的数据 保留下来,但是,当有两位甚至两位以上的浏览都同时进行网页链 接时,则它们所获得的数据库值将是相同的,进而使我们统计的数 据产生错误;为了避免两位甚至两位以上的浏览者同时进行网页链 接造成ASP程序执行错误,可以利用Application 对象的操作方法: Application. Lock 对象上锁与Application . Unlock取消对象 上锁,如下所示:(lock. asp)
这样可避免两位浏览者同时浏览网页时, count值加总少加。即程 序执行至“ Application.lock”程序语句后,就把 Application 对象锁上锁,如此一来, Application对象便不能被其他程序连接 都所调用使用,须等到调用“ Application.lock”的程序连接者 再次调用了“ Application. unlock”取消 Application对象上锁 后,其它程序连接者才可调用1t1n.圈 ▲ Session对象为记录用户的相关信息,提供用户再次对此网页服 务器要求时作确认,例如用户账号与密码的确认,有 Session对象 的建立,来保留身份认证的结果,则用户不用于每一页网页登录时 都需输入密码作确认。 Session对象与 Application对象相同,都有是用来记录“变量” 值的,但是 Application是一对多的; Session对象则是一对一的, 对于所有的连接浏览者而言,他们对于 Application对象的使用是 “共用”的,但是每个浏览连接者却个别拥有一个“私用”的 Session对象,若将上节app01asp例子中的内容 Application改以 Session替代,如下所示:(sess01.asp)
这样可避免两位浏览者同时浏览网页时,count值加总少加。即程 序执行至“Application. lock”程序语句后,就把Application 对象锁上锁,如此一来,Application 对象便不能被其他程序连接 都所调用使用,须等到调用“Application .lock”的程序连接者 再次调用了“Application .unlock”取消Application 对象上锁 后,其它程序连接者才可调用Application 。 5-2 Session 记录对象 ▲Session对象为记录用户的相关信息,提供用户再次对此网页服 务器要求时作确认,例如用户账号与密码的确认,有Session对象 的建立,来保留身份认证的结果,则用户不用于每一页网页登录时 都需输入密码作确认。 ▲Session对象与Application 对象相同,都有是用来记录“变量” 值的,但是Application 是一对多的;Session对象则是一对一的, 对于所有的连接浏览者而言,他们对于Application 对象的使用是 “共用”的,但是每个浏览连接者却个别拥有一个“私用”的 Session对象,若将上节app01.asp例子中的内容Application改以 Session替代,如下所示:(sess01.asp)
执行结果将会如App01.asp样: 虽然在表面上看来,结果是相同的,但是 Session对象现在记录的 变量数据只与目前浏览者有关,与其他的浏览连接者一点关系也没 有,也就是说目前所读取的 Session对象内容是读取目前浏览连接 者“私用”的 Session对象。 ▲ Session对象与 Application对象的不同点: Application对象为 共用之信息,而 Session却是个别独立的,比较下两图,不同浏览 器执行sess01.asp,其值是不累加的,由此可证明 Session对象记 录的变量数据只与目前浏览连接者有关,与其他的浏览连接者一点 关系都没有 ▲ Session对象的生命周期起始于PWS/IIS浏览器第一次与服务器连 接时。终止于PW/IIS浏览器结束执行时或浏览器一段时间没有向 PWS/IS请求任何网页时
执行结果将会如App01.asp一样: 虽然在表面上看来,结果是相同的,但是Session对象现在记录的 变量数据只与目前浏览者有关,与其他的浏览连接者一点关系也没 有,也就是说目前所读取的Session对象内容是读取目前浏览连接 者“私用”的Session对象。 ▲Session对象与Application对象的不同点:Application对象为 共用之信息,而Session却是个别独立的,比较下两图,不同浏览 器执行sess01.asp,其值是不累加的,由此可证明Session对象记 录的变量数据只与目前浏览连接者有关,与其他的浏览连接者一点 关系都没有。 ▲Session对象的生命周期起始于PWS/IIS浏览器第一次与服务器连 接时。终止于PWS/IIS浏览器结束执行时或浏览器一段时间没有向 PWS/IIS请求任何网页时
▲当我们利用 Application来作为进站人数的计数器,是利用当有新的浏览连接 者进入时就调用 Application对象,将 Application对象所储存的变量数据值加 一来达到计数的目的。但是,上网者只要按下浏览器上的“重新刷新”按钮后, 你会发现计数器将会再次的自动加一,这似乎不是我们所想要的。单纯的 Application计数器程序代码与执行结果,如下所列: 那我们该如何防制连接者按下“重新刷新”按钮使计数器自动加一所产生的错 误呢,我们可以利用具有“私用”特性的 Session对象来判断浏览连接者是否是 新的连接者,我们可以利用下列判断式先检验一下,如果是新的连接者,则 Session对旬象是没有任何数据的 如果上面的判断式是成立的(浏览连接者为新连接的, Session对象内没有任何 的数据),则我们就将 Application对象的记录数据加一,同时将浏览连接者的 Session(“Conn”)数据值设为“True”,如此一来,当浏览连接者再次按下 “重新刷新”按钮后,因为 If Is empty( Session(“Conn”))Then判断式不成 立( Session对象内已有连接记录的数据,则 Application对象的记录数据就不会 再自动加一。使用 Application对象与 Session对象撰写的计数器程序代码与执行 结果,如下所列
▲当我们利用Application来作为进站人数的计数器,是利用当有新的浏览连接 者进入时就调用Application对象,将Application对象所储存的变量数据值加 一来达到计数的目的。但是,上网者只要按下浏览器上的“重新刷新”按钮后, 你会发现计数器将会再次的自动加一,这似乎不是我们所想要的。单纯的 Application计数器程序代码与执行结果,如下所列: ▲那我们该如何防制连接者按下“重新刷新”按钮使计数器自动加一所产生的错 误呢,我们可以利用具有“私用”特性的Session 对象来判断浏览连接者是否是 新的连接者,我们可以利用下列判断式先检验一下,如果是新的连接者,则 Session对旬象是没有任何数据的。 如果上面的判断式是成立的(浏览连接者为新连接的,Session 对象内没有任何 的数据),则我们就将Application对象的记录数据加一,同时将浏览连接者的 Session(“Conn”)数据值设为“True”,如此一来,当浏览连接者再次按下 “重新刷新”按钮后,因为If Is Empty(Session(“Conn”))Then判断式不成 立(Session对象内已有连接记录的数据,则Application对象的记录数据就不会 再自动加一。使用Application对象与Session对象撰写的计数器程序代码与执行 结果,如下所列:
5-3 Cookies记录对象 关于 Cookies记录对象 ▲ Application对象与 Cookies对象将信息记录在 Server端,而 Cookies对象会通过浏览器所提供的 Cookies功能,将信息记录在客 户端,也就是说: Cookies对象是储存在浏览器连接者的浏览器之 中 ▲我们可用 Cookies对象的记录来判断某个用户是否曾经进入本网 站。奇怪,虽然 Session对象将信息记录在 Server端,但是它也会 个别启示连接浏览者是否曾经进入本网站啊!但是 Session对象的 生存期限是很短的,当浏览连接者的浏览器在设定时间内(默认为 20分钟)没有向服务器请示任何数据的话,服务器就会将 Session 对象中的数据全数消除,而 Cookies对象是存在于浏览连接者的浏 览器中的,即使浏览者离线了, Cookies对象的数据记录依然存在 ▲ Cookies对象是 Response对象及 Request对象的属性,用法如下: Response. cookiesXCooKIES Request. cookies ★如何证明 Cookies对象是储存在浏览连接者的浏览器之中?
5-3 Cookies记录对象 关于Cookies记录对象 ▲Application对象与Cookies对象将信息记录在Server端,而 Cookies对象会通过浏览器所提供的Cookies功能,将信息记录在客 户端,也就是说:Cookies对象是储存在浏览器连接者的浏览器之 中。 ▲我们可用Cookies对象的记录来判断某个用户是否曾经进入本网 站。奇怪,虽然Session对象将信息记录在Server端,但是它也会 个别启示连接浏览者是否曾经进入本网站啊!但是Session对象的 生存期限是很短的,当浏览连接者的浏览器在设定时间内(默认为 20分钟)没有向服务器请示任何数据的话,服务器就会将Session 对象中的数据全数消除,而Cookies对象是存在于浏览连接者的浏 览器中的,即使浏览者离线了,Cookies对象的数据记录依然存在。 ▲Cookies对象是Response 对象及Request对象的属性,用法如下: Response. cookies入COOKIES Request. cookies ★如何证明Cookies对象是储存在浏览连接者的浏览器之中?
▲撰写一含有 Cookies的网页,如下所示( Cookies01.asp 执行后会产生却会产生“类型不符合”的错误,如下图 ▲怎会如此呢?原因如下: Application对象及 Session对象其 返回值为 empty而 request. cookies却是返回““(空字符串), empty可与数值作运算,”“却不可以,解决此一问题可加入 判断式,如下所示: ▲修改后还是有错误,错误为“已将HTP标题写入客户端浏览 器。对任何HTP的标题所做的修改必须要在写入页内容之前”。 原因为浏览器与服务端交换 Cookies数据的时机需在服务器 尚未下载数据给浏览器之前就进行交换,否则会出现错误,解决 方法为用缓冲区来装下载的数据,完整程序如下所示: ▲现在我们来检验一下:以IE为例,建立在浏览器中的 Cookies对象将会放置在“\ WINDOWS\ Temporary Internet Files 目录中,我们先将目录中的所有数据文件清除干净:
▲撰写一含有Cookies的网页,如下所示(Cookies01.asp) 执行后会产生却会产生“类型不符合”的错误,如下图: ▲怎会如此呢?原因如下:Application对象及Session对象其 返回值为empty而request .cookies却是返回““(空字符串), empty可与数值作运算,”“却不可以,解决此一问题可加入一 判断式,如下所示: ▲修改后还是有错误,错误为“已将HTTP标题写入客户端浏览 器。对任何HTTP的标题所做的修改必须要在写入页内容之前”。 ▲原因为浏览器与服务端交换Cookies数据的时机需在服务器 尚未下载数据给浏览器之前就进行交换,否则会出现错误,解决 方法为用缓冲区来装下载的数据,完整程序如下所示: ▲现在我们来检验一下:以IE为例,建立在浏览器中的 Cookies对象将会放置在“\WINDOWS\Temporary Internet Files” 目录中,我们先将目录中的所有数据文件清除干净:
按着启动浏览器,开始浏览 cookies02.asp,此时我们将会发现在 “\ WINDOWS\ Temporary Internet Files”目录中多出了 Cookies的 对象文件,这证明了 Cookies对象是存在于浏览连接者的浏览器 客户端)中无误! ▲ Cookies对象的生命周期起始于浏览器被执行时。终止于浏览器 结束执行时。那如果我们要延长 Cookies对象的生命周期呢?若要 延长 Cookies对象的生命周期我们可另用“ Expires”属性来设置 Cookies的生命周期, Expires表失效,如下所示 经过 expires设置后, your il的使用期限为2005/12/31。 5-4 Server信息对象 Server对象允许用户取得服务器提供的各项功能,本单元将介绍 Request对象的 Server variab1es方法及 Server对象
按着启动浏览器,开始浏览cookies02.asp,此时我们将会发现在 “\WINDOWS\Temporary Internet Files”目录中多出了Cookies的 对象文件,这证明了Cookies对象是存在于浏览连接者的浏览器 (客户端)中无误! ▲Cookies对象的生命周期起始于浏览器被执行时。终止于浏览器 结束执行时。那如果我们要延长Cookies对象的生命周期呢?若要 延长Cookies对象的生命周期我们可另用“Expires”属性来设置 Cookies的生命周期,Expires表失效,如下所示 经过expires设置后,your ID的使用期限为2005/12/31。 5-4 Server信息对象 Server对象允许用户取得服务器提供的各项功能,本单元将介绍 Request对象的Server Variables方法及Server对象
★ Request. Server variables方法 利用此方法可取得服务器提供的各项功能,其语句如下 环境变量有很多,在此将只介绍较实用的,其他环境变量可参考PW/IIS提供 的参考文件。 读取IP地址的环境变量“L0CAL_ADDR” 读取 SErver端的IP地址“ FREEMOTEADDR”读取 Clients端的IP地址。包 读取附带在网址后面的参数“ UERY--STRING” 亦可以下列方法替代,其结果是相同的。 假设所输入的网址为 http://127.0.0.1/asp/ch01/elemenet.asp?name=kelvin&interest=play 则变量 element=”name= Kelvin& interest=play”我们可通过 split函数解析 element变量,如下所示:( element. asp) erver Server. Map Path方法:将网址路径转为真实的文件路径,因为ASP规定必须 指定文件的真实路径,用法如下 什么叫做“虚拟路径”?虚拟路径其实就是“网址”,当我们链接至某个网站的 根目录时,我们就会在浏览器的网址输入栏位中输入网站的网址。例如: http://www.twbts.com我就表示我们要链接至该网站的根目录,但是实际对 应到该网站服务器上硬盘根目录却是“ Inetpub\wwwroot”,所以,说穿了“网 址”就是“假”的网站服务器目录,只不过“假”很不好听,因此我们就称之为 “虚拟
★Request. Server Variables 方法 ▲利用此方法可取得服务器提供的各项功能,其语句如下: ▲环境变量有很多,在此将只介绍较实用的,其他环境变量可参考PWS/IIS提供 的参考文件。 读取IP地址的环境变量“LOCAL—ADDR” 读取Server端的IP地址“REEMOTE—ADDR”读取Client端的IP地址。 读取附带在网址后面的参数“QUERY—STRING” 亦可以下列方法替代,其结果是相同的。 假设所输入的网址为 http://127.0.0.1/asp/ch01/elemenet.asp?name=kelvin&interest=play 则变量element=”name=Kelvin&interest=play”我们可通过split函数解析 element 变量,如下所示:(element.asp) ★Server对象 ▲Server. Map Path方法:将网址路径转为真实的文件路径,因为ASP规定必须 指定文件的真实路径,用法如下: 什么叫做“虚拟路径”?虚拟路径其实就是“网址”,当我们链接至某个网站的 根目录时,我们就会在浏览器的网址输入栏位中输入网站的网址。例如: http://www.twbts.com/,我就表示我们要链接至该网站的根目录,但是实际对 应到该网站服务器上硬盘根目录却是“\Inetpub\wwwroot”,所以,说穿了“网 址”就是“假”的网站服务器目录,只不过“假”很不好听,因此我们就称之为 “虚拟”!
如果我们所安装的PWS/IIS网络服务器模拟机制的WW根目录(网址 虚拟根目录)为“c:\ Inetpub\wwwroot”,我们若使用 Server. MapPath(“/”)调用语句,则返回的数据值将是 “c:\ Inetpub\ wwwroot”;我们若使用 Server. MapPath(“/”)调 用语句,则返回的数据值将是“c:\ Inetpubwwwroot\test” 为何需转换“虚拟路径”为真实的路径呢?因为当我们需要打开文 件或是数据库时,ASP强硬的规定我们必须指定欲打开文件(或数 据库)的“实际路径”之故 ▲对特殊字符进行编码“ HTML Encode” 如果我们要在网页中单纯地显示“粗体”这些单纯的文字 时,该如何编写我们的ASP网页呢,如果我们撰写的语句如下图a所 编写的内容一般,则以浏览器浏览网页时将会获得如图b的错误答 案 怎么会这样呢?因为输出至浏览器后都会被解译为HTML 网页标签了,那怎么办呢,这个时候我们就必须利用 Server.HTM Encode来进行字符编码,其标准格式为: Server. HTML Encode(要进行编码的数据)
如果我们所安装的PWS/IIS网络服务器模拟机制的WWW根目录(网址 虚拟根目录)为“c:\Inetpub\wwwroot”,我们若使用 Server.MapPath(“/”)调用语句,则返回的数据值将是 “c:\Inetpub\wwwroot”;我们若使用Server.MapPath(“/”)调 用语句,则返回的数据值将是“c:\Inetpub\wwwroot\test”。 为何需转换“虚拟路径”为真实的路径呢?因为当我们需要打开文 件或是数据库时,ASP强硬的规定我们必须指定欲打开文件(或数 据库)的“实际路径”之故。 ▲对特殊字符进行编码“HTML Encode” 如果我们要在网页中单纯地显示“粗体”这些单纯的文字 时,该如何编写我们的ASP网页呢,如果我们撰写的语句如下图a所 编写的内容一般,则以浏览器浏览网页时将会获得如图b的错误答 案: 怎么会这样呢?因为与输出至浏览器后都会被解译为HTML 网页标签了,那怎么办呢,这个时候我们就必须利用Server.HTML Encode来进行字符编码,其标准格式为: Server. HTML Encode(要进行编码的数据)