61阅读

asp编程-ASP 3.0高级编程(四十四)

发布时间:2018-01-08 所属栏目:指弹吉他完整教程

一 : ASP 3.0高级编程(四十四)

第10章 ASP与客户端数据

在一本ASP专著中讨论客户端数据,这与服务器端的ASP编程是否矛盾?情况并非如此,因为我们至今尚未碰到只从事服务器端编程的ASP程序员。虽然ASP是一项服务器端技术,但可以想象,编程人员不可能仅仅使用ASP进行编程。从事ASP编程的Web开发人员,仍然需要与客户端数据进行交互。
因此,围绕着ASP构建一个应用程序时必须考虑整个应用程序的情况,这也意味着必须考虑客户端。为了获得一个运行良好、快速响应的应用程序,需要很好地使用客户端数据。
本章将讨论如何在客户端使用数据。特别将着重研究:
· 远程数据服务(Remote Data Services,RDS),如何向客户端传送数据以及客户端接收数据。
· 如何将ADO记录集绑定到HTML控件。
· 如何利用用户自定义组件提供数据。
· 如何更新客户端数据,并将其反馈到服务器。
· 如何从数据库中获取图像并将其显示在Web页面中。
· 如何创建基于表格的Web页面。
以上覆盖的范围相当广泛,同时有很多不同的方法可以取得相同的结果,但实际上实现起来并不是特别困难。

10.1 断开连接的记录集
首先需要掌握的是“断开连接的数据”的概念。迄今为止,在研究ADO的过程中,已经学习了获取记录集的方法,以及如何修改这些记录集中的数据。回顾一下,我们打开一个记录集,对数据做一些修改,然后再关闭这个记录集,在操作记录集的过程中,始终与服务器保持着连接。这是相当明显的,但别忘了Web在本质上是无状态的。如果想使用客户端数据,如何始终保持与服务器的连接?很简单,这是不可能实现的,这也是定义断开连接的记录集概念的缘由。
一个断开连接的记录集只是一个普通的记录集,但解除了与服务器的连接,成为孤立的对象,可以像普通的记录集那样对其执行更新、增加和删除操作。但这些变化只发生在记录集内部,并不反馈到服务器,因为记录集与服务器已不再保持着连接。这并不是缺点,因为可以与服务器重新建立连接,同时服务器可以对任何修改进行更新。即使服务器端的数据已经改变了,ADO仍然有方法让用户及时发现这些变化,这样用户就能决定哪些数据是正确的。这称为冲突处理(conflict resolution)。
断开连接的记录集使我们能在组件之间,包括服务器与客户之间,传送具有全部功能的记录集。本章后面将探讨如何在组件内创建断开连接的记录集。但这里不准备对此做过于详细的研究,因为本书第13章至第18章已经覆盖这部分内容,这里仅做简单的介绍,以便于了解组件是如何与远程数据服务交互的。

10.2 远程数据服务
远程数据服务(Remote Data Services,RDS)是允许我们处理客户端数据的一系列服务的统称。现在不用担心这方面的问题,因为RDS本身就是ADO的一部分,只有在需要传送和使用客户端数据时,才会使用。实际上RDS是由几个组件构成的。图10-1说明了这些组件以及它们之间是如何协同工作的。
图10-1 RDS的组件构成
组件似乎很多,但并不是所有的组件在每种情形下都被使用,实际上有一些不是RDS的一部分。然而这里还是把所有可能出现的组件都放在了图上,以备需要时查看。图10-1分成了两部分,因为使用客户端数据需要一些向客户端传送数据的方法,同时数据一旦到达客户端,也需要一些管理数据的方法。我们先从服务器端开始。

10.2.1 RDS服务器组件
虽然RDS用于传送和访问客户端数据,但其确实有一些基于服务器的组件。这是必需的,因为肯定需要某种方式将数据传送到客户端。因此有了一系列能访问数据并允许发送数据到客户端的服务器组件。我们把实际的数据传送称为调度(marshal)。
服务器端组件图的最上端是数据存储,由OLE DB提供者访问。它并不是RDS的一部分,但这表示只要有相应的OLE DB提供者,就可以通过RDS在客户端使用任何数据。至于如何处理服务器上的数据,可以有两种选择:
· 数据工厂(DataFactory)是缺省的用于访问数据存储的服务器端组件。它作为服务器端RDS组件的一部分安装在计算机上,除了能从数据存储中获取数据外,还为服务器处理发送到客户端以及从客户端发送来的数据。
· 自定义组件只是一个普通的提供了数据传送方法的COM组件。当数据工厂不能提供所需的功能时,可以使用自定义组件。本章将介绍一个简单的组件例子,在本书的后面还有一个更复杂的例子。
Web服务器使用这两种组件作为客户和服务器数据的接口。

10.2.2 RDS客户组件
在客户端先从底端的DataSpace对象开始,该对象作为客户端的一部分与数据工厂或自定义对象协同工作。DataSpace对象是一个代理对象,负责与服务器进行通信,同时也是数据传输的通道(或者通常所说的调度)。DataSpace对象是用客户端脚本语言或用HTML语言中的<OBJECT>标记创建的COM对象。在本章后面会看到关于这方面的例子。
DataSpace对象上面是数据源对象(Data Source Object,DSO),负责存储客户端数据。一个数据源对象包含一个ADO数据记录集,与客户数据缓存共同管理数据。客户数据缓存只是一种管理客户端数据的客户光标服务。同时数据源对象又是一个COM对象,与DataSpace对象类似,也可以通过客户端脚本或使用HTML语言中的<OBJECT>标记来创建。同样,在本章稍后也会介绍关于这方面的一些例子。
数据源对象的上面是数据绑定管理器,任务是建立HTML控件与数据源对象的连接。这就是我们所知道的绑定,可以通过设置某些HTML控件的DATASRC和DATAFLD属性来实现。下面将对这些内容进行讨论,并示范如何在浏览器中方便地使用数据。

10.2.3 支持RDS的浏览器
要知道RDS是微软的技术,因此只能在微软的浏览器上工作。实际上,只有在IE 4.0或更高版本的浏览器中才完全支持RDS。
当编写依赖于RDS的应用程序时,需要注意访问应用程序的客户的RDS版本可能与服务器端有所不同。举例来说,IE 4中的是RDS 1.5版本,而IE 5、Office 2000和Visual Studio 6中的则是RDS 2.0版本。有两种方法可以处理这种兼容性问题:
· 确保所有用户已经升级到RDS的最新版本。如果客户运行的是Windows 2000,那么已经在运行最新版本的RDS了。否则,可以从网址www.microsoft.com/data处下载。RDS 2.5版本是目前最新的随同Windows 2000一起发布的版本,同时也是一个可单独下载的软件包。
· 当连接到数据源时,指定数据工厂的模式。这可以指定使用的是哪一个版本的RDS组件,后面将介绍这方面的一个例子。

10.2.4 数据源对象
数据源对象是一个存储和管理客户端数据的客户端对象。因为这是使用RDS最简单的一种方式,首先研究一下这些对象。
这里有几个不同的数据源对象,每一个都针对不同类型的数据:
· 表格数据控件(Tabular Data Control,TDC),用于处理表格形式或分隔形式的文本文件。
· RDS数据控件,用于连接OLE DB数据存储,能够指定连接到哪个数据存储,以及返回哪些数据。
· Java数据库连接器,这是一个通过Java数据库控件(Java DataBase Control,JDBC)连接到数据存储的Java小程序。这里我们不想讨论JDBC,因为它并不提供其他控件无法实现的功能。
· 微软的HTML(MSHTML)数据源对象用HTML标记数据,并把它作为数据源。
· XML数据源对象使用XML数据,用于结构化的或任意结构的XML。
选用哪一种数据源对象取决于你想做什么,以及数据从哪里来。如果需要向客户提供少量的数据,并且不允许用户修改数据,那么表格数据控件(TDC)可能会比较适合。这种数据源是一个文本文件,不需要任何数据库,因此编辑起来比较简单。对于从数据库中取出数据并且可能需要更新的情况,RDS数据控件是最合适的。而对于许多新数据源,会发现此时需要使用XML数据控件。这实际依赖于所使用的Web应用程序的类型,以及用户所需的功能。
我们将依次介绍这些数据控件,一旦了解了如何用它们把数据传送到客户端,将会介绍如何使用这些数据。

二 : ASP完整教程(完全ASP编程)

Active Server Pages教程

二零零零年二月二日

目 录

第一章 引言…………………………………………………………………….3

第二章 简介……………………………………………………………….……8

第三章 ASP基础………………………………………………………………13

第四章 脚本基础………………………………………………………………19

第五章 脚本变量、函数、过程和条件语句…………………………………22

第六章 脚本循环语句…………………………………………………………27

第七章 内建Request对象…………………………………………….………30

第八章 内建Reponse对象……………………………………………………36

第九章 内建对象Application 和 Session……………………………………42

第十章 Global.asa文件的使用及Chat程序…………………………………48 第十一章 内建对象Server……………………………………………………53 第十二章 数据库查询语言(1) ……………………………………..…………57 第十三章 数据库查询语言(2) …………………………………………..……62 第十四章 ActiveX组件………………………………………………..………66 第十五章 常用的ASP ActiveX组件……………………………………….…70 第十六章 其它的ASP常用组件…………………………………………...…75 第十七章 ADO存取数据库时如何分页显示……………………………...…81 第十八章 堵住ASP漏洞…………………………………………………...…87

第十九章 最新的ASP、IIS安全漏洞………………………………………..91

Active Server Pages教程

第一章 引言

您的网站是否仍一如既往地保持“静态”?目前呈几何增长的互联网网站中,有相当一部分仍固守“静态”,无形中已大大落后于时代的步伐。所谓“静态”指的就是网站的网页内容“固定不变”,当用户浏览器通过互联网的HTTP(Hypertext Transport Pr otocol)协议向WEB服务器请求提供网页内容时,服务器仅仅是将原已设计好的静态HTML文档传送给用户浏览器。其页面的内容使用的仅仅是标准的HTML代码,最多再加上流行的GIF89A格式的动态图片,比如产生几只小狗小猫跑来跑去的动画效果。若网站维护者要更新网页的内容,就必须手动地来更新其所有的HTML文档。

“静态”网站的致命弱点就是不易维护,为了不断更新网页内容,你必须不断地重复制作HTML文档,随着网站内容和信息量的日益扩增,你就会感到工作量大得出乎想象。

你不禁要问:那么什么是动态网站呢?这就是本文将重点讲述的核心,所谓“动态”,并不是指那几个放在网页上的GIF动态图片,在这里笔者为动态页面的概念制定了以下几条规则:

1、“交互性”即网页会根据用户的要求和选择而动态改变和响应,将浏览器作为客户端界面,这将是今后WEB发展的大事所趋。

2、“自动更新”即无须手动地更新HTML文档,便会自动生成新的页面,可以大大节省工作量。

3、“因时因人而变”,即当不同的时间、不同的人访问同一网址时会产生不同的页面,是不是很酷?

现在你已经对“动态”网站有了一个基本的概念,接下来应挑选称手的“兵刃”了。将网站“动态”化的方法很多,这要看你是出于何种需求。如果你是个人网站的维护者,使用的是免费主页空间,那么绝大多数情况下你只能使用Java、Java Script和最新的DHTML技术,如果你的主页空间提供者能给予你CGI权限或ASP支持,那么你将能非常幸运地发挥真正的动态技术。关于CGI和ASP技术将在后面的着重讨论,这里针对个人网站仅就最新的DHTML技术进行重点介绍。 究竟什么是DHTML?它与传统的HTML有什么不同?DHTML就是当网页从WEB服务器下载后无须再经过服务器的处理,而在浏览器中直接动态地更新网页的内容、排版样式、动画。

比如,当鼠标移至文章段落中,段落能够变成蓝色,或者当你点击一个超链后会自动生成一个下拉式的子超链目录。这就是Dynamic HTML(动态HTML),它是近年来网络飞速发展进程中最振奋人心也是最具实用性的创第 3 页 共 90 页 第3页

Active Server Pages教程

新之一。它是一种通过各种技术的综合发展而得以实现的概念,这些技术包括Java Script , VB0Script, Document Object Model (文件目标模块),Layers和Cascading Style Sheets ( CSS样式表)等。非常遗憾的是在网景Netscape和微软IE浏览器几番大战后,我们仍没有得到一个对DHTML支持的统一标准。因此本文在介绍DHTML时不得不分别讲述。 让我们先来看看Microsoft IE 4对DHTML的支持:

1 .动态内容(Dynamic Content):动态地更新网页的内容,可"动态"地随时插入、修改、或删除网页的元件,譬如文字、标记等。

2 .动态排版样式(Dynamic Styles Sheets):通过W3C的“Cascading Style Sheets”(串联式排版样式,简称CSS1或CSS),提供了设定HTML标记的字体大小、字型、粗细、字型样式、行高度、文字颜色、加底线或加中间横线、与边缘距离、靠左右或置中、缩排、背景图片或颜色等排版功能。而“动态排版样式”,可以“动态”地随时地改变排版样式。

3 .动态定位(Dynamic Positioning):通过W 3 C的“Working Draft on Positioning HTML with Cascading Style Sheets”,提供HTML元件在X、Y、Z轴的定位功能,让设计者可以放置影像、控件、文字等在网页上的任何位置上。而放置在不同的Z轴上,设计者就可以产生重叠的效果。

4 .内建资料处理(Data Awareness):无须复杂的程序,无须花费服务器太多资源,即可让网页设计者即时处理文档。

5 .内建多媒体支援:IE 4.0结合CSS与内建的ActiveX Controls,提供多媒体支持的功能,包括转换特效、滤镜特效、路径控制、顺序控制、动画、制图、播放声音和影像等多媒体功能。

让我们再来看看Netscape Communicator 4.0对DHTML所提供的支持: 1 .动态排版样式(Dynamic Styles Sheets):支援W 3 C的“Cascading Style Sheets”(串联式排版样式,简称CSS1或CSS)、和自创的“Java Script Style Sheets”。

2 .Dynamic Layers:提供图文定位、改变图文重叠顺序、控制隐藏或显示图文、移动图文的功能,让您设计出“动画”的效果!

3 .Dynamic Fonts:提供由服务器下载字型的功能。

可见虽然IE 4.0和Netscape Communicator 4.0都提供了“Dynamic

HTML”的支持,但是事实上两者除了对“Cascading Style Sheets”的规格相近外,其余都相差甚远。因此当你设计DHTML页面时必须充分考虑到兼容性的问题,选择称手的“兵刃”和方法对于设计者来说始终是最重要的。有关DHTML的使用方法和设计技巧作者将在第二章《动态网页设计十八般武艺》中仔细讲解,请密切关注。

或许对于一个个人网站来说充分运用DHTML技术足以令网页栩栩如生,动感十足。然而对于建立商业网站的企业而言,仅仅拥有DHTML是远远不够的。因为仅仅发生在客户浏览器端的动态效果是无法满足商业网站大第 4 页 共 90 页 第4页

Active Server Pages教程

量信息查询,客户咨询,资源交互等“动态”需求的。因此作为商业网站的设计者,必须要设计出更具实用性和交互性的“动态”网站。由于绝大多数商业网站都具有大量的数据和信息,而建网的初衷也就是在于方便客户查询企业资料,方便同客户的交流,及时获得信息反馈。那么,就必然会面临如何让使用者在浏览器界面中,通过互联网或内联网(Intranet)查询WEB数据库的资料,甚至输入、更新和删除WEB服务器上的资料。下面笔者就简单介绍几种常用的“动态”网站设计方法:

1、 CGI(Common Gateway Interface)

通用网关接口的传统方式,当用户在浏览器端填好表单(form)要求输入的资料,提出HTTP请求后,WEB服务器端将执行一个表单所设定的可执行的CGI应用程序,CGI程序分析表单(form)中所输入的资料,存取WEB数据库,将查询执行的结果以HTML的格式返回给浏览器。使用CGI方式存取WEB数据库,有很多的缺点,譬如不易开发、变更修改成本高、功能有限、不易侦错、执行速度慢等,而且由于并非整合于HTML文档之中,因此必须使用与HTML完全不同的设计过程来设计一个可执行的应用程序。

2、 IDC(Internet Database Connector)

互联网数据库连接头是Windows NT Server内含Internet Information Server(简称IIS)2.0的特征之一,它提供了一种使你的互联网数据库内容得以发布并可与用户交互的方法,它实际上是一个包含于IIS中的I S A P I应用程序。你只需掌握HTML和SQL的基本知识并写为数不多的代码就能编出具有交互能力的数据库应用程序,让使用者在浏览器界面中得以查询、输入、更新、和删除WEB服务器上的数据资料。正如VB程序员所喜欢的那样,构成IDC应用程序的文件是解释性的,由于设计简易,只要准备两个档案,即可在用户端的浏览器中存取WEB服务器的数据资料,且无须编译,因此具有快速的开发循环和反馈。但这种简单性的代价是牺牲了许多灵活性,使你不得不放弃许多对用户接口的控制,并几乎放弃了所有验证数据的能力。因而I D C仅适用于简单的WEB应用程序。

3、 ActiveX Data Object(ADO)是WEB数据库应用的最佳选择。

ActiveX Data Object(简称ADO)究竟是什么呢?ActiveX Data Object的技术,让您可以与Active Server Pages(简称ASP)结合以建立提供数据资讯的网页内容,只需在网页面中执行Structured Query Language(结构化查询语言,简称SQL)指令,让用户在浏览器界面中输入、更新、和删除WEB服务器上的数据资料。当用户端的浏览器填好表单所要求输入的资料并按下“Submit”按钮后,经过互联网、内联网传送HTTP请求到WEB服务器,该请求在WEB服务器执行一个表单所指定的Active Server Pages程序(后缀名为. ASP的文档)。一个. ASP文档是一个纯文字档,包括:HTML标记(tags)、VBScript或JScript语言的程序代码、ASP语法、和结构化查第 5 页 共 90 页 第5页

Active Server Pages教程

询语言SQL指令。IIS3.0 / 4.0 WEB服务器执行. ASP文档,通过ODBC驱动程式,连接到支持ODBC的数据库上,执行ASP文档所指定的SQL指令,最后将执行的结果以HTML的格式传送给用户浏览器。ADO具有容易使用、开发执行快速、消耗系统资源较少,和占用磁盘空间小等优点。

以上就是目前设计商业网站常用的“动态”技术,由于本人的工作和使用经验,笔者较倾向于ADO和ASP的结合,从长远来看这对搭档也势必成为今后一段时间内“动态”WEB的核心技术。因此在本文第二章《动态网页设计十八般武艺》中,笔者将就ADO和ASP的使用进行展开讲述,敬请期待。

第二章 简介

看了《引言》后,你是否已经急不可待地想构建属于你自己的动态网站?本文将以 Active Server Pages 为中心,向你全面展示制作动态商业网站的步骤和技巧。

上一章给大家简要介绍了建立动态网站的一些方法和制作工具,本章将以如何建立基于 IIS 的 ASP 动态网站为中心向大家一步一步地揭示动态商业网站设计的真正奥秘。为了使各位能够全面、细致地掌握 ASP 的开发技巧,本文今后将采取连载的形式,手把手地教你如何建立属于自己 ASP 动态网站。由于本文是作者根据自己的学习和实践经验并结合了一些外文资料而写成的,因此不免会有一些偏颇,希望各位见谅。如发现本文有何不当之处,请及时通知作者,谢谢。

Microsoft Active Server Pages 即我们所称的 ASP ,其实是一套微软开发的服务器端脚本环境, ASP 内含于 IIS 3.0 和 4.0 之中 , 通过 ASP 我们可以结合 HTML 网页、 ASP 指令和 ActiveX 元件建立动态、交互且高效的 WEB 服务器应用程序。有了 ASP 你就不必担心客户的浏览器是否能运行你所编写的代码,因为所有的程序都将在服务器端执行,包括所有嵌在普通 HTML 中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。 以下罗列了 Active Server Pages 所独具的一些特点:

1. 使用 VBScript、JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。

2. 无须编译,容易编写,可在服务器端直接执行。

3. 使用普通的文本编辑器,如 Windows 的记事本,即可进行编辑设计。

4. 与浏览器无关 (Browser Independence), 用户端只要使用可执行

第 6 页 共 90 页 第6页

Active Server Pages教程

HTML 码的浏览器,即可浏览 Active Server Pages 所设计的网页内容。 Active Server Pages 所使用的脚本语言 (VBScript 、 Jscript) 均在 WEB 服务器端执行,用户端的浏览器不需要能够执行这些脚本语言。

5.Active Server Pages 能与任何 ActiveX scripting 语言相容。除了可使用 VBScript 或 JScript 语言来设计外,还通过 plug-in 的方式,使用由第三方所提供的其他脚本语言,譬如 REXX 、 Perl 、 Tcl 等。脚本引擎是处理脚本程序的 COM(Component Object Model) 物件。

6.Active Server Pages 的源程序,不会被传到客户浏览器,因而可以避免所写的源程序被他人剽窃,也提高了程序的安全性。

7. 可使用服务器端的脚本来产生客户端的脚本。

8. 物件导向( Object-oriented )。

9.ActiveX Server Components(ActiveX 服务器元件 ) 具有无限可扩充性。可以使用 Visual Basic 、 Java 、 Visual C++ 、 COBOL 等编程语言来编写你所需要的 ActiveX Server Component 。

ASP 的奇妙之处真是不胜枚举,下面就请各位系好安全带,我将带领大家进入 ASP 的梦幻世界。

首先,让我们来看看运行 ASP 所需的环境:

Microsoft Internet Information Server version 3.0/4.0 on Windows NT

Server

Microsoft Peer Web Services Version 3.0 on Windows NT Workstation Microsoft Personal Web Server on Windows 95/98

正如前文所述,与一般的程序不同, .asp 程序无须编译, ASP 程序的控制部份,是使用 VBScript 、 JScript 等脚本语言来设计的,当执行 ASP 程序时,脚本程序将一整套命令发送给脚本解释器 ( 即脚本引擎 ) ,由脚本解释器进行翻译并将其转换成服务器所能执行的命令。当然,同其他编程语言一样, ASP 程序的编写也遵循一定的规则,如果你想使用你所喜爱的脚本语言编写 ASP 程序,那么你的服务器上必须要有能解释这种脚本语言的脚本解释器。当你安装 ASP 时,系统提供了两种脚本语言: VBsrcipt 和 JScript ,而 VBscript 则被作为系统默认的脚本语言。你也可以根据自己的喜好改变系统默认的脚本语言,关于如何改变系统默认的脚本语言请看《 在 ASP 中使用脚本语言》一文。

ASP 本身并不是一种脚本语言,它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境。但是,要学好 ASP 又必须掌握它的语法和规则。现在就让我们开始一步一步地认识并学习 Active Server Pages 。

ASP 程序其实是以扩展名为 .asp 的纯文本形式存在于 WEB 服务器上的,你可以用任何文本编辑器打开它, ASP 程序中可以包含纯文本、 HTML 标记以及脚本命令。你只需将 .asp 程序放在 WEB 服务器的虚拟目录下(该目录必须要有可执行权限),就可以通过 WWW 的方式访问 第 7 页 共 90 页 第7页

Active Server Pages教程

ASP 程序了。要学好 ASP 程序的设计,必须掌握脚本的编写,那么究竟什么是脚本呢?其实脚本是由一系列的脚本命令所组成的,如同一般的程序,脚本可以将一个值赋给一个变量,可以命令 WEB 服务器发送一个值到客户浏览器,还可以将一系列命令定义成一个过程。要编写脚本,你必须要熟悉至少一门脚本语言,如 VBScript 。脚本语言是一种介乎于HTML和诸如 JAVA 、Visual Basic 、C++ 等编程语言之间的一种特殊的语言,尽管它更接近后者,但它却不具有编程语言复杂、严谨的语法和规则。如前所述 ASP 所提供的脚本运行环境可支持多种脚本语言,譬如:JScript 、

REXX 、PERL 等等,这无疑给 ASP 程序设计者提供了广泛的发挥余地。 ASP 的出现使得广大 WEB 设计者不必在为客户浏览器是否支持而担心,实际上就算你 在同一个 .asp 文件中使用不同的脚本语言,你都无须为此担忧,因为所有的一切都将在服务器端进行,客户浏览器得到的只是一个程序执行的结果,而你也只需在 .asp 中声明使用不同的脚本语言即可。下面是一个典型的在同一 .asp 文件中使用两种脚本语言的例子:

< HTML>

< BODY>

< TABLE>

< % Call Callme %>

< /TABLE>

< % Call ViewDate %>

< /BODY>

< /HTML>

< SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Callme

Response.Write "< TR>< TD>Call< /TD>< TD>Me< /TD>< /TR>" End Sub

< /SCRIPT>

< SCRIPT LANGUAGE=JScript RUNAT=Server>

function ViewDate()

{

var x

x = new Date()

Response.Write(x.toString())

}

< /SCRIPT>

这是各位在本文中接触的第一个真正的 ASP 程序,千万不要被“ < % %> ”符号搞糊涂,这其实是标准的 ASP 定界符,而“ < SCRIPT><

/SCRIPT> ”之间的就是脚本语言。 ASP 不同于脚本语言,它有自己特定的第 8 页 共 90 页 第8页

Active Server Pages教程

语法,所有的 ASP 命令都必须包含在 < % 和 %> 之内,如: < %

test="English" %> ,ASP 通过包含在 < % 和 %> 中的表达式将执行结果输出到客户浏览器 , 如: < % =test %> 就是将前面赋给变量 test 的值 English 发送到客户浏览器中,而当变量 test 的值为 Mathematics 时 , 以下程序:

This weekend we will test < % =test %>.

在客户浏览器中则显示为:

This weekend we will test Mathematics.

学习 ASP 最好的方法莫过于亲自动手编写,为了在最短的时间内使各位掌握 ASP 的程序设计技巧,本文将采取实例分析法,通过一系列的实例让各位在实践中学习 ASP 。建立一个 ASP 页面,你所需的只是打开一个文本编辑器,如: Notepad ,然后跟我开始动手编写第一个 ASP 程序。下面我们将建立一个自动监测浏览时间并根据不同时段动态显示不同页面内容的 ASP 程序,请将以下代码剪贴到你的文本编辑器中 , 并存为 test1.asp :

< html>

< body>

< FONT COLOR="Green">

< % If Time < #12:00:00# And Time >= #00:00:00# Then %>

早上好,今天天气不赖啊 !

< % ElseIf Time < #19:00:00# And Time >= #12:00:00# Then %> 下午好 !

< % Else %>

哈喽 ! 今晚你有没有去 IRC 聊天 !

< % End If %>

< /body>

< /html>

将 test1.asp 保存在 WEB 服务器的虚拟目录 ( 如: aspsamp/) 下,并在浏览器中用 HTTP 的方式进行浏览,如:

http://yourcomputername/aspsamp/test1.asp,你将会新奇地发现,你的页面真的活起来了。虽然,这只是一个非常简单的实例,而且这一功能完全可以通过 JavaScript 完成,但是不难发现使用 ASP 要比 JavaScript 简洁、迅速得多,而且运用此法,你完全可以轻而易举地令你的网页在不同的时段展示不同的风格。此例中的“ Time ”实际上是一个 VBScript 内置的显示系统当前时间的函数,由于系统默认的脚本语言是 VBScript ,因此当你在 ASP 命令中调用该函数时,脚本引擎会自动将其转换成当前的系统时间。接下来我们将给 test1.asp 添加一点色彩,在 < body> 标识中添加“bgcolor="< % =bgc %> ”即变为 < body bgcolor="< % =bgc %>"> ,并在 < body> 标记第 9 页 共 90 页 第9页

Active Server Pages教程

前添加如下语句:

< % If Time < #12:00:00# And Time >= #00:00:00# Then

bgc="silver"

ElseIf Time < #19:00:00# And Time >= #12:00:00# Then

bgc="navy"

Else

bgc="red"

End If

%>

如此一来,当用户在不同的时段访问你的页面时,他们将会看到不同的页面背景色。我们可以做的事情还有很多,譬如你想知道在凌晨至十二点之间浏览你页面的客户的姓名,并向他或她问好,那么下面的这段程序将能助你达成心愿。首先你需要在页面中设置表单,将以下 HTML 代码剪贴到“< % If Time < #12:00:00# And Time >= #00:00:00# Then %> ”之后:

欢迎光临我的主页,请填写以下信息 :

< FORM METHOD="POST" ACTION="test1.asp">

< P>

First Name: < INPUT NAME="fname" SIZE="48">

< P>

Last Name: < INPUT NAME="lname" SIZE="48">

< P>

Title: < INPUT NAME="title" TYPE=RADIO VALUE="mr">Mr.

< INPUT NAME="title" TYPE=RADIO VALUE="ms">Ms.

< P>< INPUT TYPE=SUBMIT>< INPUT TYPE=RESET>

< /FORM>

然后在以上 HTML 代码后面添加如下 ASP 命令:

< %

title=request.form("title")

if title="mr" then

%>

欢迎您 Mr.< % =request.form("fname") %> 。

< % elseif title="ms" then %>

欢迎您 Ms.< % =request.form("fname") %> 。

< % else %>

< B>< font color=blue> 欢迎您 < % =request.form("fname")&" "&request.form("lname") %> 。 < /font>< /B>

< % end if %>

保存文件 test1.asp ,并在浏览器中以 HTTP 方式进行浏览,如果此时第 10 页 共 90 页 第10页

Active Server Pages教程

的系统时间在凌晨 0:00:00 和中午 12:00:00 之间的话,浏览器将显示如下画面:

这其实是一个在 Internet 和 Intranet 上常见的功能,即当用户在浏览器端填写完表单后,通过调用一个通用网关程序将用户数据传送到服务器,由服务器进行处理后再将结果返还给客户浏览器。过去为了实现这样的功能必须编写一个独立于 HTML 之外的 CGI 程序,并通过 HTML 进行调用,撇开 CGI 编写复杂等缺点不谈, CGI 的执行效率也是一个大问题,每一个表单 (form) 均须执行一个可执行文档,当多人同时上线使用时,多个文档同时执行,将大大降低 WEB 服务器的执行速度,如今 ASP 提供了与 HTML 完全相融的编程环境,显然要比使用 CGI 便捷得多。

在本期的最后让我们再来看看 ASP 的循环功能,譬如你希望当客户在晚间 7:00 至凌晨 0:00:00 浏览你的页面时,在页面中央显示 6 个笑脸 表示问候,那么你只需要将以下命令剪贴到“ Good Evening! ”后面即可: < % for i=1 to 6 %>

< p>< center>< img src="smile.gif" width="32" height="32" alt=" 晚上好 ">< /p>

< % next %>

这是一个最最基本的循环语句,它将一个笑脸图片重复调用六次并显示在页面上。当然此例的效果完全可以用 HTML 做到,但是不难发现使用 ASP 大大缩短了代码的重复编写,使得程序具有良好的可阅读性。另外,当你制作一个诸如根据用户投票来给所评测的对象评定星级的评测站点时,使用此法,你就完全不需要为每一个星级制作一幅图片。如果一个对象被评为 4 星级,那只需将一颗星的图片循环显示 4 次,以此类推即可。当然,当工作量较小的时候你不会感觉到 ASP 的好处,然而一旦数据量巨增,你将会深刻的体会到 ASP 动态网站给你带来的前所未有的感受 !

第三章 ASP基础

本文 ASP 篇 (1) 展示了 ASP 动态网站设计的一些最基本的方法,相信通过实践各位对 ASP 已经有了最基本的了解,本篇在答复大家所提问题的同时,将进一步介绍 ASP 动态网站的一些基本技巧。

自本文第一篇刊登后 , 络绎不绝地收到了一些朋友的来信,出乎作者的意料,其中有相当一部分是初次接触ASP,因此有许多朋友都提出为何在浏览器中浏览 ASP 篇(1)中的范例时看到的竟然是原代码?由于遇到此问题的朋友较多,故作者在此一并回答。首先,我要再次强调 ASP 是一套服务器端的脚本环境,当用户从浏览器向Web服务器请求.asp文件时, ASP第 11 页 共 90 页 第11页

Active Server Pages教程

脚本开始运行,然后 Web 服务器调用ASP ,ASP全面读取请求的文件,执行所有脚本命令,并将 Web 页传送给浏览器,这就意味着你不能简单地在现有的操作系统(如 Win95、98)下,用浏览器中的 " 打开 " 命令来浏览 .asp 文件;其次,运行 .asp 文件需要服务器端的支持,目前除了WindowsNT下的 Microsoft Internet Information Server支持 Active Server 技术外,Active Server还可用于 MS Windows NT Workstation 和 MS

Windows95/98 中的 Personal Web Server 的构件,因此无论你安装的是 NT 还是 WIN95/98,都必须在原系统上安装支持ASP的服务器端环境,才能使你的机器得以运行 .asp 文件。由于目前绝大多数朋友安装的是 Win95 或是 98 ,因此作者就在这里着重介绍如何在 Win95/98 下运行和浏览 .asp 文件。因为 MSPersonal Web Server 支持通用网关接口 (CGI) 应用程序、Internet 数据库接口 (IDC) 应用程序和 IIS 应用程序接口 (ISAPI) 应用程序,并且支持运行和开发 ASP 应用程序,所以使得 Win95 及其以后操作平台具备了近似于 NT 的健全的网站运作和管理功能。你所要做的只是在现有的 Win95/98 系统上安装 MS Personal Web Server ,建议安装最新的 4.0 版本。当安装完成后, PWS4.0 会在系统启动时自动加载。打开 PWS ,选择左栏中的 " 高级 " 按钮 ( 见下图 Asp2a.gif) ,点取 " 虚拟目录 " 下的 "/_private" 目录,然后点击右边的 " 编辑属性 " 按钮,如图所示,在对话框中你可以编辑该虚拟目录的物理路径和目录名,上图中"/_private"的物理路径为 "D:\Inetpub\wwwroot" ,该目录是系统默认的WWW发布根目录,将上一篇中的范例test1.asp文件复制到 "D:\Inetpub\wwwroot" 目录下。最后,你只要将该虚拟目录的访问权限选择为 "执行" ,并在浏览器的 "地址" 栏中输入 "http://localhost/test1.asp " 就可以运行并浏览该 ASP 程序了。

知道了如何运行并浏览 ASP 程序,下面我们就继续 ASP 动态网站设计的学习。

上一篇给大家介绍了几个最基本的 ASP 程序,相信大家已经对 ASP 的应用有了大致的了解,本篇将继续介绍一些用 ASP 编写的 WEB 动态功能。由于 WEB 浏览器标准的不一致从而使得如何能够让自己制作的网站去适应各种不同的浏览器成为了广大网站设计者最为头疼的事,在如今的形势之下,我们不肯也不可能去抛弃 Netscape 或 IE 中的任何一种客户群,但我们有时候又不得不去考虑客户端浏览器的实际浏览效果,过去我们常用 JavaScript 编写一段程序来辨别客户端使用的不同的浏览器,那么今天就让我们来看看如何使用 ASP 更为便捷且精确地达到这一目的。将以下代码,剪贴到你的 Notebook 中,并保存为 browser.asp 。

< %@ LANGUAGE = VBScript %>

< HTML>

< HEAD>

第 12 页 共 90 页 第12页

Active Server Pages教程

< TITLE>用ASP提供的浏览器性能组件来辨别客户浏览器< /TITLE> < /HEAD>

< BODY BGCOLOR="White" topmargin="10" leftmargin="10"> < font size="4" face="Arial, Helvetica">

< b>用ASP提供的浏览器性能组件来辨< br>别客户浏览器< /b>< /font>< br>

< hr size="1" color="#000000">

< !-- 定义并创建浏览器性能对象 -->

< %

Dim bc

Set bc = Server.CreateObject("MSWC.BrowserType") %>

< !-- 在表格中描述客户浏览器的信息 -->

< Table border=1>

< tr>

< td>Browser Name< /td>

< td> < %=bc.Browser %> < /Td>

< tr>

< td>Browser Version< /td>

< td> < %=bc.Version %> < /Td>

< tr>

< td>Major Version< /td>

< td> < %=bc.Majorver %> < /Td>

< tr>

< td>Minor Version< /td>

< td> < %=bc.Minorver %> < /Td>

< tr>

< td>Frame Support< /td>

< td> < %=bc.Frames %> < /Td>

< tr>

< td>Table Support< /td>

< td> < %=bc.Tables %> < /Td>

< tr>

< td>Cookie Support< /td>

< td> < %=bc.Cookies %> < /Td>

< tr>

< td>Background Sound Support< /td>

< td> < %=bc.BackgroundSounds %> < /Td>

第 13 页 共 90 页 第13页

Active Server Pages教程

< tr>

< td>VBScript Support< /td>

< td> < %=bc.VBScript %> < /Td>

< tr>

< td>JavaScript Support< /td>

< td> < %=bc.JavaScript %> < /Td>

< /table>

< /BODY>

< /HTML>

用 http 方式浏览该文件,不同浏览器,你会看到类似下图 (Asp2b.gif) 的页面。在本例中我们用到了一个ASP提供的 ActiveX 组件 --"Browser Capabilities"。ActiveX 组件作为基于 Web 的应用程序部分在 Web 服务器上运行,组件提供了应用程序的主要功能 ( 如访问、修改数据库等 ) ,这样 WEB 设计者们就不必创建或重新创建执行这些任务的代码,从而提高了工作的效率,有关 ActiveX 组件将在今后详细讨论。为了使用 ASP 辨别客户浏览器,在这里我们利用 "Browser Capabilities" 组件创建了一个 Browser Type 对象,该对象提供带有客户端网络浏览器功能说明的用户脚本,当浏览器连接到网络服务器上时,它会自动发送一个 UserAgentHTTP 标题,该标题是一个声明浏览器及其版本的 ASCII 字符串。此 Browser Type 对象将该标题和在 Browscap.ini 文件中的项进行比较 (Win98 、IIS3 、IIS4 的用户分别可以在以下目录中"win98\system\inersrv"、"\winnt\system32\inetsrv\asp\cmpnts"、"\winnt\system32\inetsrv"找到该文件) 。如果找到匹配的项,则该 Browser Type 对象将认为浏览器列表属性与 UserAgent 标题匹配。若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN" 。我们可以通过更新 browscap.ini 文件将属性或新的浏览器定义添加到该组件中,从而扩大 ASP 识别的浏览器范围和精确度。下面列出了 browscap.ini 中的一部分内容 ( 不包括注释部分 ) :

[IE 4.0] ;;HTTPUserAgentHeader

browser=IE ;;指定该浏览器的名称。

Version=4.0 ;;指定该浏览器的版本号。

majorver=4 ;;指定主版本号

minorver=0 ;;指定副版本号

frames=TRUE ;;指定该浏览器是否支持框架。

tables=TRUE ;;指定该浏览器是否支持表格。

cookies=TRUE ;;指定该浏览器是否支持cookies。

backgroundsounds=TRUE ;;指定该浏览器是否支持背景音乐。

第 14 页 共 90 页 第14页

Active Server Pages教程

vbscript=TRUE ;;指定该浏览器是否支持VBScript。

javascript=TRUE ;;指定该浏览器是否支持JScript。

javaapplets=TRUE ;;指定该浏览器是否 支持 Java程序。

ActiveXControls=TRUE ;;指定该浏览器是否支持 ActiveX 控件。 Win16=False ;; 指定该浏览器是否支持Win16

beta=False ;;指定该浏览器是否测试版。

cdf=True ;;指定该浏览器是否 支持用于 Web 预测的 Channel Definition Format。

;;ie 4.01

[Mozilla/4.0 (compatible; MSIE 4.01*; Windows 95)]

parent=IE 4.0 ;;父标签允许第二个浏览器继承第一个浏览器的定义 version=4.01

minorver=01

platform=Win98

;;Default Browser ;;指定默认的浏览器的设置

[Default Browser Capability Settings]

browser=Default

frames=FALSE

tables=TRUE

cookies=FALSE

backgroundsounds=FALSE

vbscript=FALSE

javascript=FALSE

在上面的例子中,父标签允许第二个浏览器继承第一个浏览器的定义,以便 Microsoft Internet Explorer4.01 定义得以继承 Microsoft Internet Explorer4.0 定义全部的属性 (例如,frames=TRUE 、tables=TRUE以及 cookies=TRUE) 。并通过添加 platform=Win98 行来指定平台,用 version=4.01 重写版本信息。

在先前的 browser.asp 中我们仅仅是将客户浏览器的属性一一罗列了出来,下面让我们添加一些动态的效果。将以下代码剪贴到文件 browser.asp 中( 编辑注 :为显示方便,所有“ < ”符号后都多加了个空格,实际使用时请注意去掉。 ):

< % if (bc.frames = TRUE) then %>

你的浏览器支持框架!< br>

< % else %>

难道现在你还在使用不支持框架的浏览器???< br>

< % end if %>

< % if (bc.tables = TRUE) then %>

第 15 页 共 90 页 第15页

Active Server Pages教程

你的浏览器支持表格。< br>

< % else %>

难道现在你还在使用不支持表格 的浏览器 ???< br>

< % end if %>

< % if (bc.BackgroundSounds = TRUE) then %>

有没有听到美妙的 音乐???< br>

< % else %>

可惜 , 您的浏览器不支持背 景音乐。< br>

< % end if %>

< % if (bc.vbscript = TRUE) then %>

您的浏览器支持Vbscript。< br>

< % else %>

您的浏览器不支持Vbscript。< br>

< % end if %>

< % if (bc.javascript = TRUE) then %>

您的浏览器支持 Javascript。< br>

< % else %>

您的浏览器不支持 Javascript。< br>

< % end if %>

在你的浏览器中刷新 browser.asp ,程序将自动辨别浏览器的属性并动态显示不同的信息。不难发现在整个 browser.asp 文件中几乎没有用到任何复杂的编程,就轻而易举的达到了动态鉴别客户浏览器并动态产生响应事件的效果。事实上,这个程序的关键就在于前文提到的 ActiveX 组件

--"Browser Capabilities" ,它的作用类似于一个 Function ,只需简单地在程序中调用该组件即能达到你所希望的效果。

通过这两篇对 ASP 的介绍,大家已经看到编写 ASP 程序是相当轻松的,要掌握 ASP ,无非就是掌握 ASP 内置的五个对象,以及 ASP 提供的 ActiveX 组件的对象、方法和属性,当然扎实的脚本语言编写能力也是必须的。在今后的课程中作者将用五到六篇的篇幅着重介绍这些内置对象和组件的作用及使用方法,敬请关注。

第四章 脚本基础

通过前两篇的学习,相信各位已经对 ASP 的动态网站设计有了一个基本的概念和整体的印象。从本篇开始作者将从脚本语言的使用着手,由浅入深地带领大家探索 ASP 动态网站设计的真正奥秘。

第 16 页 共 90 页 第16页

Active Server Pages教程

本文第二篇刊登后,很多朋友给我发了“妹儿”,希望能尽快看到本文的第三、第四、乃至第??篇,甚至有位朋友焦急地要我将 ASP 篇的全文发给他。看到有如此之多志同道合的朋友,令我精神大振。虽然 ASP 早在两年前就已经推出了,但直到今年它才以其灵活便捷的开发过程、良好的 WEB 数据库连接功能受到了国人的重视,然而由于目前国内尚缺乏关于 ASP 开发 WEB 应用程序的详尽教材,因此使得国内广大 WEB 开发者们仍处在闭门啃 E 文的阶段,也包括作者本人。也正因为如此,作者才蒙发了写文章的念头,在得到 Chinabyte 网络学院翁斌先生的大力支持后,各位才得以见到此文。

作者殷切希望能通过此文为广大 WEB 开发者和爱好者提供便利,使大家共同来参加 ASP 的学习和交流,为了顾全不同层次读者的需求作者还是决定从最基本的脚本语言的编制着手,随后再一步一步地讲解 ASP 内建对象、ActiveX 组件以及用 ASP 开发 WEB 应用程序的实例,相信通过一段时间持续的学习,不出几个月各位都能够得心应手地开发自己的动态网站。下面就先请大家跟我来学习一些 ASP 中应用脚本语言(以 VBScript 为主)的基础知识。

在开始学习脚本语言之前,你应该理解一些简单的概念 -- 变量、进程。所谓变量是计算机内存中已命名的存储位置,其中包含了数字或字符串等数据,它使用户便于理解脚本操作的名称,为用户提供了一种存储、检索和操作数据的途径。程序是由一个或多个进程组成的,在 VBScript 中,进程就是“指令块”,通常意义上的进程,如 Sub,只是为了简单的数据处理。

在 VBScript 中,严格的来讲变量是不用声明的,

如:< % Mystring="This is my string" % >

然而,即使在使用变量前不需要去声明变量,也应养成在编程时声明变量的良好习惯,因为这样有助于防止错误发生。声明一个变量意味着告诉脚本引擎,有一个特定名称的变量,这样就可以在脚本中引用该变量。在 VBScript 中声明一个变量可以使用“Dim”语句,如下:

< script language="VBScript" >

< !--

Option Explicit ' 要求在脚本中声明所有的变量

Dim Mystring

Mystring="This is my string"

-- >

< /script>

变量的作用域即生命期,决定哪些脚本命令可访问变量。在过程内部声明的变量具有局部作用域。每执行一次过程,变量就被创建然后消亡。而过程外部的任何命令都不能访问它。在过程外部声明的变量具有全局作用域,其值能被 ASP 页上的任何脚本命令访问和修改。声明变量时,局部变第 17 页 共 90 页 第17页

Active Server Pages教程

量和全局变量可以有相同的名称。而改变其中一个的值并不会改变另一个的值。如果没有声明变量,则可能不小心会改变一个全局变量的值。例如,以下脚本命令返回值 1,虽然有两个名为 Y 变量:

< %

Dim YY = 1Call SetLocalVariableResponse.Write Y

Sub SetLocalVariable

Dim Y

Y = 2End Sub % >

由于变量没有显式声明,以下的脚本命令将返回 2。当过程调用将 Y 设置为 2 时,脚本引擎认为该过程是要修改全局变量:

<%

Y = 1Call SetLocalVariableResponse.Write Y

Sub SetLocalVariable

Y = 2

End Sub% >

然而,全局变量仅在单个 ASP 页中可用,要使它在单个 ASP 页之外可用,就必须为变量赋予会话或应用程序作用域。会话作用域变量对一个用户所请求的 ASP 应用程序中的所有页都是可用的。应用程序作用域变量也如此。对单个用户来说,会话变量是存储信息的最佳途径,例如,用户首选项、用户名或用户的标识。对于一个特殊应用程序的所有用户,应用程序作用域是存储信息的最佳途径,例如,应用程序特定的问候语或应用程序所需的初始值。ASP 提供两个内建对象来让您存储变量:Session 对象和 Application 对象,这将在今后的 ASP 内建对象中着重讨论。

让我们再来看看常量的定义,常量是用来代替一个数或字符串的名称,它在整个脚本中保持不变。您可以使用 Const 语句在 VBScript 中创建用户自定义常数。使用 Const 语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:。

如:< % Const mystring=" 这是一个常量 " % >

< % Const myage=100 % >

请注意字符串文字包含在两个引号 (" ") 之间。这是区分字符串型常数和数值型常数的最明显的方法。日期文字和时间文字包含在两个井号 (#) 之间。例如:

< % Const CutoffDate = #6-1-97# % >

在理解了常量和变量之后,我们来看看什么是过程。它是一组能执行指定任务且具有返回值的脚本命令。您可以定义自己的过程,然后在脚本中反复调用它们。您可以将过程定义放在调用过程的 .asp 文件中,也可以将通用过程放在一个共享的 .asp 文件中,然后用 SSI #include 指令将其包含进其他调用其过程的 .asp 文件中。您还可选择另一种方法,即把这些功能第 18 页 共 90 页 第18页

Active Server Pages教程

打包在 ActiveX 组件中。过程定义可出现在 < SCRIPT > 和 < /SCRIPT > 标记内部且必须遵循声明脚本语言的规则。如果过程所用的语言与主脚本语言不同,则要使用 < SCRIPT > 元素。主脚本语言中的过程用脚本分界符 (< % 和 % >) 分隔。用 HTML< SCRIPT > 标记时,必须使用两个属性来保证服务器端能够处理脚本。使用 < SCRIPT > 标记的语法如下:

< SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT >

procedure definition

< /SCRIPT >

这里的 RUNAT=SERVER 属性通知 Web 服务器在服务器上处理脚本。若不设置该属性,脚本将由客户端浏览器处理。LANGUAGE 属性决定此脚本块所用的脚本语言。您可以指定任何一种具有脚本引擎的语言。请使用 VBSCRIPT 指定 VBScript;用 JSCRIPT 指定 JScript。若不设置 LANGUAGE 属性,将用主脚本语言解释此脚本块。

在 VBScript 中,过程被分为两类:Sub 过程和 Function 过程。Sub 过程是包含在 Sub 和 End Sub 语句之间的一组 VBScript 语句,执行操作但不返回值。Sub 过程可以使用参数(由调用过程传递的常数、变量或表达式)。如果 Sub 过程无任何参数,则 Sub 语句必须包含空括号 ()。

Function 过程是包含在 Function 和 End Function 语句之间的一组 VBScript 语句。Function 过程与 Sub 过程类似,但是 Function 过程可以返回值。Function 过程可以使用参数(由调用过程传递的常数、变量或表达式)。如果 Function 过程无任何参数,则 Function 语句必须包含空括号 ()。Function 过程通过函数名返回一个值,这个值是在过程的语句中赋给函数名的。Function 返回值的数据类型总是 Variant。在下面的示例中 Sub 过程使用两个固有的(或内置的)VBScript 函数,即 MsgBox 和 InputBox,来提示用户输入信息。然后显示根据这些信息计算的结果。计算由使用 VBScript 创建的 Function 过程完成,Celsius 函数将华氏度换算为摄氏度。Sub 过程 ConvertTemp 调用此函数时,包含参数值的变量被传递给函数。换算结果返回到调用过程并显示在消息框中。

Sub ConvertTemp()

temp = InputBox(" 请输入华氏温度。", 1)

MsgBox " 温度为 " & Celsius(temp) & " 摄氏度。"

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function

给过程传递数据的途径是使用参数。参数被作为要传递给过程的数据的占位符。参数名可以是任何有效的变量名。使用 Sub 语句或 Function 语句创建过程时,过程名之后必须紧跟括号。括号中包含所有参数,参数间用第 19 页 共 90 页 第19页

Active Server Pages教程

逗号分隔。例如,在下面的示例中,fDegrees 是传递给 Celsius 函数的值的占位符:

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function

要从过程获取数据,必须使用 Function 过程。请记住,Function 过程可以返回值;Sub 过程不返回值。

以上给大家简要介绍了 VBScript,由于篇幅的原因,作者不可能在此详尽介绍 VBScript 的所有知识。但是由于 ASP 本身并不是一种编程语言,因此在大家编写 ASP 应用程序的过程中,必须借助脚本语言来实现许多特殊的功能,所以灵活熟练地掌握脚本语言对一个使用 ASP 编写 WEB 应用程序的程序员来说是至关重要的。无论您是一个有丰富编程经验的高手还是一个初学者,只要您现在希望通过 ASP 编写 WEB 应用程序,作者极力建议您掌握至少一门脚本语言(如 VBScript)。在本篇的末尾作者将留一道课后作业给大家,希望各位能通过自学有关书籍并在实践中迅速掌握脚本语言。

第五章 脚本变量、函数、过程和条件语句

在上一期中作者向诸位简要介绍了 ASP 脚本语言之一 VBScript 的一些基本常识,本期将继续给大家讲解 VBScript 的脚本编写方法,并通过展示 VBScript 在 ASP 程序编写过程中的一系列实例使大家对 VBScript 有更进一层的理解。

大家在学习了脚本语言 VBScript 的变量、常量和过程的基本概念后,本期将继续向各位介绍 VBScript 的函数和语法。

函数和过程一样都是命名了的代码块,但它们却有很大的区别,过程完成程序任务,函数则返回值。我们可以这样理解,过程象一个完整的句子,而函数则象一个单词。举个例子,当你想获取某个数的平方根,你只要将该数传给 VBScript 的 Sqr() 函数,此函数会立即返回该数的平方根。如: A=sqr(9)

则 A=3。熟练掌握脚本语言的函数将给你编写 ASP 程序带来极大的方便,就以上一期结尾处作者布置给大家的课后练习来说,如果你对脚本语言的函数掌握不够全面,那么解决如此之小的一个问题将很有可能花费你相当大的精力。现在让我们来回顾一下这道课后练习。

“作者正在用 ASP 制作一套基于 WEB 的 BBS 系统,希望能在其中添加一项特殊功能,即当任何用户登陆该 BBS 后都能够查阅近七天来所有第 20 页 共 90 页 第20页

Active Server Pages教程

新发布的信息。”

如果你不熟悉 VBScrip,就不会知道 VBScrip 本身提供了一个用来取得日期之间的差或和的函数 DateSerial,它的语法如下:

DateSerial(year, month, day)

如果你要指定一个日期,例如:1998 年 11 月 10 日,那么 DateSerial 函数中每个参数的取值范围都应该是可接受的,即日的取值应在 1 和 31 之间,月的取值应在 1 和 12 之间。但是,也可以使用表示某日之前或之后的年、月、日数目的数值表达式为每个参数指定相对日期。以下样例中使用了数值表达式代替绝对日期。在这里,DateSerial 函数返回 1998 年 11 月 10 日之前二十年 (1990-20) 零两个月 (11-2) 又一天 (10-1) 的日期:即 1978 年 9 月 9 日。程序如下:

Datep=DateSerial(1998-20, 11-2,10-1)

对于 year 参数,若取值范围是从 0 到 99,则被解释为 1900 到 1999 年。对于此范围之外的 year 参数,则使用四位数字表示年份(例如 1800 年)。当任何一个参数的取值超出可接受的范围时,则会适当地进位到下一个较大的时间单位。例如,如果指定了 35 天,则这个天数将被解释成一个月加上多出来的日数,多出来的日数取决于其年份和月份。但是如果参数值超出 -32,768 到 32,767 的范围,或者由三个参数指定(无论是直接还是通过表达式指定)的日期超出了可以接受的日期范围,就会发生错误。

当我们了解并掌握了函数 DateSerial 的使用方法后,再来看看作者布置的这道题目,一切就迎刃而解了。下面我将程序中的此部分代码公布如下:

itemp=DateSerial(Year(date), month(date), day(date)-7)

itemp=DateValue(itemp)

sql="Select * from message Where message.creatime Between #"&date& "# And #" & itemp & "# "

在这里我们又接触到了一组函数 Year,month,day,它们是用来得到一个日期的年、月、日。date 是常数,表示今天日期,而函数 DateValue 则是将字符串变量转化为日期格式的变量。在本段程序的第三行,我们第一次接触到了标准的 SQL 查询语句,这句语句是什么意思呢?

“Select”是标准的 SQL 数据库查询命令,通过 SELECT 语句我们可以在数据库中检索数据,并将查询结果提供给用户,此处的“*”表示查询该名为“message”的数据库中的所有记录,而“where”的作用是设定一个查询条件,是为了将数据库中符合条件的记录取出来,“message.creatime”是一个储存了数据库中记录创建日期的变量。将整句语句连起来理解就是:查询名为 message 的数据库中的所有记录,并将其中创建日期在今天和今天以前七日以内的所有记录存储在变量 sql 中。可能由于大家第一次接触 SQL 语句,一时间无法完全理解它的作用,不过不用担心在今后的章节中作者将专门用一期给大家介绍 SQL 的使用方法。

第 21 页 共 90 页 第21页

Active Server Pages教程

通过上面的学习,大家应该已经能够理解函数在程序中的作用,当然我们不必去死背函数,但要做到熟练运用只有一条捷径 -- 多实践。接下来让我们来看看 VBScript 的基本语法。

了解编程语言的朋友一定知道在程序中控制程序流程的语句主要可以分为条件语句和循环语句,在 VBScript 中可使用以下条件语句: If...Then...Else 语句

Select Case 语句

If...Then...Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式,If...Then...Else 语句可以按照需要进行嵌套。

让我们来创建两个范例文件:if1.asp 和 if2.asp

将以下语句剪贴到记事簿中,并保存为 if1.asp( 注意:请将程序中“<”后的空格去掉 )

< html>

< head>

< TITLE>if1.asp< /TITLE>

< /head>< body bgcolor="#FFFFFF">

< form action="if2.asp" method=get>

Your First Name< INPUT NAME="FirstName" MaxLength=20>< p> Your Last Name< INPUT NAME="LastName" MaxLength=20>< p> < INPUT TYPE=submit>< INPUT TYPE=reset>

< /form>

< /body>

< /html>

将以下语句剪贴到记事簿中,并保存为 if2.asp < html> < head>

< TITLE>ifrespond.asp< /TITLE>

< /head>

< % fname=request.querystring("Firstname")

lname=request.querystring("Lastname")

If fname="George" and lname="Washington" then %>

Hi.You must be the first president!

< % else %>

Hi!Nice to Meet You

< %end if %>

< /body>

< /html>

asp1.asp 产生一个文本输入框,要求用户输入姓、名,如下图: 第 22 页 共 90 页 第22页

Active Server Pages教程

asp2.asp 则是用 IF 语句判断用户输入的姓名是否为“George

Washington”, 并做出相应的反馈。在此我们遇到了一个 ASP 的内建对象 request,通过使用 request 对象可以访问任何用 HTTP 请求传递的信息,包括从 HTML 表格中用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。而 QueryString 集合检索 HTTP 查询字符串中变量的值,HTTP 查询字符串由问号 (?) 后的值指定。如:

http://localhost/if2.asp?Firstname=George&Lastname=Washington

生成值为 "Firstname=George&Lastname=Washington" 的变量名字符串。关于 ASP 对象作者将在今后的几篇里重点讲述。

If...Then...Else 语句的一种变形允许您从多个条件中选择,即添加

ElseIf 子句以扩充 If...Then...Else 语句的功能,使您可以控制基于多种可能的程序流程。

我们将 asp2.asp 的程序部分扩充如下:

< %

fname=lcase(request.querystring("Firstname"))

lname=lcase(request.querystring("Lastname"))

If fname="george" and lname="washington" then %>

Hi.You must be the first president!< p>

< % elseIf fname="ronald" and lname="reagan" then %>

Hi.You must be the actor president!< p>

< % elseIf fname="jimmy" and lname="carter" then %>

Hi.You must be the peanut farmer president!< p>

< % elseIf fname="naoko" or fname="charles" then %>

Hi.Your name reminds me of someone,but I am not sure who!< p> < % else %>

Hi!Nice to Meet You

< % end if %>

可以添加任意多个 ElseIf 子句以提供多种选择。但使用多个 ElseIf 子句经常会使程序变得很累赘。在多个条件中进行选择的更好方法是使用 Select Case 语句。

Select Case 结构提供了 If...Then...ElseIf 结构的一个变通形式,可以从多个语句块中选择执行其中的一个。Select Case 语句提供的功能与 If...Then...Else 语句类似,但是可以使代码更加简练易读。Select Case 结构在其开始处使用一个只计算一次的简单测试表达式。表达式的结果将与结构中每个 Case 的值比较。如果匹配,则执行与该 Case 关联的语句块,我们同样可以用 Select Case 语句来写 asp2.asp 文件:

< %

fname=lcase(request.querystring("Firstname"))

第 23 页 共 90 页 第23页

Active Server Pages教程

lname=lcase(request.querystring("Lastname"))

name=fname+lname

Select case name

case "georgewashington"

response.write "Hi.You must be the first president!< p>" case "ronaldreagan"

response.write "Hi.You must be the actor president!< p>" case "jimmycarter"

response.write "Hi.You must be the peanut farmer president!< p>" case "naokocharles"

response.write "Hi.Your name reminds me of someone,but I am not sure who!< p>"

case else

response.write "Hi!Nice to Meet You"

End Select %>

请注意 Select Case 结构只计算开始处的一个表达式,并且只计算一次,而 If...Then...ElseIf 结构计算每个 ElseIf 语句的表达式,这些表达式可以各不相同。因此仅当每个 ElseIf 语句计算的表达式都相同时,才可以使用 Select Case 结构代替 If...Then...ElseIf 结构。Select Case 语句也是可以是嵌套的,每一层嵌套的 Select Case 语句必须有与之匹配的 End Select 语句。

以上给大家介绍的脚本语言 VBScript 的函数和条件语句的使用方法,由于篇幅的缘故不能详细展开,希望各位有志学习 ASP 的朋友,能在课后进行一定程度的自学和练习。在日常开发 ASP 应用程序的过程中作者本人日渐体会到了脚本语言的重要性,灵活运用脚本语言将非但可以大大提高 ASP 应用程序的开发过程,给广大网站制作人员节省大量的时间,而且还能够增强 ASP 应用程序的执行效率和功能。欲善其事必先利其器,因此作者在此强烈建议诸君,熟练掌握脚本语言,这将对你的 ASP 程序开发大有帮助。由于本文不是 VBScript 教程,因此只能用较小的篇幅给大家简要介绍一些 VBScript 基本常识,在下一期介绍完 VBScript 的循环语句后,我们将正式开始学习 ASP 的内建对象,要深入 VBScript,建议大家找些教材进行自学。如果你在看完本文后有任何问题请及时 Mail 我,如果你有什么好的建议也请来信告知,谢谢。

第 24 页 共 90 页 第24页

Active Server Pages教程

第六章 脚本循环语句

在本文上两篇中,我们学习了脚本语言 VBScript 的变量、函数、过程和条件语句,本篇将继续给大家介绍 VBScipt 的循环语句,并对脚本语言在 ASP 中的应用加以总结。

如果有人告诉你学习 ASP 不需要任何编程知识,那么他错了;如果我告诉你学习 ASP 必须掌握一门编程语言,那么我错了。ASP 动态服务器页面环境的特点就在于它是通过一种或几种脚本语言而写成的,脚本语言可以看作是编程语言的简化版,它易于学习和掌握,这给广大动态网站的设计者们提供了相当大的便利。可以这么说 : 脚本语言运用的得当与否直接关系到 ASP 应用程序的优与劣。继上一篇我们学习了脚本语言 VBScript 的函数和条件语句后,今天我们继续来看看 VBScript 中的循环语句。

循环语句的作用就是重复执行程序代码,循环可分为三类:一类在条件变为“假”之前重复执行语句,一类在条件变为“真”之前重复执行语句,另一类按照指定的次数重复执行语句。在 VBScript 中可使用下列循环语句:

Do...Loop: 当(或直到)条件为“真”时循环。

While...Wend: 当条件为“真”时循环。

For...Next: 指定循环次数,使用计数器重复运行语句。

For Each...Next: 对于集合中的每项或数组中的每个元素,重复执行一组语句。

我们先来看看 Do...Loop,它是可以多次(次数不定)运行语句块。当条件为“真”时或条件变为“真”之前,重复执行语句块。请看下例:

< html>< head>

< title>DoLoop.asp< /title>< body bgcolor="#FFFFFF">< /head>< p>< /p> <p>请将今年到本月为止的每个月份的销售结算记录填写在本页之上。 < %

counter = 1

thismonth = month(now())

Do while counter < thismonth + 1

response.write " " & counter & " 月份 : "

response.write "___________" & "< BR>< br>"

If counter >13 then

exit do

end if

counter = counter+1

第 25 页 共 90 页 第25页

Active Server Pages教程

Loop

%>

< hr>< /body>< /html>

这段 ASP 程序运用循环语句制作了一张销售结算记录表,将以上代码剪贴至记事簿保存为 DoLoop.asp,并在浏览器中以 HTTP 方式进行浏览,根据当前的月份的不同,你将看到如下图的结果。

我们来分析一下此段程序,我们的目的是要根据当前的月份打印一张表格,首先我们建立一个计数器“count”并将其值设为 1,然后我们用函数 month() 和 now() 得到当前的月份,最后建立循环,当 count 的值小于当前月份的值加 1 的时候,即显示月份值及一条横线并将 count 的值加 1,循环语句重复执行直到以上条件为假时退出循环。其中如果 count 大于 13 则用 exit do 立即退出循环。

Do Loop 语句还可以使用以下语法:

Do

[statements][Exit Do]

[statements]Loop [{While | Until} condition]

While...Wend 语句是为那些熟悉其用法的用户提供的。但是由于 While...Wend 缺少灵活性,所以建议最好使用 Do...Loop 语句。下面我们来看看 For Next 语句。For...Next 语句用于将语句块运行指定的次数,在循环中使用计数器变量,该变量的值随每一次循环增加或减少。

下面的示例将过程 MyProc 重复执行 50 次。For 语句指定计数器变量 x 及其起始值与终止值。Next 语句使计数器变量每次加 1。

Sub DoMyProc50Times()

Dim x

For x = 1 To 50

MyProc

Next

End Sub

关键字 Step 用于指定计数器变量每次增加或减少的值。在下面的示例中,计数器变量 j 每次加 2。循环结束后,total 的值为 2、4、6、8 和 10 的总和。

Sub TwosTotal()

Dim j, total

For j = 2 To 10 Step 2

total = total + j

Next

MsgBox " 总和为 " & total & "。"

End Sub

第 26 页 共 90 页 第26页

Active Server Pages教程

要使计数器变量递减,可将 Step 设为负值。此时计数器变量的终止值必须小于起始值。在下面的示例中,计数器变量 myNum 每次减 2。循环结束后,total 的值为 16、14、12、10、8、6、4 和 2 的总和。

Sub NewTotal()

Dim myNum, total

For myNum = 16 To 2 Step -2

total = total + myNum

Next

MsgBox " 总和为 " & total & "。"

End Sub

Exit For 语句用于在计数器达到其终止值之前退出 For...Next 语句。因为通常只是在某些特殊情况下(例如在发生错误时)要退出循环,所以可以在 If...Then...Else 语句的 True 语句块中使用 Exit For 语句。如果条件为 False,循环将照常运行。

最后,让我们来看看 For Each...Next 语句 ,For Each...Next 循环与 For...Next 循环类似。For Each...Next 不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句。这在不知道集合中元素的数目时非常有用。它的语法如下:

For Each element In group

[statements]

[Exit For]

[statements]Next [element]

如果 group 中有至少一个元素,就会进入 For Each 块执行。一旦进入循环,便首先对 group 中第一个元素执行循环中的所有语句。只要 group 中还有其他的元素,就会对每个元素执行循环中的语句。当 group 中没有其他元素时退出循环,然后从 Next 语句之后的语句继续执行。

至此,我们已经完成了对脚本语言 VBScript 所有的基本知识的学习,但是仅凭阅读现有的这几篇文章你是无法熟练运用 VBScript 的,你必须通过不断的实践来提高自己的等级。当然,如果你熟悉 C,你也可以选择JavaScript 来作为 ASP 应用程序的脚本语言。不知大家有没有发现 ASP 程序的调试比较困难,因为没有什么现成的工具,在这里我向大家简要介绍一下 Microsoft Script Debugger,我们可以运用它来进行一定量的程序调试工作。

IIS4.0 所包括的 Microsoft Script Debugger(Script 侦错工具),提供脚本程序的侦错功能。您可以使用 Microsoft Script 侦错工具来进行对使用 VBScript、JScript 编写的脚本程序,以及 Java applets、beans 和 ActiveX 组件的侦错工作。

有的脚本程序在用户端浏览器执行,有的脚本程序(< % … %> 中的第 27 页 共 90 页 第27页

Active Server Pages教程

部份)在服务器端执行。Microsoft Script Debugger,可以侦错用户端执行的脚本程序以及服务器端执行脚本程序。在用户端浏览器执行的脚本程序是在用户端的浏览器当中执行,包括在标准 HTML 代码中的 VBScript、Jscript 部份。在浏览器载入此 HTML 代码或譬如按下按钮触发事件时,将执行此包括脚本程序的 HTML 代码。用户端浏览器执行的脚本程序,主要用于对 HTML 表单输入的基本检查等功能。

在服务器端执行的脚本程序是在 IIS 服务器端执行,包括在 .asp 程序中。先在 IIS 服务器上执行,执行结果产生标准的 HTML 代码,再传送到用户端浏览器。服务器端执行的脚本程序,主要用于多个网页之间的连结,HTML 表单输入的处理,以及存取服务器上数据库的资料等。

Microsoft Script Debugger 提供以下的除错功能:

1、设定中断点

2、逐步追踪脚本程序。

3、设定书签。

4、检视呼叫堆叠。

5、检视和更改变数值。

6、执行脚本指令。

从下一篇开始,我们将开始学习 ASP 的内建对象,敬请关注。

第七章 内建对象Request

从本篇开始作者从 ASP 内建对象着手,为大家详细剖析 ASP 的六个内建对象和各种组件的特性和方法。

在正式开始学习 ASP 的内建对象和组件之前,先让我们来认识一些基本概念,这将对各位今后的学习大有帮助。请看下表:

第 28 页 共 90 页 第28页

Active Server Pages教程

对象就是指由当作完整实体的操作和数据组成的变量。对象是基于特定模型的,在对象中客户使用对象的服务通过由一组方法或相关函数的接口访问对象的数据,然后客户端可以调用这些方法执行某中操作。ActiveX 组件是建立 Web 应用程序的关键,组件提供了在脚本中执行任务的对象。ActiveX 组件是一个文件,该文件包含执行某项或一组任务的代码,由于组件可以执行公用任务,这样程序员们就不必自己去创建执行这些任务的代码。可以利用组件作为脚本和基于 Web 应用程序的基本构造块。只要知道如何访问组件提供的对象,即使是位编写脚本的新手,也可以在不了解组件运作方式的第 29 页 共 90 页 第29页

Active Server Pages教程

情况下编写脚本。总之,组件使您不用学习编程就能够编写强大的脚本。组件是包含在动态链接库 .dll 或可执行文件 .exe 中的可执行代码。组件可以提供一个或多个对象以及对象的方法和属性。要使用组件提供的对象,请创建对象的实例并将这个新的实例分配变量名。使用 ASP 的

Server.CreateObject 方法可以创建对象的实例,使用脚本语言的变量分配指令可以为对象实例命名。如下例:

Set db=Server.CreateObject("ADODB.Connection")

这里的变量 db 就是 ASP 程序创建的访问数据库的对象实例。

Active Server Pages 提供了可在脚本中使用的内建对象。这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储用户信息 , 从而使对象开发者摆脱了很多烦琐的工作。目前的 ASP 版本总共提供了六个内建对象,下面让我们将通过实例分别来进行学习。

一、Request 对象

可以使用 Request 对象访问任何基于 HTTP 请求传递的所有信息,包括从 HTML 表格用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。Request 对象使您能够访问客户端发送给服务器的二进制数据。

Request 的语法 :

Request[. 集合 | 属性 | 方法 ]( 变量 )

在这里作者将挑选一些常用的对象语法进行分析

1、Form

Form 集合通过使用 POST 方法的表格检索邮送到 HTTP 请求正文中的表格元素的值。

语法

Request.Form(element)[(index)|.Count]

参数

element 指定集合要检索的表格元素的名称。

index 可选参数,使用该参数可以访问某参数中多个值中的一个。它可以是 1 到 Request.Form(parameter).Count 之间的任意整数。

Count 集合中元素的个数

Form 集合按请求正文中参数的名称来索引。Request.Form(element) 的值是请求正文中所有 element 值的数组。通过调用

Request.Form(element).Count 来确定参数中值的个数。如果参数未关联多个值,则计数为 1。如果找不到参数,计数为 0。要引用有多个值的表格元素中的单个值,必须指定 index 值。index 参数可以是从 1 到

Request.Form(element).Count 中的任意数字。如果引用多个表格参数中的一个,而未指定 index 值,返回的数据将是以逗号分隔的字符串。

可以使用重述符来显示表格请求中的所有数据值。例如,用户通过指定几个值填写表格,见下图。

第 30 页 共 90 页 第30页

Active Server Pages教程

对于 hobby 参数,您可以使用下面的脚本检索这些值。

< html>

<head><title></title></head>

<body>

<p>请填写你的爱好</p>

<form method="POST" action="form.asp">

< p>< input type="text" name="hobby" size="20">< br>

< input type="checkbox" name="hobby" value=" 足球 ">足球

< input type="checkbox" name="hobby" value="乒乓球">乒乓球< /p> <p>< input type="submit" value=" 发送 " name="B1">

< input type="reset" value="重填" name="B2"></p>

< /form>

< % For Each i In Request.Form("hobby")

Response.Write i & "< BR>"

Next

%>

< /body>< /html>

将以上代码剪贴到记事簿中(注意将“< ”后面的空格去掉),保存为 form.asp 文件并运行,request 对象可以根据你在 form 中填入或选择元素内容的不同将元素逐个显示出来。

当然使用 For...Next 循环也可以生成同样的输出,如下所示 :

< %

For i = 1 To Request.Form("hobby").Count

Response.Write Request.Form("hobby")(i) & "< BR>"Next

%>

2、QueryString

QueryString 集合检索 HTTP 查询字符串中变量的值 ,HTTP 查询字符串由问号 (?) 后的值指定。如:

< A HREF= "example.asp?string=this is a sample">string sample< /A> 生成值为 "this is a sample" 的变量名字符串。通过发送表格或由用户在其浏览器的地址框中键入查询也可以生成查询字符串。

语法

Request.QueryString(variable)[(index)|.Count]

QueryString 集合可以让您以名称检索 QUERY_STRING 变量。

Request.QueryString( 参数 ) 的值是出现在 QUERY_STRING 中所有参数的值的数组。通过调用Request.QueryString(parameter).Count 可以确定参数有多少个值。

我们也可以使用 QueryString 来达到与前一个范例相同的功能。只需第 31 页 共 90 页 第31页

Active Server Pages教程

要将 request.form 部分替换如下:

< %

For Each i In Request.querystring("hobby")

Response.Write i & "< BR>"

Next

%>

3、Cookies

什么是 Cookie?Cookie 其实是一个标签,当你访问一个需要唯一标识你的站址的 WEB 站点时,它会在你的硬盘上留下一个标记,下一次你访问同一个站点时,站点的页面会查找这个标记。每个 WEB 站点都有自己的标记,标记的内容可以随时读取,但只能由该站点的页面完成。每个站点的 Cookie 与其他所有站点的 Cookie 存在同一文件夹中的不同文件内(你可以在 Windows 的目录下的 Cookie 文件夹中找到它们)。一个 Cookie 就是一个唯一标识客户的标记,Cookie 可以包含在一个对话期或几个对话期之间某个 WEB 站点的所有页面共享的信息,使用 Cookie 还可以在页面之间交换信息。Request 提供的 Cookies 集合允许用户检索在 HTTP 请求中发送的 cookie 的值。这项功能经常被使用在要求认证客户密码以及电子公告板、WEB 聊天室等 ASP 程序中。

语法

Request.Cookies(cookie)[(key)|.attribute]

参数

cookie 指定要检索其值的 cookie。

key 可选参数,用于从 cookie 字典中检索子关键字的值。

attribe 指定 cookie 自身的有关信息。如:HasKeys 只读,指定 cookie 是否包含关键字。

可以通过包含一个 key 值来访问 cookie 字典的子关键字。如果访问 cookie 字典时未指定 key,则所有关键字都会作为单个查询字符串返回。例如,如果 MyCookie 有两个关键字 , First 和 Second,而在调用

Request.Cookies 时并未指定其中任何一个关键字,那么将返回下列字符串。

First=firstkeyvalue&Second=secondkeyvalue

如果客户端浏览器发送了两个同名的 cookie,那么 Request.Cookie 将返回其中路径结构较深的一个。例如,如果有两个同名的的 cookie,但其中一个的路径属性为 /www/ 而另一个为 /www/home/,客户端浏览器同时将两个 cookie 都发送到 /www/home/ 目录中,那么 Request.Cookie 将只返回第二个 cookie。

要确定某个 cookie 是不是 cookie 字典(cookie 有否有关键字),可使用下列脚本。

< %= Request.Cookies("myCookie").HasKeys %>

第 32 页 共 90 页 第32页

Active Server Pages教程

如果 myCookie 是一个 cookie 字典,则前面的赋值为 TRUE。否则,为 FALSE。下面我们来看看一个 cookie 的应用实例:

< %

nickname=request.form("nick")response.cookies("nick")=nickname

' 用 response 对象将用户名写入 Cookie 之中

response.write " 欢迎 "&request.cookies("nick")&" 光临小站!"

%>

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

charset=gb2312">

< title>cookie< /title>

< meta name="GENERATOR" content="Microsoft FrontPage 3.0"><

/head>

< body>

< form method="POST" action="cookie.asp">

< p>< input type="text" name="nick" size="20">

< input type="submit" value=" 发送 " name="B1">< input type="reset" value=" 重填 " name="B2">< /p>< /form>

< /body>< /html>

这其实是一个在基于 WEB 的 BBS 或 CHAT 的 ASP 程序中常用的手法,它将用户在起始页面上填入的姓名保存在 cookie 中,这样后面的程序就可以很容易地调用该用户的 nick 了。

4、ServerVariables

大家都知道在浏览器中浏览网页的时候使用的传输协议是 HTTP,在 HTTP 的标题文件中会记录一些客户端的信息,如 : 客户的 IP 地址等等,有时服务器端需要根据不同的客户端信息做出不同的反映,这时候就需要用 ServerVariables 集合获取所需信息。

语法

Request.ServerVariables ( 服务器环境变量 )

第 33 页 共 90 页 第33页

Active Server Pages教程

< TABLE>

<TR>

<TD>< B>Server Variable</B>< /TD>

<TD><B>Value</B></TD>

< /TR>

< % For Each name In Request.ServerVariables %>

<TR>

<TD><%= name %> </TD>

<TD><%= Request.ServerVariables(name) %></TD>

</TR>

</TABLE>

< % Next %>

今天我们详细学习了 ASP 内建对象中的 request 对象,这也是 ASP 程序中使用最频繁的对象,希望大家在课后多多实践。

第八章 内建对象Response

在上一篇中作者给大家详细介绍了 ASP 内建对象之一 Request 的使用方法,相信各位通过一系列的实践已经能够熟练掌握,本篇将继续给大家介绍 ASP 的另一个内建对象 Response。

最近,有很多朋友来“妹儿”催我加快 ASP 篇一文的写作速度,并急切地询问哪里有关于 ASP 的教材。我深深地被大家的学习热情所打动,因此决定将自己平时所搜集的一些 ASP 信息资料拿出来和大家共享,也希望所有的朋友能慷慨地将自己搜集的有关 ASP 的资料告诉作者,谢谢。由于目前国内有关 ASP 的中文教材凤毛麟角,而专门针对 ASP 网站开发的中文教材作者更是闻所未闻(可能是作者孤陋寡闻),只是最近听说出了一本第 34 页 共 90 页 第34页

Active Server Pages教程

清华大学出版社出版的关于 MS InterDev 的傻瓜书,其中有 ASP 的教学,和一本 Active Server Page 2.0 的中文手册,因此目前作者还是主要通过国外网站来获取 ASP 的有关信息和资料,这也是作者写本文的一个主要原因。下面我就将 bookmark 中的一些较经典的 ASP 站点罗列出来:

1、http://www.61k.com

这是作者访问最频繁的 ASP 网站,也是世界上最大最全的关于 ASP 的网站之一,它里面不但有最新的 ASP 文献资料,免费组件,还有一本完整的 ASP 入门教材,它更是 ASP 网站的中枢站点,通过它你可以到达无数的 ASP 相关站点。

2、http://www.61k.com

这本是一个针对 ASP 漏洞而建立的站点,但是它却无疑是一个完备的 ASP 信息站点,它非但提供了 ASP 的文章,及组件还提供详尽透彻的联接地址。

3、http://www.61k.comfaq 和 http://www.61k.comsearch 这是一个作者所看到的最大的网上 ASP 交流站点,它拥有 ASP 解疑的答案,ASP 邮件清单信息,ASP 技巧,你可能需要需要几个月的时间才能读完这些信息。而在 http://www.61k.comAllComponents.asp 你可以读到最新的 ActiveX 组件和大量免费组件的详细介绍,并附有非常实用的文档与例子。

4、http://www.61k.comworkshop/server/asp/aspfeat.asp

大家都知道 Active Server Page 是微软提出的一套基于 NT IIS 的

WEB 服务器端环境,那么这个由微软自己建立的 ASP 技术说明站点,大家当然是不可不看的。

5、http://www.61k.com

在这里你可以获得无数实用的 ActiveX 组件 , 并下载它们的试用版,只可惜其中的大部分极好的组件都是要 Money 的。

6、http://www.61k.comasp/browscap/

大家还记得作者在 ASP2 一文中介绍的那个用来辨别客户端浏览器版本的 Browser Capabilitie 组件吗?在这个站点你可以获得最新的

BROWSCAP.INI 文件,它拥有每一个 ASP 安装时微软没有提供的浏览器的信息,这样你在 ASP 中判断客户浏览器是就能够万无一失了。

7、http://www.61k.comdata/ado/

ASP 最强大且便捷的功能莫过于同数据库的连接,通过 ASP 内建的 ActiveX 组件,我们可以轻而易举的将 WEB 与所有和 ODBC 兼容的数据库连接起来,在这个微软的站点上你可以获取很多实用的 ADO 资料。

8、http://www.61k.comm_sbn4/

一个不错的 ASP 论坛,你可以在那里贴你的问题,读取别人的问题和解答。

第 35 页 共 90 页 第35页

Active Server Pages教程

下面,我们开始学习 ASP 的另一个内建对象 Response。

与 Request 是获取客户端 HTTP 信息相反 ,Response 对象是用来控制发送给用户的信息,包括直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值。

语法

Response.collection|property|method

一、属性

1、Buffer

Buffer 属性指示是否缓冲页输出。当缓冲页输出时,只有当前页的所有服务器脚本处理完毕或者调用了 Flush 或 End 方法后,服务器才将响应发送给客户端浏览器,服务器将输出发送给客户端浏览器后就不能再设置 Buffer 属性。因此应该在 .asp 文件的第一行调用 Response.Buffer。

2、Charset

Charset 属性将字符集名称附加到 Response 对象中 content-type 标题的后面。对于不包含 Response.Charset 属性的 ASP 页,content-type 标题将为 :content-type:text/html。

我们可以在 .asp 文件中指定 content-type 标题,如 :

< % Response.Charset="gb2312") %>

将产生以下结果 :

content-type:text/html; charset=gb2312

注意,无论字符串表示的字符集是否有效,该功能都会将其插入 content-type 标题中。且如果某个页包含多个含有 Response.Charset 的标记,则每个 Response.Charset 都将替代前一个 CharsetName。这样,字符集将被设置为该页中 Response.Charset 的最后一个实例所指定值。

3、ContentType

ContentType 属性指定服务器响应的 HTTP 内容类型。如果未指定 ContentType,默认为 text/HTML。

4、Expires

Expires 属性指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前又回到此页,就会显示缓冲区中的页面。如果设置 response.expires=0,则可使缓存的页面立即过期。这是一个较实用的属性,当客户通过 ASP 的登陆页面进入 WEB 站点后,应该利用该属性使登陆页面立即过期,以确保安全。

5、ExpiresAbsolute

与 Expires 属性不同 ExpiresAbsolute 属性指定缓存于浏览器中的页面的确切到期日期和时间。在未到期之前,若用户返回到该页,该缓存中的页面就显示。如果未指定时间,该主页在当天午夜到期。如果未指定日期,则该主页在脚本运行当天的指定时间到期。如下示例指定页面在 1998 年 第 36 页 共 90 页 第36页

Active Server Pages教程

12 月 10 日上午 9:00 分 30 秒到期。

< % Response.ExpiresAbsolute=#Dec 12,1998 9:00:30# %>

二、方法

1、Clear

可以用 Clear 方法清除缓冲区中的所有 HTML 输出。但 Clear 方法只清除响应正文而不清除响应标题。可以用该方法处理错误情况。但是如果没有将 Response.Buffer 设置为 TRUE,则该方法将导致运行时错误。

2、End

End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理。如果 Response.Buffer 已设置为 TRUE,则调用 Response.End 将缓冲输出。

3、Flush

Flush 方法立即发送缓冲区中的输出。如果没有将 Response.Buffer 设置为 TRUE,则该方法将导致运行时错误。

4、Redirect

Redirect 方法使浏览器立即重定向到程序指定的 URL。这也是一个我们经常用到方法,这样程序员就可以根据客户的不同响应,为不同的客户指定不同的页面或根据不同的情况指定不同的页面。一旦使用了 Redirect 方法任何在页中显式设置的响应正文内容都将被忽略。然而,此方法不向客户端发送该页设置的其他 HTTP 标题,将产生一个将重定向 URL 作为链接包含的自动响应正文。Redirect 方法发送下列显式标题,其中 URL 是传递给该方法的值。如:

< % Response.redirect("www.61k.com) %>

5、Write

Write 方法是我们平时最常用的方法之一,它是将指定的字符串写到当前的 HTTP 输出。

三、集合

Response 对象只有一个集合 --Cookie

Cookies 集合设置 cookie 的值。若指定的 cookie 不存在,则创建它。若存在,则设置新的值并且将旧值删去。

语法

Response.Cookies(cookie)[(key)|.attribute]=value

这里的 cookie 是指定 cookie 的名称。而如果指定了 key,则该 cookie 就是一个字典。attribute 指定 cookie 自身的有关信息。attribute 参数可以是下列之一 :

Domain 若被指定,则 cookie 将被发送到对该域的请求中去。

Expires 指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,必须设置该日期。若此项属性的设置未超过当前日期,则在第 37 页 共 90 页 第37页

Active Server Pages教程

任务结束后 cookie 将到期。

HasKeys 指定 cookie 是否包含关键字。

Path 若被指定,则 cookie 将只发送到对该路径的请求中。如果未设置该属性,则使用应用程序的路径。

至此,我们已经学习的 Response 对象的所有属性、方法和集合的理论知识,下面作者将给大家演示一段简单的程序,通过实践让大家加深理解。先将以下程序剪贴到记事簿中,并保存为 asp7.asp。( 注意将 < 和 % 之间的空格去掉 !!!)

< %

Dim user

Dim flag

Dim pwd

Dim say

Response.buffer=true ' 开启缓冲页面功能

Response.ContentType="text/HTML"

Response.Charset="gb2312"

user=Request.Form("username")

pwd=Request.Form("password")

say=Request.QueryString("say")

%>

< form method="POST" action="asp7.asp">

< p> 用户名 :< input type="text" name="username" size="12">< br> 口令:< input type="password" name="password" size="12">< br>

< input type="submit" value=" 提交 " name="B1">< input type="reset" value=" 取消 " name="B2">< /p>< /form>

< %

If say=1 then

Response.Write " 欢迎书生大驾光临 !"

End If

If say > 1 then

Response.Write " 欢迎再次光临书生的 ASP 网站 !"

End If

If user="Adm" and pwd="shusheng" Then

Response.Expires=1 ' 设置该页面在浏览器的缓冲中存储 1 分钟后过期。

flag=1

ElseIf user="guest" and pwd="guest" Then

Response.Expires=0 ' 使缓存的页面立即过期。

第 38 页 共 90 页 第38页

Active Server Pages教程

Response.Clear ' 清空存储在缓存中的页面

flag=2

ElseIf user="vip" and pwd="vip" Then

Response.Write " 欢迎 VIP 光临书生的 ASP 网站 "

flag=3

Else

flag=0

Response.End ' 立即停止脚本处理,并将缓存中的页面输出

End If

Response.write "< p>< a href='asp7b.asp?flag="&flag&"'> 动态网站设计十八般武艺 --ASP 篇 (7) 实践练习 < /a>< /p>"

' 将变量 flag 的值传送给 asp7b.asp

%>

< p> 动态网站设计十八般武艺 --ASP 篇 (7) 实践练习 < /p> 再将以下程序保存为 asp7b.asp。

< %

Dim saysay=Request.QueryString("flag")

Select case say

case "1"

Response.Redirect "asp7.asp?say=1"

case "2"

Response.Redirect "asp7.asp?say=2"

case "3"

Response.Redirect "asp7.asp?say=3"

case "0"

Response.Redirect "asp7.asp?say=0"

End Select

%>

将这两个程序放在有执行权限的 WEB 虚拟目录下,并以 http 方式访问 asp7.asp。在这两个程序中我们充分运用了至今为止所学过的两个 ASP 内建对象 :Request 和 Response。当你第一次访问 asp7.asp 文件时,页面上出现一个 Form 并提示输入用户名和口令,如果你输入用户名 :Adm、口令 :shusheng, 则会出现如下页面 :

如果你输入用户名 :guest、口令 :guest, 则仅出现如下页面 :

这是为什么呢?因为我们设置了页面缓存,当使用 guest 登陆时,判断程序自动清空其之前所有存储在缓存中的页面,而仅将其后脚本程序执行的结果显示出来。

那为什么第一次登陆 asp7.asp 页面时仅仅只显示一个 Form 对话框第 39 页 共 90 页 第39页

Active Server Pages教程

呢?因为此时程序判断到用户既非 Adm, 也不是 guest 和 vip,所以执行 Response.End, 立即将存储在缓存中的 Form 显示出来,并停止其后的一切脚本处理,包括纯 HTML 代码的显示。

无论你是用 Adm 还是 guest 或 vip 登陆该页面你都可以看到一个超链,该超链指向文件 asp7b.asp,当我们点击该超链时,asp7.asp 将变量 flag 的值作为参数发送给 asp7b.asp, 而后者则根据该参数的值来做出判断,并依据不同情况使用 Response.Redirect 再强行返回 asp7.asp, 并也将一个变量 say 的值作为参数发送给 asp7.asp。如此一来,asp7.asp 又会根据此参数来做出不同的反应。

大家现在都看到了我们仅仅用了两个很简单的程序,就可以做到对同一个页面的多种不同显示结果,这正是 ASP 的魅力所在,各位可以以此示范程序为基础,来进行一些改动,以熟练掌握我们所学的这两个内建对象。今天的课程就到此为止了,在结尾我还要说明两件事。第一,很多朋友来信询问哪里可以看到 ASP 篇的前几篇文章,请大家点击 此处 便可以找到。第二,一些朋友反映文中的 ASP 程序不能运行,这主要是因为 Chinabyte 的页面都是用数据库生成的,它限定在文章中不能使用带 HTML 或 ASP 格式的代码,所以在所有 < 符号后都加了空格,各位只要将 < 后的空格去掉就可以运行程序了,切记。

第九章 内建对象Application 和 Session

在上一篇中作者给大家详细介绍了 ASP 内建对象 Response 的使用方法,在这一篇中作者将继续给大家介绍另两个非常实用且重要的 ASP 的内建对象 Application 和 Session。

在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象。

让我们先来看看 Application 对象。在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。

下面就让我们一起来学习 Application 对象。

一、属性

虽然 Application 对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合。

Application(" 属性 / 集合名称 ")= 值

第 40 页 共 90 页 第40页

Active Server Pages教程

我们可以使用如下脚本声明并建立 Application 对象的属性。 < %

Application("MyVar") = "Hello"

Set Application("MyObj") = Server.CreateObject("MyComponent")

%>

一旦我们分配了 Application 对象的属性,它就会持久地存在,直到关闭 WEB 服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。

二、方法

Application 对象有两个方法,它们都是用于处理多个用户对存储在 Application 中的数据进行写入的问题

1、Lock 方法禁止其他客户修改 Application 对象的属性。

Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。

让我们来看看下面这段用 Application 来记录页面访问次数的程序 : < %

Dim NumVisitsNumVisits=0

Application.LockApplication("NumVisits") = Application("NumVisits") + 1 Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

将以上脚本保存在你的 .asp 文件中,就轻而易举地给你的页面添加了一个计数器。

2、和 Lock 方法相反,Unlock 方法允许其他客户修改 Application 对象的属性。

在上面的例子中,上述例子中,Unlock 方法解除对象的锁定,使得下一个客户端能够增加 NumVisits 的值。

三、事件

1、Application_OnStart

Application_OnStart 事件在首次创建新的会话 ( 即 Session_OnStart 事件 ) 之前发生。当 WEB 服务器启动并允许对应用程序所包含的文件进行请求时就触发 Application_OnStart 事件。Application_OnStart 事件的处理过程必须写在 Global.asa 文件之中。

第 41 页 共 90 页 第41页

Active Server Pages教程

Application_OnStart 事件的语法如下 :

< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>

Sub Application_OnStart. . .

End Sub

< /SCRIPT>

2、Application_OnEnd

Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,Application_OnEnd 事件的处理过程也必须写在 Global.asa 文件之中。

下面让我们来看看在使用 Application 对象时必须注意的一些事项。 不能在 Application 对象中存储 ASP 内建对象。例如,下面的每一行都返回一个错误。

< %

Set Application("var1")=Session

Set Application("var2")=Request

Set Application("var3")=Response

Set Application("var4")=Server

Set Application("var5")=Application

Set Application("var6")=ObjectContext

%>

若您将一个数组存储在 Application 对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。

< % Application("StoredArray")(3) = "new value" %>

这是因为 Application 对象是作为集合被实现的。数组元素

StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。建议您在将数组存储在 Application 对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Application 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。

---asp8a.asp---

< %

dim MyArray()

Redim MyArray(5)

MyArray(0)="hello"

MyArray(1)="some other string"

Application.Lock

Application("StoredArray")=MyArray

Application.Unlock

第 42 页 共 90 页 第42页

Active Server Pages教程

Response.Redirect "asp8b.asp"

%>

---asp8b.asp---

< %

LocalArray=Application("StoredArray")

LocalArray(1)=" there"

Response.Write LocalArray(0)&LocalArray(1)

Application.Lock

Application("StoredArray")=LocalArray

Application.Unlock

%>

与 Application 对象具有相近作用的另一个非常实用的 ASP 内建对象就是 Session。我们可以使用 Session 对象存储特定的用户会话所需的信息。当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。 通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象。当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSIONID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新 ASPSESSIONID Cookie 的值发送给客户端,正是使用这种 Cookie,可以访问存储在服务器上的属于客户程序的信息。Session 对象最常见的作用就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持 cookie 的浏览器中保留,如果客户关闭了 Cookie 选项,Session 也就不能发挥作用了。

一、属性

1、SessionID

SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识。会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。

2、TimeOut

Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限。如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。

二、方法

Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 第 43 页 共 90 页 第43页

Active Server Pages教程

Abandon 方法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面示例将释放会话状态。

< % Session.Abandon %>

三、事件

Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。

1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。

尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。

为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 :

< SCRIPT RUNAT=Server Language=VBScript>

Sub Session_OnStart

startPage = "/MyApp/StartHere.asp"

currentPage = Request.ServerVariables("SCRIPT_NAME")

if strcomp(currentPage,startPage,1) then

Response.Redirect(startPage)

end if

End Sub

< /SCRIPT>

上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理

Session_OnStart 脚本并将用户重定向到启动页中。

2、Session_OnEnd 事件在会话被放弃或超时发生。

关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。

会话可以通过以下三种方式启动 :

1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。

第 44 页 共 90 页 第44页

Active Server Pages教程

2、用户在 Session 对象中存储了一个值。

3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 < OBJECT> 标签创建带有会话作用域的对象的实例。

如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。

< % Session.Timeout = 5 %>

当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。

< % Session.Abandon %>

今天,我们学习了两个在 WEB 页面特别是基于 WEB 的 BBS 或 Chat 上经常使用 ASP 内建对象,由于这两个对象在实际运用中很实用,因此在下一篇中作者将运用至此我们所学过的 4 个 ASP 内建对象,给大家演示一个完整的 ASP 应用程序,相信通过这个练习,能大大加深你对 ASP 应用程序的理解和掌握。敬请关注“动态网站设计十八般武艺 --ASP 篇 (9)”。

第十章 Global.asa文件的使用及Chat程序 在上一篇中作者给大家详细介绍了两个非常实用的 ASP 内建对象 Application 和 Session 的使用方法。由于这两者的 OnStart、OnEnd 事件的脚本都必须在 Global.asa 文件中声明 , 因此,本篇将给大家详细介绍 Global.asa 文件的使用方法。为使大家熟练掌握至今所学过的知识,本篇还将举出一个 ASP 的 Chat 程序,供各位参考。

最近很多朋友来信问我,为什么前两期的范例程序运行时有这样那样的错。首先,我要向大家声明,这些程序都是我自己写的,在出“厂”前都经过合格检验,绝无“假冒伪劣产品”。:) 由于程序中使用了 cookie 记录客户信息,所以如果你在浏览器中没有设置接受 cookie 则程序将不能正常运第 45 页 共 90 页 第45页

Active Server Pages教程

行。另外,程序将客户信息记录在客户端的 cookie 所使用的方法是

Response.Cookie,此语句必须写在 ASP 文件中的第一个 < HTML> 标记前,这是因为 Cookie 是作为 HTTP 传输的头信息的一部分发送给客户的,如果当 HTTP 报头信息已经传输给客户后再使用 Response.Cookie,将出现以下错误 :“HTTP 标题已经写入到客户浏览器。任何 HTTP 标题的修改必须在写入页内容之前。”,可能一些朋友在剪贴程序的时候没有注意,打乱了程序的前后次序 , 或者是错误的将 HTML 代码添加在 ASP 范例程序之前,因而导致程序运行出错。因此,我建议大家一方面在首次运行例程的时候不要对程序进行任何改动,尽量在看懂程序的基础上逐步改进,另一方面在运行 ASP 程序时至少要在浏览器中选择可接受 Cookie,否则一旦 ASP 程序中使用了 Cookie 或 Session,它们都将无法正常运行。

下面我来向大家介绍 Global.asa 文件的使用方法。

什么是 Global.asa 文件?它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的根目录中。每个应用程序只能有一个 Global.asa 文件。

在 Global.asa 文件中,如果包含的脚本没有用 < SCRIPT> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。我们可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 < SCRIPT> 标记中。 在 Global.asa 文件中声明的过程只能从一个或多个与

Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序的 ASP 页中,它们是不可用的。如果要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端包容 (SSI) 语句将该文件包含在调用该过程的 ASP 程序中。通常,包含文件的扩展名应为 .inc。

下面是一个很标准的 Global.asa 文件 :

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

'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行 'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行

'Application_OnStart 当任何客户首次访问该应用程序的首页时运行 'Application_OnEnd 当该站点的 WEB 服务器关闭时运行

< /SCRIPT>

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

Sub Application_OnStart

VisitorCountFilename = Server.MapPath ("/ex2") + "\VisitCount.txt"

Set FileObject = Server.CreateObject("Scripting.FileSystemObject")

第 46 页 共 90 页 第46页

Active Server Pages教程

Set Out= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE, FALSE) Application("visitors") = Out.ReadLine

Application("VisitorCountFilename") = VisitorCountFilename

End Sub

'========================================================= SUB Application_OnEnd

Set FileOutObject = Server.CreateObject("Scripting.FileSystemObject")

Set Out= FileOutObject.CreateTextFile (Application("VisitorCountFilename"), TRUE,FALSE)

Out.WriteLine(application("visitors"))

End Sub

'=========================================================Sub Session_OnStart

Session.Timeout = 5

Application("visitors") = Application("visitors") + 1

Session("ID")=Session.SessionID

End Sub

< /SCRIPT>

在这个 Global.asa 程序中,涉及到了 ASP 的 File Access 组件,它可以提供用于访问文件系统的方法、属性和集合。这将在以后 ASP 的组件中进行展开讨论。在这里,它起到了在服务器上创建新文件并对文件进行写操作的作用。这其实是一个 ASP 页面访问记数器应用程序的 Global 文件,首先当客户首次访问该应用程序的首页时 , 过程 Application_OnStart 定义了在服务器上指定的虚拟目录下新建一个 VisitCount.txt 的文本文件,并将文件的路径和内容保存在应用程序级的变量中。而当任何一个客户访问 ASP 应用程序中的任何一个页面时,过程 Session_OnStart 定义将应用程序级的变量 visitors 的值自动加一。这样,每当有客户访问页面时,变量 visitors 都将自动加一,以起到统计点击率的作用。由于变量 visitors 的值是存储在系统内存之中,所以如果服务器关闭或重新启动,存储在变量中的数据将自动丢失,所以通过定义过程 Application_OnEnd,在服务器关闭或重启之前将数据写入事先建立的文本文件之中,这样就能确保当服务器再次启动时,Application_OnStart 过程可以从 VisitCount.txt 文件中读取以前的统计数。

经过这段时间的学习,相信大家已经能够比较熟练的运用我们所学过的这些 ASP 内建对象来编写一些较简单的 ASP 应用程序,可别小看你现在所掌握的这些 ASP 基本知识哦 ! 其实你已经能够开发一些简单但实用的 ASP 应用程序了。下面我就举一个非常简单的 ASP WEB 聊天室程序,你会发觉写聊天室原来是一件这么容易、轻松的事。可能朋友们已经在一些杂第 47 页 共 90 页 第47页

Active Server Pages教程

志上看到过 ASP 聊天程序的编写方法,但作者在这里自己写了一个更简单的程序,仅仅使用了一个 .asp 文件。请将以下代码剪贴到记事簿并保存为 chat.asp。

< %@ Language=VBScript %>

< %

Response.Buffer=true ' 设置输出缓存,用于显示不同页面。

On error resume next ' 忽略程序出错部分

If Request.ServerVariables("Request_Method")="GET" then

' 判断客户是以什么方式请求 WEB 页面

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

' 客户登陆界面

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

%>

< form method="POST" action="chat.asp">< p>

< input type="text" name="nick" size="20" value="nick"

style="background-color: rgb(192,192,192)">< br>

< input type="submit" value=" 进入聊天室 " name="B1" style="color: rgb(255,255,0); font-size: 9pt; background-color: rgb(0,128,128)">

< p>< input type="hidden" name="log" size="20" value="1">< br>< /p> < /form>

< %

Response.End ' 结束程序的处理

Else

Response.clear ' 清空缓存中的内容

dim talk

If Request.Form("nick")<>"" then

' 判断客户是是否在聊天界面中

Session("nick")=Request.Form("nick")

End If

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

客户聊天界面

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

%>

< form method="POST" action="chat.asp" name=form1> < p><

%=Session("nick")%> 说话:< input type="text" name="talk" size="50">< br> < input type="submit" value=" 提交 " name="B1">

< input type="reset" value=" 取消 " name="B2">< /p>

< /form>

第 48 页 共 90 页 第48页

Active Server Pages教程

< A HREF="/asptest/shusheng/chat.asp"> 离开 < /a>< br>< br>

< %

If Request.Form("log")<>1 then

If trim(Request.Form("talk"))="" then

' 判断用户是否没有输入任何内容

talk=Session("nick")&" 沉默是金。"

Else

talk=trim(Request.Form("talk"))

' 去掉字符后的空格

End If

Application.lock

Application("show")="< table border='0' cellpadding='0' cellspacing='0'

width='85%' >< tr>< td width='100%' bgcolor='#C0C0C0'>< /td>< /tr>< tr>< td width='100%'>< font color='#0000FF'> 来自 "&Request.ServerVariables

("remote_addr") & " 的 "&Session("nick") &time&" 说:< /font>"& talk & "< /td>< /tr>< tr>< td width='100%' bgcolor='#C0C0C0'>< /td>< /tr>< /table>< br>"&Application("show")

Application.UnLock

Response.Write Application("show")

End If

End If

%>

第一次运行 chat.asp 程序,你首先将看到如下页面 :

选择你的 nick 进入聊天室后,将看到如下页面 :

输入你想要说的话,对话将出现在输入框的下方,如下图 : 下面我们来对这个聊天室程序进行逐步的分析。

首先,由于聊天室的所有客户都要能够共享信息,所以不可避免的要用到具有应用程序级变量的对象 Application,这是建立 Chat 程序的关键所在,所有的谈话数据都存放在一个应用程序级变量中,以便让所有的客户读取。我们可以用所学过的 request 对象获取客户所输入的谈话,并保存在变量 talk 中 , 然后将 talk 的值存入应用程序级变量 show 中,如下 : < % Application("show")=talk&Application("show") %>

接下来要考虑的是当不同的客户同时向 Chat 应用程序进行操作的时候如何处理。这个问题其实与在数据库中的两个用户同时写入同一个记录一样,如果两个用户同时对同一个应用程序级变量进行写操作,则一个用户所作的修改会被另一个用户的操作所覆盖,所以,如果对 Application 对象数据的并发访问不采取一定措施,则会导致当两个用户试图同时对 Asp 聊天室应用程序提交时,一个用户的提交内容会被另一个用户的提交内容所覆第 49 页 共 90 页 第49页

Active Server Pages教程

盖,在被参加到会话中的任何人看到之前就消失了。为了避免这类问题的出现,我们需要使用 Application 对象的 Lock 属性来约束只允许当前的用户编辑或增加 Application 对象的属性,这样当用户开始修改应用程序级变量开始,到 Application 对象被显式地 Unlocked 为止,Application 对象的属性只能被该用户编辑,如果此时有其他用户请求编辑 Application 对象,则这些用户要排队等待,知道应用程序被 Unlock 为止。如下所示 : Application.lock

Application("show")=talk&Application("show")

Application.UnLock

现在整个程序的核心部分你已经了解了,下面考虑如何保存客户信息,这里我们要用到一个会话级变量,即将客户的 nick 保存在 Session 中。如: Session("nick")=Request.Form("nick")

最后,我们要考虑的是如何仅在一个 .asp 文件中处理各种事件 , 如 : 客户登陆界面、客户聊天界面。由于客户第一次请求 .asp 文件时,采用的是简单的 HTTP GET 方式,但是当客户向页面上的表单字段中增加的数据并向自身提交表单后,.asp 文件会再次被请求,不过这次数据是经过 HTTP POST 方式进行传递的。文件被请求的方式可以用两种方法来确定。一是测试 Request.Form 集合是否包含成员,若没有,则表明没有发送给表单处理的数据。二是使用 Request.ServerVariables("Request_Method") 变量。如果表单是通过 HTTP GET 方式被请求的,则这个变量会返回“GET”,如果表单被提交处理则返回“POST”。由于后一种方法对于确定文件的请求方式更直接,所以我们使用如下代码进行判断 :

if Request.ServerVariables("Request_Method")="GET" then

由于我们设置了 ASP 缓存,所以当程序判断页面请求方式为 GET 时,程序运行 Response.End,来结束后面的所有操作,否则则运行

Response.clear, 清空缓存中已有的内容,并继续程序的运行。这样我们就得以用同一个 .asp 文件根据不同情况给客户显示不同的界面。

好了,我已经将这个 ASP Chat 程序的核心部分告诉大家了,剩下的一些细节性问题请各位自己读程序吧,其实这个程序还存在很多不足之处,最大的毛病是我没有写自动刷新的功能,因此如果你在 Chat 中不说话,那也就看不到其他客户所说的话了。Chat 在 Internet 中的魅力大家是知道的,其实 , 用 ASP 也完全能做到同 irc 类似的强大功能,当然这就需要写更多的代码,如果大家有兴趣请写信给我,我将在今后的文章中逐步提升这个 chat 程序的等级,让大家也过过“Oper”的隐。注:有了这个 chat 程序,你就可以用来在自己的 PWS 上建一个 chat 应用程序,只要将你的 IP 地址告诉朋友,如 http://202.96.210.33/asp/chat.asp,你们就可以通过你的电脑在网上聊天了,很爽的,不信你试试 !

第 50 页 共 90 页 第50页

Active Server Pages教程

第十一章 内建对象Server

通过前九篇的理论和实践,相信大家已经对 ASP 有了系统的了解,虽然至今为止,我们只学了 ASP 的 4 个内建对象,但已经完全能够写出一些实用的小程序了。今天,作者将继续给大家讲解最后一个 ASP 内建对象——Server。

在开始本次课程之前,我仍要在这里回答一些朋友们提出的比较普遍的问题。最近仍有不少朋友来信问我,如何构建服务器端的 Active Server Page 环境。我想可能是我在前几篇中没有讲清楚,因此,在本篇的开头有必要把这个问题详细阐述一遍。

ASP 的应用完全是基于 Microsoft Internet Infomation Server(简称 IIS)之上的,IIS 有分别用于 Windows NT Server 和 WorkStation 的两个版本中(当然 IIS4.0 也有 Windows98 版,这里暂且不提),其功能几乎完全相同,所不同的只是安装过程。一般来说,我们使用的都是基于 NT 服务器上的 IIS 版本。在 NT Server 的环境中,发布信息、管理站点的工作一般都是通过 IIS 来完成的。通常我们在 NT4.0 版本中运行的是 IIS2.0 版,但它不具有支持 ASP 的功能。ASP 必须在安装完 IIS 后单独安装,安装文件是一个微软发布的 ASP 安装包,大约有 9 兆多,应该可以在微软的网站上下载。当 IIS2.0 中增添了支持 ASP 的功能后,其也就自动升级为 3.0 版本。2.0 和 3.0 对于 WEB 服务器来说,并没有什么大的改动,只是单纯地增加了运行 ASP 的能力。当安装完成后,运行 Internet 服务管理器,你将看到如下画面:

可以到在 IIS3.0 中提供了三种服务:WWW、Gopher、FTP,WWW 服务为客户浏览器提交 WEB 页,并允许客户访问 .asp 文件。当然,你可以直接安装最新的 IIS4.0 版本,作者也建议各位安装此版本,因为它具有更强更高的 WEB 管理机能和安全性。在 IIS4.0 中 IIS 的管理界面发生了根本性的改变,熟悉的 Internet 服务管理器,被取而代之为 Microsoft 管理控制台,简称 MMC。其界面如下图:

那么如何安装 IIS4.0 呢?在 NT4.0 上安装 IIS4.0 时,你的系统中必须已经安装了 NT SP3,以及 Internet Explorer4.01,注意这里的 Internet Explorer 的版本必须是 4.01,版本号为 4.72.3110.8。这点很重要,否则你将不能安装 IIS4.0。作者为了安装该版本特意花费了一个晚上在微软的站点上升级 IE 版本。

IIS 支持虚拟目录,通过在“服务器属性”对话框中的“目录”标签可以管理虚拟目录。建立虚拟目录对于管理 WEB 站点具有非常重要的意义。首先,虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中,客第 51 页 共 90 页 第51页

Active Server Pages教程

户通过选择“查看源代码”,很容易就能获取页面的文件路径信息,如果在 WEB 页中使用物理路径,将暴露有关站点目录的重要信息,这容易导致系统受到攻击。其次,只要两台机器具有相同的虚拟目录,你就可以在不对页面代码做任何改动的情况下,将 WEB 页面从一台机器上移到另一台机器。还有就是,当你将 WEB 页面放置于虚拟目录下后,你可以对目录设置不同的属性,如:Read、Excute、Script。读访问表示将目录内容从 IIS 传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用 ASP 时,就必须将你存放 .asp 文件的目录设置为“Excute(执行)”。作者建议大家在设置 WEB 站点时,将 HTML 文件同 ASP 文件分开放置在不同的目录下,然后将 HTML 子目录设置为“读”,将 ASP 子目录设置为“执行”,这不仅方便了对 WEB 的管理,而且最重要的提高了 ASP 程序的安全性,防止了程序内容被客户所访问。因为在今年 7 月底的时候 IIS 被一些网络高手发现了一个可怕的 bug,那就是,当你在一个站点的 .asp 文件后加上 ::$DATA 后,客户将能在浏览器中看到该 .asp 文件的所有源代码,这对于一个站点来说是非常可怕的。当然微软已经针对这个 bug,编写了补丁,但是为了彻底杜绝这种可能性的发生,作者还一建议大家不要将 .asp 所在的目录设置为可读。

我想,现在各位应该已经完全了解 ASP 的服务器端设置了,下面我们就进入正题 -- 学习 ASP 的最后一个内建对象 Server。

Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务的。有了 Server 对象,你就可以在服务器上启动 ActiveX 对象例程,并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数。

一、语法

Server.property|method

二、属性

ScriptTimeout 超时值,在脚本运行超过这一时间之后即作超时处理。如下代码指定服务器处理脚本在 100 秒后超时。

< % Server.ScriptTimeout=100 %>

这里需要注意的是,通过使用元数据库中的 AspScriptTimeout 属性可以为 Web 服务或 Web 服务器设置缺省的 ScriptTimeout 值。

ScriptTimeout 属性不能设置为小于在元数据库中指定的值。例如,如果 NumSeconds 设置为 60,而元数据库设置包含了默认值 90 秒,则脚本在 90 秒后超时。

三、方法

1、HTMLEncode 方法

HTMLEncode 方法允许你对特定的字符串进行 HTML 编码,虽然 HTML 可以显示大部分你写入 ASP 文件中的文本,但是当你需要实际包第 52 页 共 90 页 第52页

Active Server Pages教程

含 HTML 标记中所使用的字符,就会遇到问题。这是因为,当浏览器读到这样的字符串时,会试图进行解释。例如下面的这段文本 :

这是对 HTMLEncode 方法的测试。< br> 这里应该不会另起一行。 会被浏览器显示为 :

这是对 HTMLEncode 方法的测试。

这里应该不会另起一行。

为了避免此类问题,我们就需要使用 Server 对象的 HTMLEncode 方法,采用对应的不由浏览器解释的 HTML Character Code 替代 HTML 标记字符。所以,用下面的代码才能显示正确的 HTMLEncode 字符串,从而在浏览器中按你的需要输出文本。

< %

Response.write Server.HTMLEncode(" 这是对 HTMLEncode 方法的测试。< br> 这里应该不会另起一行。")%>

2、URLEncode 方法

就象 HTMLEncode 方法使客户可以将字符串翻译成可接受的 HTML 格式一样,Server 对象的 URLEncode 方法可以根据 URL 规则对字符串进行正确编码,当字符串数据以 URL 的形式传递到服务器时,在字符串中不允许出现空格,也不允许出现特殊字符。为此,如果你希望在发送字符串之前进行 URL 编码,可以使用 Server.URLEncode 方法。

3、MapPath 方法

MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。

语法如下 :Server.MapPath(Path)

Path 指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始,则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始,则 MapPath 方法返回同 .asp 文件中已有的路径相对的路径。这里需要注意的是 MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。

对于下列示例,文件 data.txt 和包含下列脚本的 test.asp 文件都位于目录 C:\Inetpub\Wwwroot\asp 下。C:\Inetpub\Wwwroot 目录被设置为服务器的宿主目录。下列示例使用服务器变量 PATH_INFO 映射当前文件的物理路径。以下脚本

< %= server.mappath(Request.ServerVariables("PATH_INFO"))%> 输出

c:\inetpub\wwwroot\asp\test.asp

由于下列示例中的路径参数不是以斜杠字符开始的,所以它们被相对映射到当前目录,此处是目录 C:\Inetpub\Wwwroot\asp。以下脚本 < %= server.mappath("data.txt")%>

第 53 页 共 90 页 第53页

Active Server Pages教程

< %= server.mappath("asp/data.txt")%>

输出

c:\inetpub\wwwroot\asp\data.txt

c:\inetpub\wwwroot\asp\asp\data.txt

4、CreateObject 方法

Server.CreateObject 恐怕是 ASP 中最为实用,也是最强劲的功能了。它用于创建已经注册到服务器上的 ActiveX 组件实例。这是一个非常重要的特性,因为通过使用 ActiveX 组件能够使你轻松地扩展 ActiveX 的能力,正是使用了 ActiveX 组件,你可以实现至关重要的功能,譬如数据库连接、文件访问、广告显示和其他 VBScript 不能提供或不能简单地依靠单独使用 ActiveX 所能完成的功能。正是因为这些组件才使得 ASP 具有了强大的生命力。

其语法如下:

Server.CreateObject("Component Name")

默认情况下,由 Server.CreateObject 方法创建的对象具有页作用域。这就是说,再当前 ASP 页处理完成之后,服务器将自动破坏这些对象。如果要创建有会话或应用程序作用域的对象,可以使用 < OBJECT> 标记并设置 SESSION 或 APPLICATION 的 SCOPE 属性,也可以在对话及应用程序变量中存储该对象。如下例程 :

< % Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%> 这里需要注意的是,不能创建与内建对象同名的对象实例,否则,如下列脚本将返回错误。

< % Set Response = Server.CreateObject("Response") %>

至今为止,我们已经学习完了 ASP 所有的内建对象,不知大家是不是很兴奋?其实 ASP 是很简单的,只要大家不断的实践,相信一段时间后都不难成为 ASP 的高手。从下一篇起作者将开始介绍 ASP 内建 ActiveX 组件,这也是 ASP 运用中非常重要和实用的一部分。敬请关注。 第十二章 数据库查询语言(1)

原定计划从本篇开始就要给大家介绍 ASP 内建的 ActiveX 组件,但是考虑到我们在往后的学习中将会接触到大量的数据库查询,因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知识,这其实也是学习 ASP 所必须掌握的一门知识。是否能够灵活地运用数据库查询语言,将直接关系到 ASP 程序的执行效率等一系列问题,所以请各位务必重视。

第 54 页 共 90 页 第54页

Active Server Pages教程

相信很多朋友都听说过 SQL 这个名字,如果你是计算机方面的行家,SQL 的大名一定是如雷贯耳。那么 SQL 究竟是什么呢?SQL 一词实际上是 "Structured Query Language" 结构式查询语言的缩写,是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;是一种特定类型的数据库 -- 关系数据库。而控制这种数据库的计算机程序就是我们常说的 DBMS-- 数据库管理系统。譬如:SQL Server、Oracle、Sybase、DB2 等等。当用户想要检索数据库中的数据时,就通过 SQL 语言发出请求,接着 DBMS 对该 SQL 请求进行处理并检索所要求的数据,最后将其返回给用户,此过程被称作为数据库查询,这也就是数据库查询语言这一名称的由来。 SQL 并不是象 C、COBOL 和 Fortran 语言那样的完整的计算机语言。SQL 没有用于条件测试的 IF 语句,也没有用于程序分支的 Goto 语句以及循环语句 For 或 Do。确切的讲,SQL 是一种数据库子语言,SQL 语句可以被嵌入到另一种语言中,从而使其具有数据库存取功能。SQL 也非严格的结构式语言,它的句法更接近英语语句,因此易于理解,大多数 SQL 语句都是直述其意,读起来就象自然语言一样明了。SQL 还是一种交互式查询语言,允许用户直接查询存储数据,利用这一交互特性,用户可以在很短的时间内回答相当复杂的问题,而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间。

在大部分 ASP 应用程序中我们都会接触到数据库,而我们在编写 ASP 应用程序时用来进行数据库操作的标准语法正是 SQL,因此 SQL 语法的重要性是不言而喻的。下面,我们就从最常用的 SQL 语句 SELECT 着手,一步一步地来学习 SQL。

查询是 SQL 语言的核心,而用于表达 SQL 查询的 SELECT 语句则是功能最强也是最为复杂的 SQL 语句,它从数据库中检索数据,并将查询结果提供给用户。在本文中我们将建立一个名为 tianjiao 的简单数据库,该库中存放了一个叫 sales 的销售记录表,如下所示 :

姓名 性别 工资 销售目标 销售额 地区

书生 男 2500 8000 9000 上海

吴冠军 男 3000 10000 9999 北京

雷鸣 男 2000 8000 10000 四川

雪儿 女 2500 5000 6000 广州

顾一 男 2600 9000 9800 大连

阿卓 女 2000 4000 4000 天津

熠天 男 4000 20000 20000 全国

在该表中有六列即六个字段 : 姓名、性别、工资、销售目标、销售额、地区,首先我们用 Select 语句列出姓名、销售目标和销售额 :

Select 姓名,销售目标,销售额 From sales

结果如下 :

第 55 页 共 90 页 第55页

Active Server Pages教程

姓名 销售目标 销售额

书生 8000 9000

吴冠军 10000 9999

雷鸣 8000 10000

雪儿 5000 6000

顾一 9000 9800

阿卓 4000 4000

熠天 20000 20000

然后,我们再列出所有男性的姓名、销售目标和销售额 :

Select 姓名,销售目标,销售额 From sales Where 性别 =" 男 " 结果如下 :

姓名 销售目标 销售额

书生 8000 9000

吴冠军 10000 9999

雷鸣 8000 10000

顾一 9000 9800

熠天 20000 20000

接下来,我们做一个相对复杂的查询,列出销售额大于销售目标的所有男性的姓名、销售目标和销售额,并且按销售目标排序。

Select 姓名,销售目标,销售额

Form sales

Where 销售额 > 销售目标

And 性别 =" 男 "

Order By 销售目标

结果如下 :

姓名 销售目标 销售额

书生 8000 9000

雷鸣 8000 10000

顾一 9000 9800

熠天 20000 20000

大家可以看到,对于简单查询,SQL Select 语句和英文语法很相象,我们来分析一下 SELECT 语句的完整格式,它包括六个子句,其中 SELECT 和 FROM 子句是必须的,其它子句可以任选,每个子句的功能如下 :

1、Select 子句列出所有要求 SELECT 语句检索的数据项。它放在 SELECT 语句开始处,指定此查询要检索的数据项。这些数据项通常用选择表表示,即一组用“,”隔开的选择项。按照从左到右的顺序,每个选择项产生的一个列的查询结果,一个选择项可能是以下项目:

(1)、列名:标识 FROM 子句指定表中的列。如果列名作为选择项,则 第 56 页 共 90 页 第56页

Active Server Pages教程

SQL 直接从数据库表中每行取出该列的值,再将其放在查询结果的相应行中。

(2)、常数:指定在查询结果的每行中都放上该值。

(3)、SQL 表达式:说明必须将要放入查询结果中的值按表达式的规定进行计算。

2、From 子句列出包含所要查询数据的表,它由关键字 FROM 后跟一组用逗号分开的表名组成。每个表明都代表一个包括该查询要检索数据的表。这些表称为此 SQL 语句的表源,因为查询结果都源于它们。

3、Where 子句告诉 SQL 只查询某些行中的数据,这些行用搜索条件描述。

4、Group By 子句指定汇总查询,即不是对每行产生一个查询结果,而是将相似的行进行分组,再对每组产生一个汇总结果。

5、Having 子句告诉 SQL 只产生有 Group By 得到的某些组的结果,和 Where 子句一样,所需要的组也用一个搜索条件指定。

6、Order By 子句将查询结果按一列或多列中的数据排序。如果省略此子句,则查询结果将是无序的。

下面作者将提供一个简单但实用的运用 SQL 语句查询的 ASP 程序供大家参考。

为了使大家更清楚更直接地了解 SQL 语法在 ASP 中的应用,我们先将查询的所有核心过程写成一个名为 query2table 的 SUB,然后利用 ASP 的服务器端包容功能调用该 SUB。请将以下语句剪贴到记事簿,保存为 subdbtable.inc 文件,并置于虚拟目录 asptest 下 :

< %

sub query2table(inputquery)

set conntemp=server.createobject("adodb.connection")

conntemp.open "DSN=Student;uid=student;pwd=aspmagic"

set rstemp=conntemp.execute(inputquery)

howmanyfields=rstemp.fields.count -1

' 统计数据库中的列数

%>

< table border=1>< tr>

< %

for i=0 to howmanyfields

%>

< td>< b>< %=rstemp(i).name%>< /B>< /TD>

< % next %>

< /tr>

< %

第 57 页 共 90 页 第57页

Active Server Pages教程

do while not rstemp.eof

%>

< tr>

< % for i = 0 to howmanyfields

thisvalue=rstemp(i)

If isnull(thisvalue) then

thisvalue="?

' 如果字段为空,则将变量 thisvalue 的值定义为一个空格

end if%>

< td valign=top>< %=thisvalue%>< /td>

< % next %>

< /tr>

< %rstemp.movenext

loop%>

< /table>

< %

rstemp.close

set rstemp=nothing

conntemp.close

set conntemp=nothingend sub%>

完成了 SUB 的定义过程,在下面几个 ASP 程序中我们只要加入想要使用的 SQL 查询语句,并调用该过程就可以非常方便的得到查询结果。将以下四段代码分别保存为 asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp 四个 .asp 文件。

< HEAD>< TITLE>asp11a.asp< /TITLE>< /HEAD>

< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where name like 'A%%'") ' 将表 publishers 中所有姓名中有字母 A 的记录查询出来

%>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> < HEAD>< TITLE>asp11b.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from titles where Year_Published > = 1998") ' 将表 titles 中所有发表年份大于或等于 1998 年的记录查询出来 %>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> 第 58 页 共 90 页 第58页

Active Server Pages教程

< HEAD>< TITLE>asp11c.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where amount>10000 and sex='male'")

' 将表 publishers 中所有数量大于 10000 且性别为男的记录查询出来 %>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> < HEAD>< TITLE>asp11d.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where state< > 'NY'")

'将表 publishers 中所有所在城市不为纽约的记录查询出来。

%>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> 利用 subdbtable.inc 文件中的所定义的过程 query2table,你就可以非常迅速地对数据库进行查询,你所要做的只是将“conntemp.open

"DSN=Student;uid=student;pwd=aspmagic"”中的数据库名称、用户身份和密码稍加改动,并在调用 query2table 时输入想要使用的 SQL 查询语句即可。是不是很简单 ? 这就是 ASP 和 SQL 的魅力所在 !!!

今天,我们虽然用了一整篇的篇幅只学习了一个 SQL 指令,但请你相信你所获得远不同于一个 DOS 指令,SELECT 指令使得你可以非常容易地对数据库进行查询,或许在这之前你对数据库查询还一无所知,但是通过本篇的学习,你其实已经会使用 ASP 进行常用的数据库查询了,是不是很激动 ? 在下一篇中,作者将继续给大家介绍 SQL 的其它几个基本指令。在结束本文之前,作者在这里要向很多来信的朋友致歉,由于最近作者工作繁忙,实在无暇一一回答各位的问题,请见谅,我会尽量将一些常见的、发生频率较高的问题在文章中写出来,至于一些不常见的问题,我建议大家到下面这个站点提问,你将会得到及时的答复。

www.61k.comfriend/flybird/bbs/wwwboard.asp?id=1, 这是作者至今为止所见的最棒的中文 ASP 学习站点,由上海的飞鸟主持,大家务必去看看。 第十三章 数据库查询语言(2)

在本篇的开头,我要感谢一些朋友来信给我指出了前几篇文章中的错误。不知大家是否记得在第八篇中我举了一个简单的利用 Application 制作第 59 页 共 90 页 第59页

Active Server Pages教程

的页面访问计数器?有位朋友来信问我,为何当他改变计数器起始变量 NumVisits 的值后对最后的记数结果没有任何作用?起初我也大惑不解,让我们来回忆一下这段源程序,如下:

< %

Dim NumVisits

NumVisits=0

Application.Lock

Application("NumVisits") = Application("NumVisits") + 1

Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

在这段程序中,如果你试图通过改变变量 NumVisits 的值来改变记数器结果,是绝对办不到的。因为用变量的值去改变 Application 的值是不可以的,这两者是不相关的。所以这里对变量的定义和赋值都是多余的。那么我们究竟应该如何来给 Application("NumVisits") 定义一个初始值呢?请看以下修正后程序:

< %

If Application("NumVisits")< 999 then

Application("NumVisits")=999

End If

Application.Lock

Application("NumVisits")=Application("NumVisits")+1

Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

这里的 999 就是你要设定的计数器初始值,如此一来问题就迎刃而解了。我非常感谢这位姓康的朋友给我指出了这个错误,虽然这只是一个很小的漏洞,但我们在共同学程序写程序的过程中非常需要这种严谨细致的作风,希望今后朋友们们一旦发现文中的错误即刻来信告知,我也能及时纠正,谢谢。

SQL 语言可以分为两大部分:数据定义语言和数据操纵语言,继上一篇我们学习了数据操纵语言中的 Select 语句后,今天作者要继续给大家简要介绍其余的 SQL 语句。

SQL 是一种完备的数据处理语言,不仅用于数据库查询,而且用于数据库中的数据修改和更新,与支持 SQL 查询的 Select 语句的复杂性相比较,更改数据库内容的 SQL 语句就格外简单。然而对于一个 DBMS 来说,第 60 页 共 90 页 第60页

Active Server Pages教程

数据更新所造成的风险大大超出了数据查询。数据库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据库必须保持一致性, DBMS 还必须协调多用户的并行更新,以确保用户和他们的更改不至于影响其他用户的作业。

用于修改数据库内容的 SQL 语句主要有以下三个:

1、 Insert,向一个表中加入新的数据行

2、 Delete,从一个表中删除数据行

3、 Update,更改数据库中已经存在的数据

首先我们来看看 Insert 的用法:

标准语法:

INSERT INTO table_name (col1, col2...) VALUES(value1, value2...) 下例要将书生作为一个新的销售员加入表 Salesreps 中

Insert Into Salesreps (name,num,sales,hire_date,income) values

('shusheng',9,10000,'23-Feb-99',2000)

在此语句中,列的名称列在括号中以逗号隔开,接下去是 Value 短语和括号中同样以逗号隔开的每列数据,应该注意的是数据和列名称的顺序是相同的,而且若是字符串型则以单引号隔开。从概念上来讲, Insert 语句建立的一个与表列结构相一致的数据行,用取自 Values 子句的数据来填充它,然后将该新行加入表中,表中的行是不排序的,因此不存在将该行插入到表的头或尾或两行之间的这个概念。 Insert 语句结束后,新行就是表的一部分了。

Insert 语句还可以将多行数据添加到目标表中去,在这种形式的 Insert 语句中,新行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值来自数据库自身的行,这乍看起来似乎有些奇怪,但是在某些特定的状态下,这是非常有用的。比如,你想把 1998 年 12 月 30 日之前产生的订单编号、日期和数目从 order 表中拷贝到另一个名为 oldorder 的表中去,多行 Insert 语句为拷贝数据提供了一种紧凑而高效的方法,如下:

Insert into oldorder (Num,Date,Amount)

Select Num,Date,Amount

From order

Where Date<'30-12-98'

这条语句看起来有些复杂,其实很简单,语句标识了接收新行的表 oldorder 和接收数据的列,完全类似于单行 Insert 语句。语句的剩余部分是一个查询,它检索 order 表中的数据。 SQL 先执行对 order 表的查询,然后将查询结果逐行插入到 oldorder 表中去。

下面我们来看看 Update 的用法, Update 语句用于更新单表中选定行的一列或多列的值。要更新的目标表在语句中定义, Set 子句则指定要更第 61 页 共 90 页 第61页

Active Server Pages教程

新哪些列并计算他们的值。 Update 语句总是包含 Where 语句,而且 Update 语句比较危险,所以您必须明确地认识到 Where 语句的重要性, Where 语句被用来指定需要更新的行。

标准语法:

UPDATE table_name

SET columnname1 = value1

[, columname2 = value2]...

WHERE search_condition

以下是一个简单的 Update 语句的例子 :

Update customers

Set credit=100000.00,id=99

Where name='asp'

在此例中我们将表 customers 中客户名为 asp 的客户的信贷值更新为 10 万并将他的 ID 变更为 99。再看下例:

Update customers

Set credit=200000.00,state=021

Where ID in (80,90,100,120)

我们可以发现,其实 SQL 处理 Update 语句的过程就是逐行遍历所指定的表,更新其搜索条件结果为“真”的行,跳过其搜索条件结果为“假”或“空”的行。

最后,来看看 Delete 语句。

标准语法:

DELETE FROM tablename

WHERE condition

由于它过于简单,所以所造成的后果也是严重的,虽然其中的 Where 子句是任选的,但它几乎总是存在的,若将 Where 子句从 Delete 语句中省略掉,则目标表的所有行都将被删除。看下例:

Delete from order Where ID=99

在文章的末尾,作者在给大家简要介绍一下数据定义语言。它是用来创建和修改数据库结构的一种语句,包括 Create 和 Drop 语句。

1、 Create 语句

标准语法:

CREATE TABLE table_name

( field1 datatype [ NOT NULL ],

field2 datatype [ NOT NULL ],

field3 datatype [ NOT NULL ]...)

如:

CREATE TABLE BILLS

第 62 页 共 90 页 第62页

Active Server Pages教程

( NAME CHAR(30),

AMOUNT NUMBER,

ACCOUNT_ID NUMBER)

尽管 Create Table 比前面介绍的语句难理解一些,但仍然很直观。它将 bills 赋予一个新表,并指定表中三列的名称和数据类型。表被建立后我们就可以添入数据了。如:

Insert into bills(name,amout,account_id) values('gates',100,1)

如果,你觉得不再需要保存产品信息,则可用 Drop table 语句将该表及其所包含的所有数据从数据库中删除掉。

标准语法:

DROP TABLE table_name

至此,我们已经了解了所有常用的 SQL 语句,可别小看这些貌似英文的简单语句,它们的功能十分强大,当我们编写 asp 程序时必须使用他们对数据库进行操作。从下一篇开始,作者将给大家介绍 ASP 的内建 ActiveX 组件,敬请关注。

第十四章 ActiveX 组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等,本文从本篇开始将陆续给大家介绍 ASP ActiveX 组件的使用方法。 从今天开始我们将正式学习 ASP 的精华部分 --ActiveX 组件。事实上,当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作或者对 WEB 服务器上的文件系统进行操作,亦或你需要一个 WEB 广告交换程序,所有这一切你都必须通过调用 ASP 内建的 ActiveX 组件或自己编写所需的组件来完成。

那么,究竟什么是 ActiveX 组件呢?它又是如何运作的呢?其实 ActiveX 组件是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。例如,股票行情收报机组件可以在 Web 页上显示最新的股票报价。当你在 WEB 服务器上安装完 ASP 环境后,就可以直接使用它自带的几个常用组件,如 Database Access 组件。当然你也可以从第三方开发者处获得可选的组件 , 也可以编写自己的组件。你可以利用组件作为脚本和基于 Web 应用程序的基本构造块,只要知道如何访问组件提供的对象,即使你是位编写脚本的新手,也可以在不了解组件运作方式的情况下编写 第 63 页 共 90 页 第63页

Active Server Pages教程

ASP 程序。总而言之, ActiveX 组件使您不用学习复杂的编程就能够写出强大的 WEB 服务器端脚本。如果您是位 Web 应用程序的开发者,可以使用任何支持组件对象模型(COM)的语言来编写组件,如, C、 C++、 Java 或 Visual Basic。如果你熟悉 COM 编程, ActiveX 组件就是 Automation 服务器。但是要在 Web 服务器上运行, ActiveX 组件不能有图形用户接口元素,如 Visual Basic 的 MsgBox 函数。组件是可以重复使用的。在 Web 服务器上安装了组件后,就可以从 ASP 脚本、 ISAPI 应用程序、服务器上的其他组件或由另一种 COM 兼容语言编写的程序中调用该组件。

那么我们在 ASP 中应该如何调用组件呢?如前所述,组件是包含在动态链接库 (.dll) 或可执行文件 (.exe) 中的可执行代码。组件可以提供一个或多个对象以及对象的方法和属性。要使用组件提供的对象,我们首先要创建对象的实例并将这个新的实例分配变量名。使用 ASP 的

Server.CreateObject 方法可以创建对象的实例。接着,使用脚本语言的变量分配指令为对象实例命名。创建对象实例时,必须提供实例的注册名称“PROGID”。如下要创建一个 Ad Rotator 对象的实例 :

< % Set MyAds = Server.CreateObject("MSWC.AdRotator") %>

我们必须使用 ASP 的 Server.CreateObject 方法来创建对象实例,否者 ASP 无法跟踪脚本语言中对象的使用。

使用 HTML< OBJECT> 标签同样可以创建对象实例,但必须为

RUNAT 属性提供服务器值,同时也要为将在脚本语言中使用的变量名提供 ID 属性组。使用注册名 (PROGID) 或注册号码 (CLSID) 可以识别该对象。下面的例子使用注册名 (PROGID) 创建 Ad Rotator 对象的实例:

< OBJECT RUNAT=Server ID=MyAd PROGID="MSWC.AdRotator">< /OBJECT>

下面列出了 ASP 可安装的常用组件。

Ad Rotator 创建一个 AdRotator 对象,该对象可按指定计划在同一页上自动轮换显示广告。

Browser Capabilities 创建一个 BrowserType 对象,该对象决定访问 Web 站点的每个浏览器的性能、类型及版本。

Database Access 提供用 ActiveX Data Objects (ADO) 对数据库的访问。 Content Linking 创建一个 NextLink 对象,该对象可生成 Web 页内容列表,并象书一样将各页顺续连接。

File Access 组件 提供文件的输入输出访问。

Collaboration Data Objects for NTS 组件 可以快速、简便的在 Web 页上添加收发邮件功能。该组件只适用于 Internet Information Server for Windows NT? Server 。

MyInfo 创建一个 MyInfo 对象,该对象追踪个人信息,例如站点管理员的姓名、地址及显示选择。

第 64 页 共 90 页 第64页

Active Server Pages教程

Counters 创建一个 Counters 对象,该对象可以创建、保存、增加或检索任意数量的独立计数器。

Content Rotator 自动翻转 Web 主页上的 HTML 内容字符串。 Page Counter 记录并显示 Web 页被打开的次数。

现在 WEB 广告几乎充斥了整个网络,那么究竟如何在你自己的网站上建立一个符合广告领域标准功能的广告系统呢?答案是利用 ASP AD Rotator 组件 ! 它允许在每次访问 ASP 页面时在页面上显示新的广告,并且提供了很强的功能,例如 : 旋转显示在页面上的广告图象的能力、跟踪特定广告显示次数的能力以及跟踪客户端在广告上单击次数的能力。 AD Rotator 组件的工作是通过读取 AD Rotator 计划文件来完成的,该文件包括与要显示的图象文件的地点有关的信息以及每个图象的不同属性,下面就是一个标准的 AD Rotator 计划文件 :

---ADROT.TXT---

REDIRECT /scripts/adredir.asp

WIDTH 440

HEIGHT 60

BORDER 1

*

ads/homepage/chinabyte.gif

http://www.61k.com

Check out the IT site

2

ads/homepage/gamichlg.gif

-

Sponsored by Flyteworks

3

ads/homepage/asp.gif

http:// www.61k.com

Good ASP site on net

3

ads/homepage/spranklg.gif

http://www.61k.com

The #1 Sports site on the net

2

该段代码的前四行包含广告的全局设置。 Redirect 行指出广告将成为其热连接的 URL, 注意这里不是为广告本身指定的 URL,而是将调用的中间页面的 URL,这样我们就可以通过这个中间页面跟踪单击广告的次数。该 Redirect URL 将与包含两个参数的查询字符串一起调用 : 特定广告主第 65 页 共 90 页 第65页

Active Server Pages教程

页的 URL 和图象文件的 URL。星号上面的其余三行简单说明如何显示广告。前两行以像素为单位指定网页上广告的宽度和高度,默认值是 440 和 60 个像素。后一行,同样是以像素为单位指定广告四周超链接的边框宽度 , 默认值是 1 个像素。如果将该参数设置为 0,则将没有边框。

星号下面的行以每四行为一个单位描述每个广告的细节。在此例中共有 16 行,描述四个广告。每个广告的描述包含图象文件的 URL、广告的主页 URL(如果广告客户没有主页,请在该行写上一个连字符“-”,指出该广告没有链接)和图象的替代文字以及指定该页与其他页交替显示频率的数值。 图象是重定向页面的热连接,它在查询字符串中设置了两个值,

url=/scripts/adredir.asp 以及 image=/ads/homepage/asp.gif。要确定广告显示的频率,可以将计划文件中所有广告的权值相加,在该例中总数是 10,那么 aspallian 的广告权值为 3,这意味着 AdRotator 组件每调用十次,它则显示 3 次。

重定向文件是用户创建的文件。它通常包含用来解析由 AdRotator 对象发送的查询字符串的脚本并将用户重定向到与用户所单击的广告所相关的 URL。用户也可以将脚本包含进重定向文件中,以便统计单击某一特定广告的用户的数目并将这一信息保存到服务器上的某一文件中。增加计数器和重定向用户是通过下面两行 ASP 脚本来实现的 :

< %

Counter.Increment(request.querystring("url"))

response.redirect(request.querystring("url"))

%>

现在我们看一下 Ad Rotator 组件是如何在页面中使用的,首先必须使用 Server.CreateObject 方法实例化 Ad Rotator 对象。 Ad Rotator 组件的 PROGID 属性是 MSWC.AdRotator。完整的代码如下 :

< % Set ad = Server.CreateObject("MSWC.AdRotator") %>

< %= ad.GetAdvertisement("/ads/adrot.txt") %>

Ad Rotator 组件支持的唯一方法是 GetAdvertisement,它只有一个参数 :AdRotator 计划文件的名称。注意指向文件的路径是从当前虚拟目录的相对路径,物理路径是不允许的。 GetAdvertisement 方法从 Rotator 计划文件中获取下一个计划广告的详细说明并将其格式化为 HTML 格式。下面的 HTML 由 GetAdvertisement 方法生成且被添加到网页的输出中,以便显示 Rotator 计划文件中的下一个广告。

< A

HREF="http://www.61k.comscripts/adredir.asp?http://www.61k.com">< IMG

SRC="http://www.61k.comads/homepage/asp.gif" ALT="Good ASP site on net" WIDTH=440 HEIGHT=60 BORDER=1>< /A>

第 66 页 共 90 页 第66页

Active Server Pages教程

使用 AdRotator 组件我们可以直接通过对象属性而不是计划文件中的设置来直接控制某些广告特性,其可用属性如下 :

Border 指定广告边框的大小。

Clickable 指定广告是否为超链接。

TargetFrame 指定显示广告的框架的名称。

< %

Set ad = Server.CreateObject("MSWC.AdRotator")

ad.Border = 0

ad.Clickable = true

ad.TargetFrame = AdFrame

ad.GetAdvertisement("/ads/adrot.txt")

%>

通过上面的学习,相信你已经能够熟练运用 ASP 的内建 AdRotator 组件为自己的网站建立一个标准的广告显示程序了。你是否难以相信一切竟是如此的简单?其实真正能令你震惊的还在后头呢,敬请关注下一篇 ASP ActiveX 组件大揭密!

第十五章 常用的ASP ActiveX组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等,继上篇介绍了 AD Rotator 组件后,本篇将接着给大家介绍其它一些常用的 ASP ActiveX 组件的使用方法。

最近仍有不少朋友来信问我, ASP 是否只能在 Microsoft IIS 上运行,是否可以在非 NT 平台上运作?本来这个问题我已经回答过很多遍了 : 我只是听说过有某种可以支持的软件,却从没见过。但一些热情的朋友仍然孜孜不倦地来信询问,于是在朋友们的盛情之下,我访遍了 ASP 相关站点,竟惊奇的发现,原来 ASP 的确是可以运行在其它非 NT 平台上的,因此在本篇的开头,我就给来信的朋友们简要介绍一下如何在非 NT 平台上使用 ASP。

要在非 NT 平台上开发并运行 ASP 应用程序我们可以依赖于一套名为 Instant ASP 的第三方软件,它的广告标语非常吸引人“ASP Anytime, Anywhere”,我想所有 ASP 的开发者们看到如此的标语必然兴奋不已。这套由 Halcyon 软件公司开发的软件使得你无需重复开发原有 ASP 应用程序即可以将它运行在任何操作平台上 ! 这样非但节省了大量的开发时间,而且使得 ASP 真正成为了一种跨平台的 Internet、 Intranet 或 Extranet 应第 67 页 共 90 页 第67页

Active Server Pages教程

用程序。 Instant ASP 本身其实是一套基于 Java 的应用程序,因此通过它你可以将基于 WEB 的 ASP 应用程序运行在任何平台上,下表列出了 Instant ASP 目前版本所支持的操作平台。

更令人吃惊的是 Instant ASP 不仅提供了 ASP 的运作环境,而且它较目前市场上的 ASP 应用还提供了更为强大和实用的功能,它将 ActiveX 组件和 Enterprise Java Beans 或者 CORBA-compliant objects 组合起来,从而使 ASP 有了更为广泛的应用。它同样提供了通过 ADO 接口访问连接各种数据库,并生成动态页面的强大功能。对于开发者而言可以使用自己擅长的编程语言或工具如 :Visual Basic, JScript, VBScript, C++, Java, HTML,

Delphi , MS Visual InterDev 等等来进行开发。关于 Instant ASP 具体安装和操作我就不在这里展开了,有兴趣的朋友可以到它的站点上去看看 halcyonsoft.com,你还可以免费下载一个试用版试试。

继上一篇中作者给大家介绍了 AD Rotator 组件的使用方法后,今天我们接着来看看其它的一些 ASP 常用组件。

一、 Database Access 组件

我们在 WEB 服务器上运用 WEB应用程序进行的最常见和最实用的任务就是访问服务器端的数据库。而

ASP 内建的 Database Access 组件使得我们能够轻而易举地通过 ActiveX Data Objects (ADO) 访问存储在服务器端的数据库或其他表格化数据结构中的信息。

ADO 是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到你的 Active Server 页面上。可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源,这样 ASP 程序员就可以访问任何与

ODBC 兼容的数据库,包括 MS SQL SERVER、Access、Oracle 等等。如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现 ADO 命令语句并不复杂而且容易掌握。同样地,如果您是一个经验丰富的数据库编程人员,您将会正确认识 ADO 的先进的与语言无关性和查询处理功能。熟悉 VB 数据库编程的朋友会发现 ADO 与RDO (Remote Data Objects) 有某种类似的地方。但据说 ADO 的访问的速度更快,内存需要更小。 下面给大家简要介绍一下利用 ASP 的 Database Access 组件通过 ADO 连接并操作 WEB 数据库的步骤

第一步 : 指定想要连接的数据库,有 DSN 和 DSN-less 两种方法。 DSN(Data Source Name 数据源名称 ): 建立一个系统数据源名称,方法如下 :

1、单击“开始”,选设置控制面板。

2、双击图标“32 位 ODBC” , 将弹出一个对话框,选标签“System DSN” 第 68 页 共 90 页 第68页

Active Server Pages教程

3、单击“Add”添加一个 DSN 入口 , 选择如“Microsoft Access Drive”并确认。

4、在“Data Source Name”栏里输入你希望指定的 DSN, 然后单击“Select”选择数据库存放位置,你可以按“Browse”来选取。

5、以上步骤完成后在 ASP 程序中指定 DSN,如下 :

< %connstr = "DSN"%>

DSN-less:

是另一种通过在 ASP 文件里直接指定数据库文件所在位置,而无需建立 DSN 的方法。由于许多公司没有自己的 WEB 服务器,他们的网站往往是存放在远端的虚拟服务器上,因此要建立和修改 DSN 的设置比较麻烦。而使用 DSN-less 方法直接指定远端数据库所在位置恰恰解决了这一问题,方法如下 :

< %

connstr =

"DBQ="+server.mappath("database/source.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver

(*.mdb)};DriverId=25;FIL=MSAccess;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;

PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" %>

在指定了想要连接的数据库后,就可以通过以下方法连接并打开数据库 :

< %

Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open constr %>

第二步 : 指定想要执行的 SQL 指令,可以使用 RecordSet。

当连接了数据库后就可以对数据库进行操作,比如查询、删除、更新等等,这些操作都是通过 SQL 指令来完成的,如下例在数据库表 datebase 中查询所有姓名中有“A”的记录 :

< %

sql="select * from datebase where name like 'A%%'"

Set rs = Conn.Execute(sql)

%>

尽管 Connection 对象简化了连接数据库和查询任务,但 Connection 对象仍有许多不足。确切地说,检索和显示数据库信息的 Connection 对象不能用于创建脚本,您必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。对于检索数据、检查结果、更改数据库, ADO 提供了

Recordset 对象。正如它的名称所暗示的那样, Recordset 对象有许多您可第 69 页 共 90 页 第69页

三 : ASP完整教程(完全ASP编程)

Active Server Pages教程

二零零零年二月二日

asp教程 ASP完整教程(完全ASP编程)

目 录

第一章 引言…………………………………………………………………….3

第二章 简介……………………………………………………………….……8

第三章 ASP基础………………………………………………………………13

第四章 脚本基础………………………………………………………………19

第五章 脚本变量、函数、过程和条件语句…………………………………22

第六章 脚本循环语句…………………………………………………………27

第七章 内建Request对象…………………………………………….………30

第八章 内建Reponse对象……………………………………………………36

第九章 内建对象Application 和 Session……………………………………42

第十章 Global.asa文件的使用及Chat程序…………………………………48 第十一章 内建对象Server……………………………………………………53 第十二章 数据库查询语言(1) ……………………………………..…………57 第十三章 数据库查询语言(2) …………………………………………..……62 第十四章 ActiveX组件………………………………………………..………66 第十五章 常用的ASP ActiveX组件……………………………………….…70 第十六章 其它的ASP常用组件…………………………………………...…75 第十七章 ADO存取数据库时如何分页显示……………………………...…81 第十八章 堵住ASP漏洞…………………………………………………...…87

第十九章 最新的ASP、IIS安全漏洞………………………………………..91

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

第一章 引言

您的网站是否仍一如既往地保持“静态”?目前呈几何增长的互联网网站中,有相当一部分仍固守“静态”,无形中已大大落后于时代的步伐。(www.61k.com]所谓“静态”指的就是网站的网页内容“固定不变”,当用户浏览器通过互联网的HTTP(Hypertext Transport Pr otocol)协议向WEB服务器请求提供网页内容时,服务器仅仅是将原已设计好的静态HTML文档传送给用户浏览器。其页面的内容使用的仅仅是标准的HTML代码,最多再加上流行的GIF89A格式的动态图片,比如产生几只小狗小猫跑来跑去的动画效果。若网站维护者要更新网页的内容,就必须手动地来更新其所有的HTML文档。

“静态”网站的致命弱点就是不易维护,为了不断更新网页内容,你必须不断地重复制作HTML文档,随着网站内容和信息量的日益扩增,你就会感到工作量大得出乎想象。

你不禁要问:那么什么是动态网站呢?这就是本文将重点讲述的核心,所谓“动态”,并不是指那几个放在网页上的GIF动态图片,在这里笔者为动态页面的概念制定了以下几条规则:

1、“交互性”即网页会根据用户的要求和选择而动态改变和响应,将浏览器作为客户端界面,这将是今后WEB发展的大事所趋。

2、“自动更新”即无须手动地更新HTML文档,便会自动生成新的页面,可以大大节省工作量。

3、“因时因人而变”,即当不同的时间、不同的人访问同一网址时会产生不同的页面,是不是很酷?

现在你已经对“动态”网站有了一个基本的概念,接下来应挑选称手的“兵刃”了。将网站“动态”化的方法很多,这要看你是出于何种需求。如果你是个人网站的维护者,使用的是免费主页空间,那么绝大多数情况下你只能使用Java、Java Script和最新的DHTML技术,如果你的主页空间提供者能给予你CGI权限或ASP支持,那么你将能非常幸运地发挥真正的动态技术。关于CGI和ASP技术将在后面的着重讨论,这里针对个人网站仅就最新的DHTML技术进行重点介绍。 究竟什么是DHTML?它与传统的HTML有什么不同?DHTML就是当网页从WEB服务器下载后无须再经过服务器的处理,而在浏览器中直接动态地更新网页的内容、排版样式、动画。

比如,当鼠标移至文章段落中,段落能够变成蓝色,或者当你点击一个超链后会自动生成一个下拉式的子超链目录。这就是Dynamic HTML(动态HTML),它是近年来网络飞速发展进程中最振奋人心也是最具实用性的创第 3 页 共 90 页 第3页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

新之一。(www.61k.com]它是一种通过各种技术的综合发展而得以实现的概念,这些技术包括Java Script , VB0Script, Document Object Model (文件目标模块),Layers和Cascading Style Sheets ( CSS样式表)等。非常遗憾的是在网景Netscape和微软IE浏览器几番大战后,我们仍没有得到一个对DHTML支持的统一标准。因此本文在介绍DHTML时不得不分别讲述。 让我们先来看看Microsoft IE 4对DHTML的支持:

1 .动态内容(Dynamic Content):动态地更新网页的内容,可"动态"地随时插入、修改、或删除网页的元件,譬如文字、标记等。

2 .动态排版样式(Dynamic Styles Sheets):通过W3C的“Cascading Style Sheets”(串联式排版样式,简称CSS1或CSS),提供了设定HTML标记的字体大小、字型、粗细、字型样式、行高度、文字颜色、加底线或加中间横线、与边缘距离、靠左右或置中、缩排、背景图片或颜色等排版功能。而“动态排版样式”,可以“动态”地随时地改变排版样式。

3 .动态定位(Dynamic Positioning):通过W 3 C的“Working Draft on Positioning HTML with Cascading Style Sheets”,提供HTML元件在X、Y、Z轴的定位功能,让设计者可以放置影像、控件、文字等在网页上的任何位置上。而放置在不同的Z轴上,设计者就可以产生重叠的效果。

4 .内建资料处理(Data Awareness):无须复杂的程序,无须花费服务器太多资源,即可让网页设计者即时处理文档。

5 .内建多媒体支援:IE 4.0结合CSS与内建的ActiveX Controls,提供多媒体支持的功能,包括转换特效、滤镜特效、路径控制、顺序控制、动画、制图、播放声音和影像等多媒体功能。

让我们再来看看Netscape Communicator 4.0对DHTML所提供的支持: 1 .动态排版样式(Dynamic Styles Sheets):支援W 3 C的“Cascading Style Sheets”(串联式排版样式,简称CSS1或CSS)、和自创的“Java Script Style Sheets”。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

2 .Dynamic Layers:提供图文定位、改变图文重叠顺序、控制隐藏或显示图文、移动图文的功能,让您设计出“动画”的效果!

3 .Dynamic Fonts:提供由服务器下载字型的功能。

可见虽然IE 4.0和Netscape Communicator 4.0都提供了“Dynamic

HTML”的支持,但是事实上两者除了对“Cascading Style Sheets”的规格相近外,其余都相差甚远。因此当你设计DHTML页面时必须充分考虑到兼容性的问题,选择称手的“兵刃”和方法对于设计者来说始终是最重要的。有关DHTML的使用方法和设计技巧作者将在第二章《动态网页设计十八般武艺》中仔细讲解,请密切关注。

或许对于一个个人网站来说充分运用DHTML技术足以令网页栩栩如生,动感十足。然而对于建立商业网站的企业而言,仅仅拥有DHTML是远远不够的。因为仅仅发生在客户浏览器端的动态效果是无法满足商业网站大第 4 页 共 90 页 第4页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

量信息查询,客户咨询,资源交互等“动态”需求的。(www.61k.com)因此作为商业网站的设计者,必须要设计出更具实用性和交互性的“动态”网站。由于绝大多数商业网站都具有大量的数据和信息,而建网的初衷也就是在于方便客户查询企业资料,方便同客户的交流,及时获得信息反馈。那么,就必然会面临如何让使用者在浏览器界面中,通过互联网或内联网(Intranet)查询WEB数据库的资料,甚至输入、更新和删除WEB服务器上的资料。下面笔者就简单介绍几种常用的“动态”网站设计方法:

1、 CGI(Common Gateway Interface)

通用网关接口的传统方式,当用户在浏览器端填好表单(form)要求输入的资料,提出HTTP请求后,WEB服务器端将执行一个表单所设定的可执行的CGI应用程序,CGI程序分析表单(form)中所输入的资料,存取WEB数据库,将查询执行的结果以HTML的格式返回给浏览器。使用CGI方式存取WEB数据库,有很多的缺点,譬如不易开发、变更修改成本高、功能有限、不易侦错、执行速度慢等,而且由于并非整合于HTML文档之中,因此必须使用与HTML完全不同的设计过程来设计一个可执行的应用程序。

2、 IDC(Internet Database Connector)

互联网数据库连接头是Windows NT Server内含Internet Information Server(简称IIS)2.0的特征之一,它提供了一种使你的互联网数据库内容得以发布并可与用户交互的方法,它实际上是一个包含于IIS中的I S A P I应用程序。你只需掌握HTML和SQL的基本知识并写为数不多的代码就能编出具有交互能力的数据库应用程序,让使用者在浏览器界面中得以查询、输入、更新、和删除WEB服务器上的数据资料。正如VB程序员所喜欢的那样,构成IDC应用程序的文件是解释性的,由于设计简易,只要准备两个档案,即可在用户端的浏览器中存取WEB服务器的数据资料,且无须编译,因此具有快速的开发循环和反馈。但这种简单性的代价是牺牲了许多灵活性,使你不得不放弃许多对用户接口的控制,并几乎放弃了所有验证数据的能力。因而I D C仅适用于简单的WEB应用程序。

3、 ActiveX Data Object(ADO)是WEB数据库应用的最佳选择。

ActiveX Data Object(简称ADO)究竟是什么呢?ActiveX Data Object的技术,让您可以与Active Server Pages(简称ASP)结合以建立提供数据资讯的网页内容,只需在网页面中执行Structured Query Language(结构化查询语言,简称SQL)指令,让用户在浏览器界面中输入、更新、和删除WEB服务器上的数据资料。当用户端的浏览器填好表单所要求输入的资料并按下“Submit”按钮后,经过互联网、内联网传送HTTP请求到WEB服务器,该请求在WEB服务器执行一个表单所指定的Active Server Pages程序(后缀名为. ASP的文档)。一个. ASP文档是一个纯文字档,包括:HTML标记(tags)、VBScript或JScript语言的程序代码、ASP语法、和结构化查第 5 页 共 90 页 第5页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

询语言SQL指令。(www.61k.com)IIS3.0 / 4.0 WEB服务器执行. ASP文档,通过ODBC驱动程式,连接到支持ODBC的数据库上,执行ASP文档所指定的SQL指令,最后将执行的结果以HTML的格式传送给用户浏览器。ADO具有容易使用、开发执行快速、消耗系统资源较少,和占用磁盘空间小等优点。

以上就是目前设计商业网站常用的“动态”技术,由于本人的工作和使用经验,笔者较倾向于ADO和ASP的结合,从长远来看这对搭档也势必成为今后一段时间内“动态”WEB的核心技术。因此在本文第二章《动态网页设计十八般武艺》中,笔者将就ADO和ASP的使用进行展开讲述,敬请期待。

第二章 简介

看了《引言》后,你是否已经急不可待地想构建属于你自己的动态网站?本文将以 Active Server Pages 为中心,向你全面展示制作动态商业网站的步骤和技巧。

上一章给大家简要介绍了建立动态网站的一些方法和制作工具,本章将以如何建立基于 IIS 的 ASP 动态网站为中心向大家一步一步地揭示动态商业网站设计的真正奥秘。为了使各位能够全面、细致地掌握 ASP 的开发技巧,本文今后将采取连载的形式,手把手地教你如何建立属于自己 ASP 动态网站。由于本文是作者根据自己的学习和实践经验并结合了一些外文资料而写成的,因此不免会有一些偏颇,希望各位见谅。如发现本文有何不当之处,请及时通知作者,谢谢。

Microsoft Active Server Pages 即我们所称的 ASP ,其实是一套微软开发的服务器端脚本环境, ASP 内含于 IIS 3.0 和 4.0 之中 , 通过 ASP 我们可以结合 HTML 网页、 ASP 指令和 ActiveX 元件建立动态、交互且高效的 WEB 服务器应用程序。有了 ASP 你就不必担心客户的浏览器是否能运行你所编写的代码,因为所有的程序都将在服务器端执行,包括所有嵌在普通 HTML 中的脚本程序。当程序执行完毕后,服务器仅将执行的结果返回给客户浏览器,这样也就减轻了客户端浏览器的负担,大大提高了交互的速度。 以下罗列了 Active Server Pages 所独具的一些特点:

1. 使用 VBScript、JScript等简单易懂的脚本语言,结合HTML代码,即可快速地完成网站的应用程序。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

2. 无须编译,容易编写,可在服务器端直接执行。

3. 使用普通的文本编辑器,如 Windows 的记事本,即可进行编辑设计。

4. 与浏览器无关 (Browser Independence), 用户端只要使用可执行

第 6 页 共 90 页 第6页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

HTML 码的浏览器,即可浏览 Active Server Pages 所设计的网页内容。[www.61k.com] Active Server Pages 所使用的脚本语言 (VBScript 、 Jscript) 均在 WEB 服务器端执行,用户端的浏览器不需要能够执行这些脚本语言。

5.Active Server Pages 能与任何 ActiveX scripting 语言相容。除了可使用 VBScript 或 JScript 语言来设计外,还通过 plug-in 的方式,使用由第三方所提供的其他脚本语言,譬如 REXX 、 Perl 、 Tcl 等。脚本引擎是处理脚本程序的 COM(Component Object Model) 物件。

6.Active Server Pages 的源程序,不会被传到客户浏览器,因而可以避免所写的源程序被他人剽窃,也提高了程序的安全性。

7. 可使用服务器端的脚本来产生客户端的脚本。

8. 物件导向( Object-oriented )。

9.ActiveX Server Components(ActiveX 服务器元件 ) 具有无限可扩充性。可以使用 Visual Basic 、 Java 、 Visual C++ 、 COBOL 等编程语言来编写你所需要的 ActiveX Server Component 。

ASP 的奇妙之处真是不胜枚举,下面就请各位系好安全带,我将带领大家进入 ASP 的梦幻世界。

首先,让我们来看看运行 ASP 所需的环境:

Microsoft Internet Information Server version 3.0/4.0 on Windows NT

Server

Microsoft Peer Web Services Version 3.0 on Windows NT Workstation Microsoft Personal Web Server on Windows 95/98

正如前文所述,与一般的程序不同, .asp 程序无须编译, ASP 程序的控制部份,是使用 VBScript 、 JScript 等脚本语言来设计的,当执行 ASP 程序时,脚本程序将一整套命令发送给脚本解释器 ( 即脚本引擎 ) ,由脚本解释器进行翻译并将其转换成服务器所能执行的命令。当然,同其他编程语言一样, ASP 程序的编写也遵循一定的规则,如果你想使用你所喜爱的脚本语言编写 ASP 程序,那么你的服务器上必须要有能解释这种脚本语言的脚本解释器。当你安装 ASP 时,系统提供了两种脚本语言: VBsrcipt 和 JScript ,而 VBscript 则被作为系统默认的脚本语言。你也可以根据自己的喜好改变系统默认的脚本语言,关于如何改变系统默认的脚本语言请看《 在 ASP 中使用脚本语言》一文。

ASP 本身并不是一种脚本语言,它只是提供了一种使镶嵌在 HTML 页面中的脚本程序得以运行的环境。但是,要学好 ASP 又必须掌握它的语法和规则。现在就让我们开始一步一步地认识并学习 Active Server Pages 。

ASP 程序其实是以扩展名为 .asp 的纯文本形式存在于 WEB 服务器上的,你可以用任何文本编辑器打开它, ASP 程序中可以包含纯文本、 HTML 标记以及脚本命令。你只需将 .asp 程序放在 WEB 服务器的虚拟目录下(该目录必须要有可执行权限),就可以通过 WWW 的方式访问 第 7 页 共 90 页 第7页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

ASP 程序了。[www.61k.com]要学好 ASP 程序的设计,必须掌握脚本的编写,那么究竟什么是脚本呢?其实脚本是由一系列的脚本命令所组成的,如同一般的程序,脚本可以将一个值赋给一个变量,可以命令 WEB 服务器发送一个值到客户浏览器,还可以将一系列命令定义成一个过程。要编写脚本,你必须要熟悉至少一门脚本语言,如 VBScript 。脚本语言是一种介乎于HTML和诸如 JAVA 、Visual Basic 、C++ 等编程语言之间的一种特殊的语言,尽管它更接近后者,但它却不具有编程语言复杂、严谨的语法和规则。如前所述 ASP 所提供的脚本运行环境可支持多种脚本语言,譬如:JScript 、

REXX 、PERL 等等,这无疑给 ASP 程序设计者提供了广泛的发挥余地。 ASP 的出现使得广大 WEB 设计者不必在为客户浏览器是否支持而担心,实际上就算你 在同一个 .asp 文件中使用不同的脚本语言,你都无须为此担忧,因为所有的一切都将在服务器端进行,客户浏览器得到的只是一个程序执行的结果,而你也只需在 .asp 中声明使用不同的脚本语言即可。下面是一个典型的在同一 .asp 文件中使用两种脚本语言的例子:

< HTML>

< BODY>

< TABLE>

< % Call Callme %>

< /TABLE>

< % Call ViewDate %>

< /BODY>

< /HTML>

< SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Callme

Response.Write "< TR>< TD>Call< /TD>< TD>Me< /TD>< /TR>" End Sub

< /SCRIPT>

< SCRIPT LANGUAGE=JScript RUNAT=Server>

function ViewDate()

{

var x

x = new Date()

Response.Write(x.toString())

}

< /SCRIPT>

这是各位在本文中接触的第一个真正的 ASP 程序,千万不要被“ < % %> ”符号搞糊涂,这其实是标准的 ASP 定界符,而“ < SCRIPT><

/SCRIPT> ”之间的就是脚本语言。 ASP 不同于脚本语言,它有自己特定的第 8 页 共 90 页 第8页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

语法,所有的 ASP 命令都必须包含在 < % 和 %> 之内,如: < %

test="English" %> ,ASP 通过包含在 < % 和 %> 中的表达式将执行结果输出到客户浏览器 , 如: < % =test %> 就是将前面赋给变量 test 的值 English 发送到客户浏览器中,而当变量 test 的值为 Mathematics 时 , 以下程序:

This weekend we will test < % =test %>.

在客户浏览器中则显示为:

This weekend we will test Mathematics.

学习 ASP 最好的方法莫过于亲自动手编写,为了在最短的时间内使各位掌握 ASP 的程序设计技巧,本文将采取实例分析法,通过一系列的实例让各位在实践中学习 ASP 。[www.61k.com]建立一个 ASP 页面,你所需的只是打开一个文本编辑器,如: Notepad ,然后跟我开始动手编写第一个 ASP 程序。下面我们将建立一个自动监测浏览时间并根据不同时段动态显示不同页面内容的 ASP 程序,请将以下代码剪贴到你的文本编辑器中 , 并存为 test1.asp :

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

< html>

< body>

< FONT COLOR="Green">

< % If Time < #12:00:00# And Time >= #00:00:00# Then %>

早上好,今天天气不赖啊 !

< % ElseIf Time < #19:00:00# And Time >= #12:00:00# Then %> 下午好 !

< % Else %>

哈喽 ! 今晚你有没有去 IRC 聊天 !

< % End If %>

< /body>

< /html>

将 test1.asp 保存在 WEB 服务器的虚拟目录 ( 如: aspsamp/) 下,并在浏览器中用 HTTP 的方式进行浏览,如:

http://yourcomputername/aspsamp/test1.asp,你将会新奇地发现,你的页面真的活起来了。虽然,这只是一个非常简单的实例,而且这一功能完全可以通过 JavaScript 完成,但是不难发现使用 ASP 要比 JavaScript 简洁、迅速得多,而且运用此法,你完全可以轻而易举地令你的网页在不同的时段展示不同的风格。此例中的“ Time ”实际上是一个 VBScript 内置的显示系统当前时间的函数,由于系统默认的脚本语言是 VBScript ,因此当你在 ASP 命令中调用该函数时,脚本引擎会自动将其转换成当前的系统时间。接下来我们将给 test1.asp 添加一点色彩,在 < body> 标识中添加“bgcolor="< % =bgc %> ”即变为 < body bgcolor="< % =bgc %>"> ,并在 < body> 标记第 9 页 共 90 页 第9页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

前添加如下语句:

< % If Time < #12:00:00# And Time >= #00:00:00# Then

bgc="silver"

ElseIf Time < #19:00:00# And Time >= #12:00:00# Then

bgc="navy"

Else

bgc="red"

End If

%>

如此一来,当用户在不同的时段访问你的页面时,他们将会看到不同的页面背景色。(www.61k.com]我们可以做的事情还有很多,譬如你想知道在凌晨至十二点之间浏览你页面的客户的姓名,并向他或她问好,那么下面的这段程序将能助你达成心愿。首先你需要在页面中设置表单,将以下 HTML 代码剪贴到“< % If Time < #12:00:00# And Time >= #00:00:00# Then %> ”之后:

欢迎光临我的主页,请填写以下信息 :

< FORM METHOD="POST" ACTION="test1.asp">

< P>

First Name: < INPUT NAME="fname" SIZE="48">

< P>

Last Name: < INPUT NAME="lname" SIZE="48">

< P>

Title: < INPUT NAME="title" TYPE=RADIO VALUE="mr">Mr.

< INPUT NAME="title" TYPE=RADIO VALUE="ms">Ms.

< P>< INPUT TYPE=SUBMIT>< INPUT TYPE=RESET>

< /FORM>

然后在以上 HTML 代码后面添加如下 ASP 命令:

< %

title=request.form("title")

if title="mr" then

%>

欢迎您 Mr.< % =request.form("fname") %> 。

< % elseif title="ms" then %>

欢迎您 Ms.< % =request.form("fname") %> 。

< % else %>

< B>< font color=blue> 欢迎您 < % =request.form("fname")&" "&request.form("lname") %> 。 < /font>< /B>

< % end if %>

保存文件 test1.asp ,并在浏览器中以 HTTP 方式进行浏览,如果此时第 10 页 共 90 页 第10页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

的系统时间在凌晨 0:00:00 和中午 12:00:00 之间的话,浏览器将显示如下画面:

这其实是一个在 Internet 和 Intranet 上常见的功能,即当用户在浏览器端填写完表单后,通过调用一个通用网关程序将用户数据传送到服务器,由服务器进行处理后再将结果返还给客户浏览器。(www.61k.com]过去为了实现这样的功能必须编写一个独立于 HTML 之外的 CGI 程序,并通过 HTML 进行调用,撇开 CGI 编写复杂等缺点不谈, CGI 的执行效率也是一个大问题,每一个表单 (form) 均须执行一个可执行文档,当多人同时上线使用时,多个文档同时执行,将大大降低 WEB 服务器的执行速度,如今 ASP 提供了与 HTML 完全相融的编程环境,显然要比使用 CGI 便捷得多。

在本期的最后让我们再来看看 ASP 的循环功能,譬如你希望当客户在晚间 7:00 至凌晨 0:00:00 浏览你的页面时,在页面中央显示 6 个笑脸 表示问候,那么你只需要将以下命令剪贴到“ Good Evening! ”后面即可: < % for i=1 to 6 %>

< p>< center>< img src="smile.gif" width="32" height="32" alt=" 晚上好 ">< /p>

< % next %>

这是一个最最基本的循环语句,它将一个笑脸图片重复调用六次并显示在页面上。当然此例的效果完全可以用 HTML 做到,但是不难发现使用 ASP 大大缩短了代码的重复编写,使得程序具有良好的可阅读性。另外,当你制作一个诸如根据用户投票来给所评测的对象评定星级的评测站点时,使用此法,你就完全不需要为每一个星级制作一幅图片。如果一个对象被评为 4 星级,那只需将一颗星的图片循环显示 4 次,以此类推即可。当然,当工作量较小的时候你不会感觉到 ASP 的好处,然而一旦数据量巨增,你将会深刻的体会到 ASP 动态网站给你带来的前所未有的感受 !

第三章 ASP基础

本文 ASP 篇 (1) 展示了 ASP 动态网站设计的一些最基本的方法,相信通过实践各位对 ASP 已经有了最基本的了解,本篇在答复大家所提问题的同时,将进一步介绍 ASP 动态网站的一些基本技巧。

自本文第一篇刊登后 , 络绎不绝地收到了一些朋友的来信,出乎作者的意料,其中有相当一部分是初次接触ASP,因此有许多朋友都提出为何在浏览器中浏览 ASP 篇(1)中的范例时看到的竟然是原代码?由于遇到此问题的朋友较多,故作者在此一并回答。首先,我要再次强调 ASP 是一套服务器端的脚本环境,当用户从浏览器向Web服务器请求.asp文件时, ASP第 11 页 共 90 页 第11页

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

脚本开始运行,然后 Web 服务器调用ASP ,ASP全面读取请求的文件,执行所有脚本命令,并将 Web 页传送给浏览器,这就意味着你不能简单地在现有的操作系统(如 Win95、98)下,用浏览器中的 " 打开 " 命令来浏览 .asp 文件;其次,运行 .asp 文件需要服务器端的支持,目前除了WindowsNT下的 Microsoft Internet Information Server支持 Active Server 技术外,Active Server还可用于 MS Windows NT Workstation 和 MS

Windows95/98 中的 Personal Web Server 的构件,因此无论你安装的是 NT 还是 WIN95/98,都必须在原系统上安装支持ASP的服务器端环境,才能使你的机器得以运行 .asp 文件。[www.61k.com]由于目前绝大多数朋友安装的是 Win95 或是 98 ,因此作者就在这里着重介绍如何在 Win95/98 下运行和浏览 .asp 文件。因为 MSPersonal Web Server 支持通用网关接口 (CGI) 应用程序、Internet 数据库接口 (IDC) 应用程序和 IIS 应用程序接口 (ISAPI) 应用程序,并且支持运行和开发 ASP 应用程序,所以使得 Win95 及其以后操作平台具备了近似于 NT 的健全的网站运作和管理功能。你所要做的只是在现有的 Win95/98 系统上安装 MS Personal Web Server ,建议安装最新的 4.0 版本。当安装完成后, PWS4.0 会在系统启动时自动加载。打开 PWS ,选择左栏中的 " 高级 " 按钮 ( 见下图 Asp2a.gif) ,点取 " 虚拟目录 " 下的 "/_private" 目录,然后点击右边的 " 编辑属性 " 按钮,如图所示,在对话框中你可以编辑该虚拟目录的物理路径和目录名,上图中"/_private"的物理路径为 "D:\Inetpub\wwwroot" ,该目录是系统默认的WWW发布根目录,将上一篇中的范例test1.asp文件复制到 "D:\Inetpub\wwwroot" 目录下。最后,你只要将该虚拟目录的访问权限选择为 "执行" ,并在浏览器的 "地址" 栏中输入 "http://localhost/test1.asp " 就可以运行并浏览该 ASP 程序了。

知道了如何运行并浏览 ASP 程序,下面我们就继续 ASP 动态网站设计的学习。

上一篇给大家介绍了几个最基本的 ASP 程序,相信大家已经对 ASP 的应用有了大致的了解,本篇将继续介绍一些用 ASP 编写的 WEB 动态功能。由于 WEB 浏览器标准的不一致从而使得如何能够让自己制作的网站去适应各种不同的浏览器成为了广大网站设计者最为头疼的事,在如今的形势之下,我们不肯也不可能去抛弃 Netscape 或 IE 中的任何一种客户群,但我们有时候又不得不去考虑客户端浏览器的实际浏览效果,过去我们常用 JavaScript 编写一段程序来辨别客户端使用的不同的浏览器,那么今天就让我们来看看如何使用 ASP 更为便捷且精确地达到这一目的。将以下代码,剪贴到你的 Notebook 中,并保存为 browser.asp 。

< %@ LANGUAGE = VBScript %>

< HTML>

< HEAD>

第 12 页 共 90 页 第12页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< TITLE>用ASP提供的浏览器性能组件来辨别客户浏览器< /TITLE> < /HEAD>

< BODY BGCOLOR="White" topmargin="10" leftmargin="10"> < font size="4" face="Arial, Helvetica">

< b>用ASP提供的浏览器性能组件来辨< br>别客户浏览器< /b>< /font>< br>

< hr size="1" color="#000000">

< !-- 定义并创建浏览器性能对象 -->

< %

Dim bc

Set bc = Server.CreateObject("MSWC.BrowserType") %>

< !-- 在表格中描述客户浏览器的信息 -->

< Table border=1>

< tr>

< td>Browser Name< /td>

< td> < %=bc.Browser %> < /Td>

< tr>

< td>Browser Version< /td>

< td> < %=bc.Version %> < /Td>

< tr>

< td>Major Version< /td>

< td> < %=bc.Majorver %> < /Td>

< tr>

< td>Minor Version< /td>

< td> < %=bc.Minorver %> < /Td>

< tr>

< td>Frame Support< /td>

< td> < %=bc.Frames %> < /Td>

< tr>

< td>Table Support< /td>

< td> < %=bc.Tables %> < /Td>

< tr>

< td>Cookie Support< /td>

< td> < %=bc.Cookies %> < /Td>

< tr>

< td>Background Sound Support< /td>

< td> < %=bc.BackgroundSounds %> < /Td>

第 13 页 共 90 页 第13页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< tr>

< td>VBScript Support< /td>

< td> < %=bc.VBScript %> < /Td>

< tr>

< td>JavaScript Support< /td>

< td> < %=bc.JavaScript %> < /Td>

< /table>

< /BODY>

< /HTML>

用 http 方式浏览该文件,不同浏览器,你会看到类似下图 (Asp2b.gif) 的页面。(www.61k.com)在本例中我们用到了一个ASP提供的 ActiveX 组件 --"Browser Capabilities"。ActiveX 组件作为基于 Web 的应用程序部分在 Web 服务器上运行,组件提供了应用程序的主要功能 ( 如访问、修改数据库等 ) ,这样 WEB 设计者们就不必创建或重新创建执行这些任务的代码,从而提高了工作的效率,有关 ActiveX 组件将在今后详细讨论。为了使用 ASP 辨别客户浏览器,在这里我们利用 "Browser Capabilities" 组件创建了一个 Browser Type 对象,该对象提供带有客户端网络浏览器功能说明的用户脚本,当浏览器连接到网络服务器上时,它会自动发送一个 UserAgentHTTP 标题,该标题是一个声明浏览器及其版本的 ASCII 字符串。此 Browser Type 对象将该标题和在 Browscap.ini 文件中的项进行比较 (Win98 、IIS3 、IIS4 的用户分别可以在以下目录中"win98\system\inersrv"、"\winnt\system32\inetsrv\asp\cmpnts"、"\winnt\system32\inetsrv"找到该文件) 。如果找到匹配的项,则该 Browser Type 对象将认为浏览器列表属性与 UserAgent 标题匹配。若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN" 。我们可以通过更新 browscap.ini 文件将属性或新的浏览器定义添加到该组件中,从而扩大 ASP 识别的浏览器范围和精确度。下面列出了 browscap.ini 中的一部分内容 ( 不包括注释部分 ) :

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

[IE 4.0] ;;HTTPUserAgentHeader

browser=IE ;;指定该浏览器的名称。

Version=4.0 ;;指定该浏览器的版本号。

majorver=4 ;;指定主版本号

minorver=0 ;;指定副版本号

frames=TRUE ;;指定该浏览器是否支持框架。

tables=TRUE ;;指定该浏览器是否支持表格。

cookies=TRUE ;;指定该浏览器是否支持cookies。

backgroundsounds=TRUE ;;指定该浏览器是否支持背景音乐。

第 14 页 共 90 页 第14页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

vbscript=TRUE ;;指定该浏览器是否支持VBScript。[www.61k.com]

javascript=TRUE ;;指定该浏览器是否支持JScript。

javaapplets=TRUE ;;指定该浏览器是否 支持 Java程序。

ActiveXControls=TRUE ;;指定该浏览器是否支持 ActiveX 控件。 Win16=False ;; 指定该浏览器是否支持Win16

beta=False ;;指定该浏览器是否测试版。

cdf=True ;;指定该浏览器是否 支持用于 Web 预测的 Channel Definition Format。

;;ie 4.01

[Mozilla/4.0 (compatible; MSIE 4.01*; Windows 95)]

parent=IE 4.0 ;;父标签允许第二个浏览器继承第一个浏览器的定义 version=4.01

minorver=01

platform=Win98

;;Default Browser ;;指定默认的浏览器的设置

[Default Browser Capability Settings]

browser=Default

frames=FALSE

tables=TRUE

cookies=FALSE

backgroundsounds=FALSE

vbscript=FALSE

javascript=FALSE

在上面的例子中,父标签允许第二个浏览器继承第一个浏览器的定义,以便 Microsoft Internet Explorer4.01 定义得以继承 Microsoft Internet Explorer4.0 定义全部的属性 (例如,frames=TRUE 、tables=TRUE以及 cookies=TRUE) 。并通过添加 platform=Win98 行来指定平台,用 version=4.01 重写版本信息。

在先前的 browser.asp 中我们仅仅是将客户浏览器的属性一一罗列了出来,下面让我们添加一些动态的效果。将以下代码剪贴到文件 browser.asp 中( 编辑注 :为显示方便,所有“ < ”符号后都多加了个空格,实际使用时请注意去掉。 ):

< % if (bc.frames = TRUE) then %>

你的浏览器支持框架!< br>

< % else %>

难道现在你还在使用不支持框架的浏览器???< br>

< % end if %>

< % if (bc.tables = TRUE) then %>

第 15 页 共 90 页 第15页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

你的浏览器支持表格。[www.61k.com]< br>

< % else %>

难道现在你还在使用不支持表格 的浏览器 ???< br>

< % end if %>

< % if (bc.BackgroundSounds = TRUE) then %>

有没有听到美妙的 音乐???< br>

< % else %>

可惜 , 您的浏览器不支持背 景音乐。< br>

< % end if %>

< % if (bc.vbscript = TRUE) then %>

您的浏览器支持Vbscript。< br>

< % else %>

您的浏览器不支持Vbscript。< br>

< % end if %>

< % if (bc.javascript = TRUE) then %>

您的浏览器支持 Javascript。< br>

< % else %>

您的浏览器不支持 Javascript。< br>

< % end if %>

在你的浏览器中刷新 browser.asp ,程序将自动辨别浏览器的属性并动态显示不同的信息。不难发现在整个 browser.asp 文件中几乎没有用到任何复杂的编程,就轻而易举的达到了动态鉴别客户浏览器并动态产生响应事件的效果。事实上,这个程序的关键就在于前文提到的 ActiveX 组件

--"Browser Capabilities" ,它的作用类似于一个 Function ,只需简单地在程序中调用该组件即能达到你所希望的效果。

通过这两篇对 ASP 的介绍,大家已经看到编写 ASP 程序是相当轻松的,要掌握 ASP ,无非就是掌握 ASP 内置的五个对象,以及 ASP 提供的 ActiveX 组件的对象、方法和属性,当然扎实的脚本语言编写能力也是必须的。在今后的课程中作者将用五到六篇的篇幅着重介绍这些内置对象和组件的作用及使用方法,敬请关注。

第四章 脚本基础

通过前两篇的学习,相信各位已经对 ASP 的动态网站设计有了一个基本的概念和整体的印象。从本篇开始作者将从脚本语言的使用着手,由浅入深地带领大家探索 ASP 动态网站设计的真正奥秘。

第 16 页 共 90 页 第16页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

本文第二篇刊登后,很多朋友给我发了“妹儿”,希望能尽快看到本文的第三、第四、乃至第??篇,甚至有位朋友焦急地要我将 ASP 篇的全文发给他。[www.61k.com)看到有如此之多志同道合的朋友,令我精神大振。虽然 ASP 早在两年前就已经推出了,但直到今年它才以其灵活便捷的开发过程、良好的 WEB 数据库连接功能受到了国人的重视,然而由于目前国内尚缺乏关于 ASP 开发 WEB 应用程序的详尽教材,因此使得国内广大 WEB 开发者们仍处在闭门啃 E 文的阶段,也包括作者本人。也正因为如此,作者才蒙发了写文章的念头,在得到 Chinabyte 网络学院翁斌先生的大力支持后,各位才得以见到此文。

作者殷切希望能通过此文为广大 WEB 开发者和爱好者提供便利,使大家共同来参加 ASP 的学习和交流,为了顾全不同层次读者的需求作者还是决定从最基本的脚本语言的编制着手,随后再一步一步地讲解 ASP 内建对象、ActiveX 组件以及用 ASP 开发 WEB 应用程序的实例,相信通过一段时间持续的学习,不出几个月各位都能够得心应手地开发自己的动态网站。下面就先请大家跟我来学习一些 ASP 中应用脚本语言(以 VBScript 为主)的基础知识。

在开始学习脚本语言之前,你应该理解一些简单的概念 -- 变量、进程。所谓变量是计算机内存中已命名的存储位置,其中包含了数字或字符串等数据,它使用户便于理解脚本操作的名称,为用户提供了一种存储、检索和操作数据的途径。程序是由一个或多个进程组成的,在 VBScript 中,进程就是“指令块”,通常意义上的进程,如 Sub,只是为了简单的数据处理。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

在 VBScript 中,严格的来讲变量是不用声明的,

如:< % Mystring="This is my string" % >

然而,即使在使用变量前不需要去声明变量,也应养成在编程时声明变量的良好习惯,因为这样有助于防止错误发生。声明一个变量意味着告诉脚本引擎,有一个特定名称的变量,这样就可以在脚本中引用该变量。在 VBScript 中声明一个变量可以使用“Dim”语句,如下:

< script language="VBScript" >

< !--

Option Explicit ' 要求在脚本中声明所有的变量

Dim Mystring

Mystring="This is my string"

-- >

< /script>

变量的作用域即生命期,决定哪些脚本命令可访问变量。在过程内部声明的变量具有局部作用域。每执行一次过程,变量就被创建然后消亡。而过程外部的任何命令都不能访问它。在过程外部声明的变量具有全局作用域,其值能被 ASP 页上的任何脚本命令访问和修改。声明变量时,局部变第 17 页 共 90 页 第17页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

量和全局变量可以有相同的名称。[www.61k.com]而改变其中一个的值并不会改变另一个的值。如果没有声明变量,则可能不小心会改变一个全局变量的值。例如,以下脚本命令返回值 1,虽然有两个名为 Y 变量:

< %

Dim YY = 1Call SetLocalVariableResponse.Write Y

Sub SetLocalVariable

Dim Y

Y = 2End Sub % >

由于变量没有显式声明,以下的脚本命令将返回 2。当过程调用将 Y 设置为 2 时,脚本引擎认为该过程是要修改全局变量:

<%

Y = 1Call SetLocalVariableResponse.Write Y

Sub SetLocalVariable

Y = 2

End Sub% >

然而,全局变量仅在单个 ASP 页中可用,要使它在单个 ASP 页之外可用,就必须为变量赋予会话或应用程序作用域。会话作用域变量对一个用户所请求的 ASP 应用程序中的所有页都是可用的。应用程序作用域变量也如此。对单个用户来说,会话变量是存储信息的最佳途径,例如,用户首选项、用户名或用户的标识。对于一个特殊应用程序的所有用户,应用程序作用域是存储信息的最佳途径,例如,应用程序特定的问候语或应用程序所需的初始值。ASP 提供两个内建对象来让您存储变量:Session 对象和 Application 对象,这将在今后的 ASP 内建对象中着重讨论。

让我们再来看看常量的定义,常量是用来代替一个数或字符串的名称,它在整个脚本中保持不变。您可以使用 Const 语句在 VBScript 中创建用户自定义常数。使用 Const 语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:。

如:< % Const mystring=" 这是一个常量 " % >

< % Const myage=100 % >

请注意字符串文字包含在两个引号 (" ") 之间。这是区分字符串型常数和数值型常数的最明显的方法。日期文字和时间文字包含在两个井号 (#) 之间。例如:

< % Const CutoffDate = #6-1-97# % >

在理解了常量和变量之后,我们来看看什么是过程。它是一组能执行指定任务且具有返回值的脚本命令。您可以定义自己的过程,然后在脚本中反复调用它们。您可以将过程定义放在调用过程的 .asp 文件中,也可以将通用过程放在一个共享的 .asp 文件中,然后用 SSI #include 指令将其包含进其他调用其过程的 .asp 文件中。您还可选择另一种方法,即把这些功能第 18 页 共 90 页 第18页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

打包在 ActiveX 组件中。[www.61k.com]过程定义可出现在 < SCRIPT > 和 < /SCRIPT > 标记内部且必须遵循声明脚本语言的规则。如果过程所用的语言与主脚本语言不同,则要使用 < SCRIPT > 元素。主脚本语言中的过程用脚本分界符 (< % 和 % >) 分隔。用 HTML< SCRIPT > 标记时,必须使用两个属性来保证服务器端能够处理脚本。使用 < SCRIPT > 标记的语法如下:

< SCRIPT RUNAT=SERVER LANGUAGE=JSCRIPT >

procedure definition

< /SCRIPT >

这里的 RUNAT=SERVER 属性通知 Web 服务器在服务器上处理脚本。若不设置该属性,脚本将由客户端浏览器处理。LANGUAGE 属性决定此脚本块所用的脚本语言。您可以指定任何一种具有脚本引擎的语言。请使用 VBSCRIPT 指定 VBScript;用 JSCRIPT 指定 JScript。若不设置 LANGUAGE 属性,将用主脚本语言解释此脚本块。

在 VBScript 中,过程被分为两类:Sub 过程和 Function 过程。Sub 过程是包含在 Sub 和 End Sub 语句之间的一组 VBScript 语句,执行操作但不返回值。Sub 过程可以使用参数(由调用过程传递的常数、变量或表达式)。如果 Sub 过程无任何参数,则 Sub 语句必须包含空括号 ()。

Function 过程是包含在 Function 和 End Function 语句之间的一组 VBScript 语句。Function 过程与 Sub 过程类似,但是 Function 过程可以返回值。Function 过程可以使用参数(由调用过程传递的常数、变量或表达式)。如果 Function 过程无任何参数,则 Function 语句必须包含空括号 ()。Function 过程通过函数名返回一个值,这个值是在过程的语句中赋给函数名的。Function 返回值的数据类型总是 Variant。在下面的示例中 Sub 过程使用两个固有的(或内置的)VBScript 函数,即 MsgBox 和 InputBox,来提示用户输入信息。然后显示根据这些信息计算的结果。计算由使用 VBScript 创建的 Function 过程完成,Celsius 函数将华氏度换算为摄氏度。Sub 过程 ConvertTemp 调用此函数时,包含参数值的变量被传递给函数。换算结果返回到调用过程并显示在消息框中。

Sub ConvertTemp()

temp = InputBox(" 请输入华氏温度。", 1)

MsgBox " 温度为 " & Celsius(temp) & " 摄氏度。"

End Sub

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function

给过程传递数据的途径是使用参数。参数被作为要传递给过程的数据的占位符。参数名可以是任何有效的变量名。使用 Sub 语句或 Function 语句创建过程时,过程名之后必须紧跟括号。括号中包含所有参数,参数间用第 19 页 共 90 页 第19页

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

逗号分隔。(www.61k.com]例如,在下面的示例中,fDegrees 是传递给 Celsius 函数的值的占位符:

Function Celsius(fDegrees)

Celsius = (fDegrees - 32) * 5 / 9

End Function

要从过程获取数据,必须使用 Function 过程。请记住,Function 过程可以返回值;Sub 过程不返回值。

以上给大家简要介绍了 VBScript,由于篇幅的原因,作者不可能在此详尽介绍 VBScript 的所有知识。但是由于 ASP 本身并不是一种编程语言,因此在大家编写 ASP 应用程序的过程中,必须借助脚本语言来实现许多特殊的功能,所以灵活熟练地掌握脚本语言对一个使用 ASP 编写 WEB 应用程序的程序员来说是至关重要的。无论您是一个有丰富编程经验的高手还是一个初学者,只要您现在希望通过 ASP 编写 WEB 应用程序,作者极力建议您掌握至少一门脚本语言(如 VBScript)。在本篇的末尾作者将留一道课后作业给大家,希望各位能通过自学有关书籍并在实践中迅速掌握脚本语言。

第五章 脚本变量、函数、过程和条件语句

在上一期中作者向诸位简要介绍了 ASP 脚本语言之一 VBScript 的一些基本常识,本期将继续给大家讲解 VBScript 的脚本编写方法,并通过展示 VBScript 在 ASP 程序编写过程中的一系列实例使大家对 VBScript 有更进一层的理解。

大家在学习了脚本语言 VBScript 的变量、常量和过程的基本概念后,本期将继续向各位介绍 VBScript 的函数和语法。

函数和过程一样都是命名了的代码块,但它们却有很大的区别,过程完成程序任务,函数则返回值。我们可以这样理解,过程象一个完整的句子,而函数则象一个单词。举个例子,当你想获取某个数的平方根,你只要将该数传给 VBScript 的 Sqr() 函数,此函数会立即返回该数的平方根。如: A=sqr(9)

则 A=3。熟练掌握脚本语言的函数将给你编写 ASP 程序带来极大的方便,就以上一期结尾处作者布置给大家的课后练习来说,如果你对脚本语言的函数掌握不够全面,那么解决如此之小的一个问题将很有可能花费你相当大的精力。现在让我们来回顾一下这道课后练习。

“作者正在用 ASP 制作一套基于 WEB 的 BBS 系统,希望能在其中添加一项特殊功能,即当任何用户登陆该 BBS 后都能够查阅近七天来所有第 20 页 共 90 页 第20页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

新发布的信息。[www.61k.com]”

如果你不熟悉 VBScrip,就不会知道 VBScrip 本身提供了一个用来取得日期之间的差或和的函数 DateSerial,它的语法如下:

DateSerial(year, month, day)

如果你要指定一个日期,例如:1998 年 11 月 10 日,那么 DateSerial 函数中每个参数的取值范围都应该是可接受的,即日的取值应在 1 和 31 之间,月的取值应在 1 和 12 之间。但是,也可以使用表示某日之前或之后的年、月、日数目的数值表达式为每个参数指定相对日期。以下样例中使用了数值表达式代替绝对日期。在这里,DateSerial 函数返回 1998 年 11 月 10 日之前二十年 (1990-20) 零两个月 (11-2) 又一天 (10-1) 的日期:即 1978 年 9 月 9 日。程序如下:

Datep=DateSerial(1998-20, 11-2,10-1)

对于 year 参数,若取值范围是从 0 到 99,则被解释为 1900 到 1999 年。对于此范围之外的 year 参数,则使用四位数字表示年份(例如 1800 年)。当任何一个参数的取值超出可接受的范围时,则会适当地进位到下一个较大的时间单位。例如,如果指定了 35 天,则这个天数将被解释成一个月加上多出来的日数,多出来的日数取决于其年份和月份。但是如果参数值超出 -32,768 到 32,767 的范围,或者由三个参数指定(无论是直接还是通过表达式指定)的日期超出了可以接受的日期范围,就会发生错误。

当我们了解并掌握了函数 DateSerial 的使用方法后,再来看看作者布置的这道题目,一切就迎刃而解了。下面我将程序中的此部分代码公布如下:

itemp=DateSerial(Year(date), month(date), day(date)-7)

itemp=DateValue(itemp)

sql="Select * from message Where message.creatime Between #"&date& "# And #" & itemp & "# "

在这里我们又接触到了一组函数 Year,month,day,它们是用来得到一个日期的年、月、日。date 是常数,表示今天日期,而函数 DateValue 则是将字符串变量转化为日期格式的变量。在本段程序的第三行,我们第一次接触到了标准的 SQL 查询语句,这句语句是什么意思呢?

“Select”是标准的 SQL 数据库查询命令,通过 SELECT 语句我们可以在数据库中检索数据,并将查询结果提供给用户,此处的“*”表示查询该名为“message”的数据库中的所有记录,而“where”的作用是设定一个查询条件,是为了将数据库中符合条件的记录取出来,“message.creatime”是一个储存了数据库中记录创建日期的变量。将整句语句连起来理解就是:查询名为 message 的数据库中的所有记录,并将其中创建日期在今天和今天以前七日以内的所有记录存储在变量 sql 中。可能由于大家第一次接触 SQL 语句,一时间无法完全理解它的作用,不过不用担心在今后的章节中作者将专门用一期给大家介绍 SQL 的使用方法。

第 21 页 共 90 页 第21页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

通过上面的学习,大家应该已经能够理解函数在程序中的作用,当然我们不必去死背函数,但要做到熟练运用只有一条捷径 -- 多实践。[www.61k.com)接下来让我们来看看 VBScript 的基本语法。

了解编程语言的朋友一定知道在程序中控制程序流程的语句主要可以分为条件语句和循环语句,在 VBScript 中可使用以下条件语句: If...Then...Else 语句

Select Case 语句

If...Then...Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式,If...Then...Else 语句可以按照需要进行嵌套。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

让我们来创建两个范例文件:if1.asp 和 if2.asp

将以下语句剪贴到记事簿中,并保存为 if1.asp( 注意:请将程序中“<”后的空格去掉 )

< html>

< head>

< TITLE>if1.asp< /TITLE>

< /head>< body bgcolor="#FFFFFF">

< form action="if2.asp" method=get>

Your First Name< INPUT NAME="FirstName" MaxLength=20>< p> Your Last Name< INPUT NAME="LastName" MaxLength=20>< p> < INPUT TYPE=submit>< INPUT TYPE=reset>

< /form>

< /body>

< /html>

将以下语句剪贴到记事簿中,并保存为 if2.asp < html> < head>

< TITLE>ifrespond.asp< /TITLE>

< /head>

< % fname=request.querystring("Firstname")

lname=request.querystring("Lastname")

If fname="George" and lname="Washington" then %>

Hi.You must be the first president!

< % else %>

Hi!Nice to Meet You

< %end if %>

< /body>

< /html>

asp1.asp 产生一个文本输入框,要求用户输入姓、名,如下图: 第 22 页 共 90 页 第22页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

asp2.asp 则是用 IF 语句判断用户输入的姓名是否为“George

Washington”, 并做出相应的反馈。[www.61k.com)在此我们遇到了一个 ASP 的内建对象 request,通过使用 request 对象可以访问任何用 HTTP 请求传递的信息,包括从 HTML 表格中用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。而 QueryString 集合检索 HTTP 查询字符串中变量的值,HTTP 查询字符串由问号 (?) 后的值指定。如:

http://localhost/if2.asp?Firstname=George&Lastname=Washington

生成值为 "Firstname=George&Lastname=Washington" 的变量名字符串。关于 ASP 对象作者将在今后的几篇里重点讲述。

If...Then...Else 语句的一种变形允许您从多个条件中选择,即添加

ElseIf 子句以扩充 If...Then...Else 语句的功能,使您可以控制基于多种可能的程序流程。

我们将 asp2.asp 的程序部分扩充如下:

< %

fname=lcase(request.querystring("Firstname"))

lname=lcase(request.querystring("Lastname"))

If fname="george" and lname="washington" then %>

Hi.You must be the first president!< p>

< % elseIf fname="ronald" and lname="reagan" then %>

Hi.You must be the actor president!< p>

< % elseIf fname="jimmy" and lname="carter" then %>

Hi.You must be the peanut farmer president!< p>

< % elseIf fname="naoko" or fname="charles" then %>

Hi.Your name reminds me of someone,but I am not sure who!< p> < % else %>

Hi!Nice to Meet You

< % end if %>

可以添加任意多个 ElseIf 子句以提供多种选择。但使用多个 ElseIf 子句经常会使程序变得很累赘。在多个条件中进行选择的更好方法是使用 Select Case 语句。

Select Case 结构提供了 If...Then...ElseIf 结构的一个变通形式,可以从多个语句块中选择执行其中的一个。Select Case 语句提供的功能与 If...Then...Else 语句类似,但是可以使代码更加简练易读。Select Case 结构在其开始处使用一个只计算一次的简单测试表达式。表达式的结果将与结构中每个 Case 的值比较。如果匹配,则执行与该 Case 关联的语句块,我们同样可以用 Select Case 语句来写 asp2.asp 文件:

< %

fname=lcase(request.querystring("Firstname"))

第 23 页 共 90 页 第23页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

lname=lcase(request.querystring("Lastname"))

name=fname+lname

Select case name

case "georgewashington"

response.write "Hi.You must be the first president!< p>" case "ronaldreagan"

response.write "Hi.You must be the actor president!< p>" case "jimmycarter"

response.write "Hi.You must be the peanut farmer president!< p>" case "naokocharles"

response.write "Hi.Your name reminds me of someone,but I am not sure who!< p>"

case else

response.write "Hi!Nice to Meet You"

End Select %>

请注意 Select Case 结构只计算开始处的一个表达式,并且只计算一次,而 If...Then...ElseIf 结构计算每个 ElseIf 语句的表达式,这些表达式可以各不相同。[www.61k.com)因此仅当每个 ElseIf 语句计算的表达式都相同时,才可以使用 Select Case 结构代替 If...Then...ElseIf 结构。Select Case 语句也是可以是嵌套的,每一层嵌套的 Select Case 语句必须有与之匹配的 End Select 语句。

以上给大家介绍的脚本语言 VBScript 的函数和条件语句的使用方法,由于篇幅的缘故不能详细展开,希望各位有志学习 ASP 的朋友,能在课后进行一定程度的自学和练习。在日常开发 ASP 应用程序的过程中作者本人日渐体会到了脚本语言的重要性,灵活运用脚本语言将非但可以大大提高 ASP 应用程序的开发过程,给广大网站制作人员节省大量的时间,而且还能够增强 ASP 应用程序的执行效率和功能。欲善其事必先利其器,因此作者在此强烈建议诸君,熟练掌握脚本语言,这将对你的 ASP 程序开发大有帮助。由于本文不是 VBScript 教程,因此只能用较小的篇幅给大家简要介绍一些 VBScript 基本常识,在下一期介绍完 VBScript 的循环语句后,我们将正式开始学习 ASP 的内建对象,要深入 VBScript,建议大家找些教材进行自学。如果你在看完本文后有任何问题请及时 Mail 我,如果你有什么好的建议也请来信告知,谢谢。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

第 24 页 共 90 页 第24页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

第六章 脚本循环语句

在本文上两篇中,我们学习了脚本语言 VBScript 的变量、函数、过程和条件语句,本篇将继续给大家介绍 VBScipt 的循环语句,并对脚本语言在 ASP 中的应用加以总结。[www.61k.com]

如果有人告诉你学习 ASP 不需要任何编程知识,那么他错了;如果我告诉你学习 ASP 必须掌握一门编程语言,那么我错了。ASP 动态服务器页面环境的特点就在于它是通过一种或几种脚本语言而写成的,脚本语言可以看作是编程语言的简化版,它易于学习和掌握,这给广大动态网站的设计者们提供了相当大的便利。可以这么说 : 脚本语言运用的得当与否直接关系到 ASP 应用程序的优与劣。继上一篇我们学习了脚本语言 VBScript 的函数和条件语句后,今天我们继续来看看 VBScript 中的循环语句。

循环语句的作用就是重复执行程序代码,循环可分为三类:一类在条件变为“假”之前重复执行语句,一类在条件变为“真”之前重复执行语句,另一类按照指定的次数重复执行语句。在 VBScript 中可使用下列循环语句:

Do...Loop: 当(或直到)条件为“真”时循环。

While...Wend: 当条件为“真”时循环。

For...Next: 指定循环次数,使用计数器重复运行语句。

For Each...Next: 对于集合中的每项或数组中的每个元素,重复执行一组语句。

我们先来看看 Do...Loop,它是可以多次(次数不定)运行语句块。当条件为“真”时或条件变为“真”之前,重复执行语句块。请看下例:

< html>< head>

< title>DoLoop.asp< /title>< body bgcolor="#FFFFFF">< /head>< p>< /p> <p>请将今年到本月为止的每个月份的销售结算记录填写在本页之上。 < %

counter = 1

thismonth = month(now())

Do while counter < thismonth + 1

response.write " " & counter & " 月份 : "

response.write "___________" & "< BR>< br>"

If counter >13 then

exit do

end if

counter = counter+1

第 25 页 共 90 页 第25页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Loop

%>

< hr>< /body>< /html>

这段 ASP 程序运用循环语句制作了一张销售结算记录表,将以上代码剪贴至记事簿保存为 DoLoop.asp,并在浏览器中以 HTTP 方式进行浏览,根据当前的月份的不同,你将看到如下图的结果。[www.61k.com)

我们来分析一下此段程序,我们的目的是要根据当前的月份打印一张表格,首先我们建立一个计数器“count”并将其值设为 1,然后我们用函数 month() 和 now() 得到当前的月份,最后建立循环,当 count 的值小于当前月份的值加 1 的时候,即显示月份值及一条横线并将 count 的值加 1,循环语句重复执行直到以上条件为假时退出循环。其中如果 count 大于 13 则用 exit do 立即退出循环。

Do Loop 语句还可以使用以下语法:

Do

[statements][Exit Do]

[statements]Loop [{While | Until} condition]

While...Wend 语句是为那些熟悉其用法的用户提供的。但是由于 While...Wend 缺少灵活性,所以建议最好使用 Do...Loop 语句。下面我们来看看 For Next 语句。For...Next 语句用于将语句块运行指定的次数,在循环中使用计数器变量,该变量的值随每一次循环增加或减少。

下面的示例将过程 MyProc 重复执行 50 次。For 语句指定计数器变量 x 及其起始值与终止值。Next 语句使计数器变量每次加 1。

Sub DoMyProc50Times()

Dim x

For x = 1 To 50

MyProc

Next

End Sub

关键字 Step 用于指定计数器变量每次增加或减少的值。在下面的示例中,计数器变量 j 每次加 2。循环结束后,total 的值为 2、4、6、8 和 10 的总和。

Sub TwosTotal()

Dim j, total

For j = 2 To 10 Step 2

total = total + j

Next

MsgBox " 总和为 " & total & "。"

End Sub

第 26 页 共 90 页 第26页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

要使计数器变量递减,可将 Step 设为负值。[www.61k.com]此时计数器变量的终止值必须小于起始值。在下面的示例中,计数器变量 myNum 每次减 2。循环结束后,total 的值为 16、14、12、10、8、6、4 和 2 的总和。

Sub NewTotal()

Dim myNum, total

For myNum = 16 To 2 Step -2

total = total + myNum

Next

MsgBox " 总和为 " & total & "。"

End Sub

Exit For 语句用于在计数器达到其终止值之前退出 For...Next 语句。因为通常只是在某些特殊情况下(例如在发生错误时)要退出循环,所以可以在 If...Then...Else 语句的 True 语句块中使用 Exit For 语句。如果条件为 False,循环将照常运行。

最后,让我们来看看 For Each...Next 语句 ,For Each...Next 循环与 For...Next 循环类似。For Each...Next 不是将语句运行指定的次数,而是对于数组中的每个元素或对象集合中的每一项重复一组语句。这在不知道集合中元素的数目时非常有用。它的语法如下:

For Each element In group

[statements]

[Exit For]

[statements]Next [element]

如果 group 中有至少一个元素,就会进入 For Each 块执行。一旦进入循环,便首先对 group 中第一个元素执行循环中的所有语句。只要 group 中还有其他的元素,就会对每个元素执行循环中的语句。当 group 中没有其他元素时退出循环,然后从 Next 语句之后的语句继续执行。

至此,我们已经完成了对脚本语言 VBScript 所有的基本知识的学习,但是仅凭阅读现有的这几篇文章你是无法熟练运用 VBScript 的,你必须通过不断的实践来提高自己的等级。当然,如果你熟悉 C,你也可以选择JavaScript 来作为 ASP 应用程序的脚本语言。不知大家有没有发现 ASP 程序的调试比较困难,因为没有什么现成的工具,在这里我向大家简要介绍一下 Microsoft Script Debugger,我们可以运用它来进行一定量的程序调试工作。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

IIS4.0 所包括的 Microsoft Script Debugger(Script 侦错工具),提供脚本程序的侦错功能。您可以使用 Microsoft Script 侦错工具来进行对使用 VBScript、JScript 编写的脚本程序,以及 Java applets、beans 和 ActiveX 组件的侦错工作。

有的脚本程序在用户端浏览器执行,有的脚本程序(< % … %> 中的第 27 页 共 90 页 第27页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

部份)在服务器端执行。(www.61k.com]Microsoft Script Debugger,可以侦错用户端执行的脚本程序以及服务器端执行脚本程序。在用户端浏览器执行的脚本程序是在用户端的浏览器当中执行,包括在标准 HTML 代码中的 VBScript、Jscript 部份。在浏览器载入此 HTML 代码或譬如按下按钮触发事件时,将执行此包括脚本程序的 HTML 代码。用户端浏览器执行的脚本程序,主要用于对 HTML 表单输入的基本检查等功能。

在服务器端执行的脚本程序是在 IIS 服务器端执行,包括在 .asp 程序中。先在 IIS 服务器上执行,执行结果产生标准的 HTML 代码,再传送到用户端浏览器。服务器端执行的脚本程序,主要用于多个网页之间的连结,HTML 表单输入的处理,以及存取服务器上数据库的资料等。

Microsoft Script Debugger 提供以下的除错功能:

1、设定中断点

2、逐步追踪脚本程序。

3、设定书签。

4、检视呼叫堆叠。

5、检视和更改变数值。

6、执行脚本指令。

从下一篇开始,我们将开始学习 ASP 的内建对象,敬请关注。

第七章 内建对象Request

从本篇开始作者从 ASP 内建对象着手,为大家详细剖析 ASP 的六个内建对象和各种组件的特性和方法。

在正式开始学习 ASP 的内建对象和组件之前,先让我们来认识一些基本概念,这将对各位今后的学习大有帮助。请看下表:

asp教程 ASP完整教程(完全ASP编程)

第 28 页 共 90 页 第28页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

对象就是指由当作完整实体的操作和数据组成的变量。[www.61k.com)对象是基于特定模型的,在对象中客户使用对象的服务通过由一组方法或相关函数的接口访问对象的数据,然后客户端可以调用这些方法执行某中操作。ActiveX 组件是建立 Web 应用程序的关键,组件提供了在脚本中执行任务的对象。ActiveX 组件是一个文件,该文件包含执行某项或一组任务的代码,由于组件可以执行公用任务,这样程序员们就不必自己去创建执行这些任务的代码。可以利用组件作为脚本和基于 Web 应用程序的基本构造块。只要知道如何访问组件提供的对象,即使是位编写脚本的新手,也可以在不了解组件运作方式的第 29 页 共 90 页 第29页

asp教程 ASP完整教程(完全ASP编程)

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

情况下编写脚本。[www.61k.com)总之,组件使您不用学习编程就能够编写强大的脚本。组件是包含在动态链接库 .dll 或可执行文件 .exe 中的可执行代码。组件可以提供一个或多个对象以及对象的方法和属性。要使用组件提供的对象,请创建对象的实例并将这个新的实例分配变量名。使用 ASP 的

Server.CreateObject 方法可以创建对象的实例,使用脚本语言的变量分配指令可以为对象实例命名。如下例:

Set db=Server.CreateObject("ADODB.Connection")

这里的变量 db 就是 ASP 程序创建的访问数据库的对象实例。

Active Server Pages 提供了可在脚本中使用的内建对象。这些对象使用户更容易收集通过浏览器请求发送的信息、响应浏览器以及存储用户信息 , 从而使对象开发者摆脱了很多烦琐的工作。目前的 ASP 版本总共提供了六个内建对象,下面让我们将通过实例分别来进行学习。

一、Request 对象

可以使用 Request 对象访问任何基于 HTTP 请求传递的所有信息,包括从 HTML 表格用 POST 方法或 GET 方法传递的参数、cookie 和用户认证。Request 对象使您能够访问客户端发送给服务器的二进制数据。

Request 的语法 :

Request[. 集合 | 属性 | 方法 ]( 变量 )

在这里作者将挑选一些常用的对象语法进行分析

1、Form

Form 集合通过使用 POST 方法的表格检索邮送到 HTTP 请求正文中的表格元素的值。

语法

Request.Form(element)[(index)|.Count]

参数

element 指定集合要检索的表格元素的名称。

index 可选参数,使用该参数可以访问某参数中多个值中的一个。它可以是 1 到 Request.Form(parameter).Count 之间的任意整数。

Count 集合中元素的个数

Form 集合按请求正文中参数的名称来索引。Request.Form(element) 的值是请求正文中所有 element 值的数组。通过调用

Request.Form(element).Count 来确定参数中值的个数。如果参数未关联多个值,则计数为 1。如果找不到参数,计数为 0。要引用有多个值的表格元素中的单个值,必须指定 index 值。index 参数可以是从 1 到

Request.Form(element).Count 中的任意数字。如果引用多个表格参数中的一个,而未指定 index 值,返回的数据将是以逗号分隔的字符串。

可以使用重述符来显示表格请求中的所有数据值。例如,用户通过指定几个值填写表格,见下图。

第 30 页 共 90 页 第30页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

对于 hobby 参数,您可以使用下面的脚本检索这些值。[www.61k.com]

< html>

<head><title></title></head>

<body>

<p>请填写你的爱好</p>

<form method="POST" action="form.asp">

< p>< input type="text" name="hobby" size="20">< br>

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

< input type="checkbox" name="hobby" value=" 足球 ">足球

< input type="checkbox" name="hobby" value="乒乓球">乒乓球< /p> <p>< input type="submit" value=" 发送 " name="B1">

< input type="reset" value="重填" name="B2"></p>

< /form>

< % For Each i In Request.Form("hobby")

Response.Write i & "< BR>"

Next

%>

< /body>< /html>

将以上代码剪贴到记事簿中(注意将“< ”后面的空格去掉),保存为 form.asp 文件并运行,request 对象可以根据你在 form 中填入或选择元素内容的不同将元素逐个显示出来。

当然使用 For...Next 循环也可以生成同样的输出,如下所示 :

< %

For i = 1 To Request.Form("hobby").Count

Response.Write Request.Form("hobby")(i) & "< BR>"Next

%>

2、QueryString

QueryString 集合检索 HTTP 查询字符串中变量的值 ,HTTP 查询字符串由问号 (?) 后的值指定。如:

< A HREF= "example.asp?string=this is a sample">string sample< /A> 生成值为 "this is a sample" 的变量名字符串。通过发送表格或由用户在其浏览器的地址框中键入查询也可以生成查询字符串。

语法

Request.QueryString(variable)[(index)|.Count]

QueryString 集合可以让您以名称检索 QUERY_STRING 变量。

Request.QueryString( 参数 ) 的值是出现在 QUERY_STRING 中所有参数的值的数组。通过调用Request.QueryString(parameter).Count 可以确定参数有多少个值。

我们也可以使用 QueryString 来达到与前一个范例相同的功能。只需第 31 页 共 90 页 第31页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

要将 request.form 部分替换如下:

< %

For Each i In Request.querystring("hobby")

Response.Write i & "< BR>"

Next

%>

3、Cookies

什么是 Cookie?Cookie 其实是一个标签,当你访问一个需要唯一标识你的站址的 WEB 站点时,它会在你的硬盘上留下一个标记,下一次你访问同一个站点时,站点的页面会查找这个标记。[www.61k.com)每个 WEB 站点都有自己的标记,标记的内容可以随时读取,但只能由该站点的页面完成。每个站点的 Cookie 与其他所有站点的 Cookie 存在同一文件夹中的不同文件内(你可以在 Windows 的目录下的 Cookie 文件夹中找到它们)。一个 Cookie 就是一个唯一标识客户的标记,Cookie 可以包含在一个对话期或几个对话期之间某个 WEB 站点的所有页面共享的信息,使用 Cookie 还可以在页面之间交换信息。Request 提供的 Cookies 集合允许用户检索在 HTTP 请求中发送的 cookie 的值。这项功能经常被使用在要求认证客户密码以及电子公告板、WEB 聊天室等 ASP 程序中。

语法

Request.Cookies(cookie)[(key)|.attribute]

参数

cookie 指定要检索其值的 cookie。

key 可选参数,用于从 cookie 字典中检索子关键字的值。

attribe 指定 cookie 自身的有关信息。如:HasKeys 只读,指定 cookie 是否包含关键字。

可以通过包含一个 key 值来访问 cookie 字典的子关键字。如果访问 cookie 字典时未指定 key,则所有关键字都会作为单个查询字符串返回。例如,如果 MyCookie 有两个关键字 , First 和 Second,而在调用

Request.Cookies 时并未指定其中任何一个关键字,那么将返回下列字符串。

First=firstkeyvalue&Second=secondkeyvalue

如果客户端浏览器发送了两个同名的 cookie,那么 Request.Cookie 将返回其中路径结构较深的一个。例如,如果有两个同名的的 cookie,但其中一个的路径属性为 /www/ 而另一个为 /www/home/,客户端浏览器同时将两个 cookie 都发送到 /www/home/ 目录中,那么 Request.Cookie 将只返回第二个 cookie。

要确定某个 cookie 是不是 cookie 字典(cookie 有否有关键字),可使用下列脚本。

< %= Request.Cookies("myCookie").HasKeys %>

第 32 页 共 90 页 第32页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

如果 myCookie 是一个 cookie 字典,则前面的赋值为 TRUE。[www.61k.com]否则,为 FALSE。下面我们来看看一个 cookie 的应用实例:

< %

nickname=request.form("nick")response.cookies("nick")=nickname

' 用 response 对象将用户名写入 Cookie 之中

response.write " 欢迎 "&request.cookies("nick")&" 光临小站!"

%>

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

charset=gb2312">

< title>cookie< /title>

< meta name="GENERATOR" content="Microsoft FrontPage 3.0"><

/head>

< body>

< form method="POST" action="cookie.asp">

< p>< input type="text" name="nick" size="20">

< input type="submit" value=" 发送 " name="B1">< input type="reset" value=" 重填 " name="B2">< /p>< /form>

< /body>< /html>

这其实是一个在基于 WEB 的 BBS 或 CHAT 的 ASP 程序中常用的手法,它将用户在起始页面上填入的姓名保存在 cookie 中,这样后面的程序就可以很容易地调用该用户的 nick 了。

4、ServerVariables

大家都知道在浏览器中浏览网页的时候使用的传输协议是 HTTP,在 HTTP 的标题文件中会记录一些客户端的信息,如 : 客户的 IP 地址等等,有时服务器端需要根据不同的客户端信息做出不同的反映,这时候就需要用 ServerVariables 集合获取所需信息。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

语法

Request.ServerVariables ( 服务器环境变量 )

asp教程 ASP完整教程(完全ASP编程)

第 33 页 共 90 页 第33页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< TABLE>

<TR>

<TD>< B>Server Variable</B>< /TD>

<TD><B>Value</B></TD>

< /TR>

< % For Each name In Request.ServerVariables %>

<TR>

<TD><%= name %> </TD>

<TD><%= Request.ServerVariables(name) %></TD>

</TR>

</TABLE>

< % Next %>

今天我们详细学习了 ASP 内建对象中的 request 对象,这也是 ASP 程序中使用最频繁的对象,希望大家在课后多多实践。(www.61k.com)

第八章 内建对象Response

在上一篇中作者给大家详细介绍了 ASP 内建对象之一 Request 的使用方法,相信各位通过一系列的实践已经能够熟练掌握,本篇将继续给大家介绍 ASP 的另一个内建对象 Response。

最近,有很多朋友来“妹儿”催我加快 ASP 篇一文的写作速度,并急切地询问哪里有关于 ASP 的教材。我深深地被大家的学习热情所打动,因此决定将自己平时所搜集的一些 ASP 信息资料拿出来和大家共享,也希望所有的朋友能慷慨地将自己搜集的有关 ASP 的资料告诉作者,谢谢。由于目前国内有关 ASP 的中文教材凤毛麟角,而专门针对 ASP 网站开发的中文教材作者更是闻所未闻(可能是作者孤陋寡闻),只是最近听说出了一本第 34 页 共 90 页 第34页

asp教程 ASP完整教程(完全ASP编程)

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

清华大学出版社出版的关于 MS InterDev 的傻瓜书,其中有 ASP 的教学,和一本 Active Server Page 2.0 的中文手册,因此目前作者还是主要通过国外网站来获取 ASP 的有关信息和资料,这也是作者写本文的一个主要原因。[www.61k.com]下面我就将 bookmark 中的一些较经典的 ASP 站点罗列出来:

1、http://www.activeserverpage.com/

这是作者访问最频繁的 ASP 网站,也是世界上最大最全的关于 ASP 的网站之一,它里面不但有最新的 ASP 文献资料,免费组件,还有一本完整的 ASP 入门教材,它更是 ASP 网站的中枢站点,通过它你可以到达无数的 ASP 相关站点。

2、http://www.asphole.com/

这本是一个针对 ASP 漏洞而建立的站点,但是它却无疑是一个完备的 ASP 信息站点,它非但提供了 ASP 的文章,及组件还提供详尽透彻的联接地址。

3、http://www.15seconds.com/faq 和 http://www.15seconds.com/search 这是一个作者所看到的最大的网上 ASP 交流站点,它拥有 ASP 解疑的答案,ASP 邮件清单信息,ASP 技巧,你可能需要需要几个月的时间才能读完这些信息。而在 http://www.15seconds.com/AllComponents.asp 你可以读到最新的 ActiveX 组件和大量免费组件的详细介绍,并附有非常实用的文档与例子。

4、http://www.microsoft.com/workshop/server/asp/aspfeat.asp

大家都知道 Active Server Page 是微软提出的一套基于 NT IIS 的

WEB 服务器端环境,那么这个由微软自己建立的 ASP 技术说明站点,大家当然是不可不看的。

5、http://www.serverobjects.com/

在这里你可以获得无数实用的 ActiveX 组件 , 并下载它们的试用版,只可惜其中的大部分极好的组件都是要 Money 的。

6、http://www.cyscape.com/asp/browscap/

大家还记得作者在 ASP2 一文中介绍的那个用来辨别客户端浏览器版本的 Browser Capabilitie 组件吗?在这个站点你可以获得最新的

BROWSCAP.INI 文件,它拥有每一个 ASP 安装时微软没有提供的浏览器的信息,这样你在 ASP 中判断客户浏览器是就能够万无一失了。

7、http://www.microsoft.com/data/ado/

ASP 最强大且便捷的功能莫过于同数据库的连接,通过 ASP 内建的 ActiveX 组件,我们可以轻而易举的将 WEB 与所有和 ODBC 兼容的数据库连接起来,在这个微软的站点上你可以获取很多实用的 ADO 资料。

8、http://www.cobb.com/m_sbn4/

一个不错的 ASP 论坛,你可以在那里贴你的问题,读取别人的问题和解答。

第 35 页 共 90 页 第35页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

下面,我们开始学习 ASP 的另一个内建对象 Response。(www.61k.com]

与 Request 是获取客户端 HTTP 信息相反 ,Response 对象是用来控制发送给用户的信息,包括直接发送信息给浏览器、重定向浏览器到另一个 URL 或设置 cookie 的值。

语法

Response.collection|property|method

一、属性

1、Buffer

Buffer 属性指示是否缓冲页输出。当缓冲页输出时,只有当前页的所有服务器脚本处理完毕或者调用了 Flush 或 End 方法后,服务器才将响应发送给客户端浏览器,服务器将输出发送给客户端浏览器后就不能再设置 Buffer 属性。因此应该在 .asp 文件的第一行调用 Response.Buffer。

2、Charset

Charset 属性将字符集名称附加到 Response 对象中 content-type 标题的后面。对于不包含 Response.Charset 属性的 ASP 页,content-type 标题将为 :content-type:text/html。

我们可以在 .asp 文件中指定 content-type 标题,如 :

< % Response.Charset="gb2312") %>

将产生以下结果 :

content-type:text/html; charset=gb2312

注意,无论字符串表示的字符集是否有效,该功能都会将其插入 content-type 标题中。且如果某个页包含多个含有 Response.Charset 的标记,则每个 Response.Charset 都将替代前一个 CharsetName。这样,字符集将被设置为该页中 Response.Charset 的最后一个实例所指定值。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

3、ContentType

ContentType 属性指定服务器响应的 HTTP 内容类型。如果未指定 ContentType,默认为 text/HTML。

4、Expires

Expires 属性指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前又回到此页,就会显示缓冲区中的页面。如果设置 response.expires=0,则可使缓存的页面立即过期。这是一个较实用的属性,当客户通过 ASP 的登陆页面进入 WEB 站点后,应该利用该属性使登陆页面立即过期,以确保安全。

5、ExpiresAbsolute

与 Expires 属性不同 ExpiresAbsolute 属性指定缓存于浏览器中的页面的确切到期日期和时间。在未到期之前,若用户返回到该页,该缓存中的页面就显示。如果未指定时间,该主页在当天午夜到期。如果未指定日期,则该主页在脚本运行当天的指定时间到期。如下示例指定页面在 1998 年 第 36 页 共 90 页 第36页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

12 月 10 日上午 9:00 分 30 秒到期。[www.61k.com]

< % Response.ExpiresAbsolute=#Dec 12,1998 9:00:30# %>

二、方法

1、Clear

可以用 Clear 方法清除缓冲区中的所有 HTML 输出。但 Clear 方法只清除响应正文而不清除响应标题。可以用该方法处理错误情况。但是如果没有将 Response.Buffer 设置为 TRUE,则该方法将导致运行时错误。

2、End

End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理。如果 Response.Buffer 已设置为 TRUE,则调用 Response.End 将缓冲输出。

3、Flush

Flush 方法立即发送缓冲区中的输出。如果没有将 Response.Buffer 设置为 TRUE,则该方法将导致运行时错误。

4、Redirect

Redirect 方法使浏览器立即重定向到程序指定的 URL。这也是一个我们经常用到方法,这样程序员就可以根据客户的不同响应,为不同的客户指定不同的页面或根据不同的情况指定不同的页面。一旦使用了 Redirect 方法任何在页中显式设置的响应正文内容都将被忽略。然而,此方法不向客户端发送该页设置的其他 HTTP 标题,将产生一个将重定向 URL 作为链接包含的自动响应正文。Redirect 方法发送下列显式标题,其中 URL 是传递给该方法的值。如:

< % Response.redirect("www.chinabyte.com") %>

5、Write

Write 方法是我们平时最常用的方法之一,它是将指定的字符串写到当前的 HTTP 输出。

三、集合

Response 对象只有一个集合 --Cookie

Cookies 集合设置 cookie 的值。若指定的 cookie 不存在,则创建它。若存在,则设置新的值并且将旧值删去。

语法

Response.Cookies(cookie)[(key)|.attribute]=value

这里的 cookie 是指定 cookie 的名称。而如果指定了 key,则该 cookie 就是一个字典。attribute 指定 cookie 自身的有关信息。attribute 参数可以是下列之一 :

Domain 若被指定,则 cookie 将被发送到对该域的请求中去。

Expires 指定 cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上,必须设置该日期。若此项属性的设置未超过当前日期,则在第 37 页 共 90 页 第37页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

任务结束后 cookie 将到期。(www.61k.com)

HasKeys 指定 cookie 是否包含关键字。

Path 若被指定,则 cookie 将只发送到对该路径的请求中。如果未设置该属性,则使用应用程序的路径。

至此,我们已经学习的 Response 对象的所有属性、方法和集合的理论知识,下面作者将给大家演示一段简单的程序,通过实践让大家加深理解。先将以下程序剪贴到记事簿中,并保存为 asp7.asp。( 注意将 < 和 % 之间的空格去掉 !!!)

< %

Dim user

Dim flag

Dim pwd

Dim say

Response.buffer=true ' 开启缓冲页面功能

Response.ContentType="text/HTML"

Response.Charset="gb2312"

user=Request.Form("username")

pwd=Request.Form("password")

say=Request.QueryString("say")

%>

< form method="POST" action="asp7.asp">

< p> 用户名 :< input type="text" name="username" size="12">< br> 口令:< input type="password" name="password" size="12">< br>

< input type="submit" value=" 提交 " name="B1">< input type="reset" value=" 取消 " name="B2">< /p>< /form>

< %

If say=1 then

Response.Write " 欢迎书生大驾光临 !"

End If

If say > 1 then

Response.Write " 欢迎再次光临书生的 ASP 网站 !"

End If

If user="Adm" and pwd="shusheng" Then

Response.Expires=1 ' 设置该页面在浏览器的缓冲中存储 1 分钟后过期。

flag=1

ElseIf user="guest" and pwd="guest" Then

Response.Expires=0 ' 使缓存的页面立即过期。

第 38 页 共 90 页 第38页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Response.Clear ' 清空存储在缓存中的页面

flag=2

ElseIf user="vip" and pwd="vip" Then

Response.Write " 欢迎 VIP 光临书生的 ASP 网站 "

flag=3

Else

flag=0

Response.End ' 立即停止脚本处理,并将缓存中的页面输出

End If

Response.write "< p>< a href='asp7b.asp?flag="&flag&"'> 动态网站设计十八般武艺 --ASP 篇 (7) 实践练习 < /a>< /p>"

' 将变量 flag 的值传送给 asp7b.asp

%>

< p> 动态网站设计十八般武艺 --ASP 篇 (7) 实践练习 < /p> 再将以下程序保存为 asp7b.asp。[www.61k.com]

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

< %

Dim saysay=Request.QueryString("flag")

Select case say

case "1"

Response.Redirect "asp7.asp?say=1"

case "2"

Response.Redirect "asp7.asp?say=2"

case "3"

Response.Redirect "asp7.asp?say=3"

case "0"

Response.Redirect "asp7.asp?say=0"

End Select

%>

将这两个程序放在有执行权限的 WEB 虚拟目录下,并以 http 方式访问 asp7.asp。在这两个程序中我们充分运用了至今为止所学过的两个 ASP 内建对象 :Request 和 Response。当你第一次访问 asp7.asp 文件时,页面上出现一个 Form 并提示输入用户名和口令,如果你输入用户名 :Adm、口令 :shusheng, 则会出现如下页面 :

如果你输入用户名 :guest、口令 :guest, 则仅出现如下页面 :

这是为什么呢?因为我们设置了页面缓存,当使用 guest 登陆时,判断程序自动清空其之前所有存储在缓存中的页面,而仅将其后脚本程序执行的结果显示出来。

那为什么第一次登陆 asp7.asp 页面时仅仅只显示一个 Form 对话框第 39 页 共 90 页 第39页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

呢?因为此时程序判断到用户既非 Adm, 也不是 guest 和 vip,所以执行 Response.End, 立即将存储在缓存中的 Form 显示出来,并停止其后的一切脚本处理,包括纯 HTML 代码的显示。[www.61k.com]

无论你是用 Adm 还是 guest 或 vip 登陆该页面你都可以看到一个超链,该超链指向文件 asp7b.asp,当我们点击该超链时,asp7.asp 将变量 flag 的值作为参数发送给 asp7b.asp, 而后者则根据该参数的值来做出判断,并依据不同情况使用 Response.Redirect 再强行返回 asp7.asp, 并也将一个变量 say 的值作为参数发送给 asp7.asp。如此一来,asp7.asp 又会根据此参数来做出不同的反应。

大家现在都看到了我们仅仅用了两个很简单的程序,就可以做到对同一个页面的多种不同显示结果,这正是 ASP 的魅力所在,各位可以以此示范程序为基础,来进行一些改动,以熟练掌握我们所学的这两个内建对象。今天的课程就到此为止了,在结尾我还要说明两件事。第一,很多朋友来信询问哪里可以看到 ASP 篇的前几篇文章,请大家点击 此处 便可以找到。第二,一些朋友反映文中的 ASP 程序不能运行,这主要是因为 Chinabyte 的页面都是用数据库生成的,它限定在文章中不能使用带 HTML 或 ASP 格式的代码,所以在所有 < 符号后都加了空格,各位只要将 < 后的空格去掉就可以运行程序了,切记。

第九章 内建对象Application 和 Session

在上一篇中作者给大家详细介绍了 ASP 内建对象 Response 的使用方法,在这一篇中作者将继续给大家介绍另两个非常实用且重要的 ASP 的内建对象 Application 和 Session。

在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象。

让我们先来看看 Application 对象。在同一虚拟目录及其子目录下的所有 .asp 文件构成了 ASP 应用程序。我们非但可以使用 Application 对象,在给定的应用程序的所有用户之间共享信息,并在服务器运行期间持久的保存数据。而且,Application 对象还有控制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的事件。

下面就让我们一起来学习 Application 对象。

一、属性

虽然 Application 对象没有内置的属性,但我们可以使用以下句法设置用户定义的属性也可称为集合。

Application(" 属性 / 集合名称 ")= 值

第 40 页 共 90 页 第40页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

我们可以使用如下脚本声明并建立 Application 对象的属性。(www.61k.com] < %

Application("MyVar") = "Hello"

Set Application("MyObj") = Server.CreateObject("MyComponent")

%>

一旦我们分配了 Application 对象的属性,它就会持久地存在,直到关闭 WEB 服务器服务使得 Application 停止。由于存储在 Application 对象中的数值可以被应用程序的所有用户读取,所以 Application 对象的属性特别适合在应用程序的用户之间传递信息。

二、方法

Application 对象有两个方法,它们都是用于处理多个用户对存储在 Application 中的数据进行写入的问题

1、Lock 方法禁止其他客户修改 Application 对象的属性。

Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。

让我们来看看下面这段用 Application 来记录页面访问次数的程序 : < %

Dim NumVisitsNumVisits=0

Application.LockApplication("NumVisits") = Application("NumVisits") + 1 Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

将以上脚本保存在你的 .asp 文件中,就轻而易举地给你的页面添加了一个计数器。

2、和 Lock 方法相反,Unlock 方法允许其他客户修改 Application 对象的属性。

在上面的例子中,上述例子中,Unlock 方法解除对象的锁定,使得下一个客户端能够增加 NumVisits 的值。

三、事件

1、Application_OnStart

Application_OnStart 事件在首次创建新的会话 ( 即 Session_OnStart 事件 ) 之前发生。当 WEB 服务器启动并允许对应用程序所包含的文件进行请求时就触发 Application_OnStart 事件。Application_OnStart 事件的处理过程必须写在 Global.asa 文件之中。

第 41 页 共 90 页 第41页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Application_OnStart 事件的语法如下 :

< SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

Sub Application_OnStart. . .

End Sub

< /SCRIPT>

2、Application_OnEnd

Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,Application_OnEnd 事件的处理过程也必须写在 Global.asa 文件之中。(www.61k.com)

下面让我们来看看在使用 Application 对象时必须注意的一些事项。 不能在 Application 对象中存储 ASP 内建对象。例如,下面的每一行都返回一个错误。

< %

Set Application("var1")=Session

Set Application("var2")=Request

Set Application("var3")=Response

Set Application("var4")=Server

Set Application("var5")=Application

Set Application("var6")=ObjectContext

%>

若您将一个数组存储在 Application 对象中,请不要直接更改存储在数组中的元素。例如,下列的脚本无法运行。

< % Application("StoredArray")(3) = "new value" %>

这是因为 Application 对象是作为集合被实现的。数组元素

StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中,并将覆盖此位置以前存储的任何信息。建议您在将数组存储在 Application 对象中时,在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时,您应再将数组全部存储在 Application 对象中,这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。

---asp8a.asp---

< %

dim MyArray()

Redim MyArray(5)

MyArray(0)="hello"

MyArray(1)="some other string"

Application.Lock

Application("StoredArray")=MyArray

Application.Unlock

第 42 页 共 90 页 第42页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Response.Redirect "asp8b.asp"

%>

---asp8b.asp---

< %

LocalArray=Application("StoredArray")

LocalArray(1)=" there"

Response.Write LocalArray(0)&LocalArray(1)

Application.Lock

Application("StoredArray")=LocalArray

Application.Unlock

%>

与 Application 对象具有相近作用的另一个非常实用的 ASP 内建对象就是 Session。[www.61k.com)我们可以使用 Session 对象存储特定的用户会话所需的信息。当用户在应用程序的页之间跳转时,存储在 Session 对象中的变量不会清除,而用户在应用程序中访问页面时,这些变量始终存在。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。 通过向客户程序发送唯一的 Cookie 可以管理服务器上的 Session 对象。当用户第一次请求 ASP 应用程序中的某个页面时,ASP 要检查 HTTP 头信息,查看是否有在报文中有名为 ASPSESSIONID 的 Cookie 发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新 ASPSESSIONID Cookie 的值发送给客户端,正是使用这种 Cookie,可以访问存储在服务器上的属于客户程序的信息。Session 对象最常见的作用就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持 cookie 的浏览器中保留,如果客户关闭了 Cookie 选项,Session 也就不能发挥作用了。

一、属性

1、SessionID

SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识。会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。

2、TimeOut

Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限。如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。

二、方法

Session 对象仅有一个方法,就是 Abandon,Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 第 43 页 共 90 页 第43页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Abandon 方法,一旦会话超时,服务器将删除这些对象。(www.61k.com)当服务器处理完当前页时,下面示例将释放会话状态。

< % Session.Abandon %>

三、事件

Session 对象有两个事件可用于在 Session 对象启动和释放是运行过程。

1、Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。

尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。

为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。程序如下 :

< SCRIPT RUNAT=Server Language=VBScript>

Sub Session_OnStart

startPage = "/MyApp/StartHere.asp"

currentPage = Request.ServerVariables("SCRIPT_NAME")

if strcomp(currentPage,startPage,1) then

Response.Redirect(startPage)

end if

End Sub

< /SCRIPT>

上述程序只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求服务器都将处理

Session_OnStart 脚本并将用户重定向到启动页中。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

2、Session_OnEnd 事件在会话被放弃或超时发生。

关于使用 Session 对象需要注意的事项 Application 对象相近,请参照前文。

会话可以通过以下三种方式启动 :

1、一个新用户请求访问一个 URL,该 URL 标识了某个应用程序中的 .asp 文件,并且该应用程序的 Global.asa 文件包含 Session_OnStart 过程。

第 44 页 共 90 页 第44页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

2、用户在 Session 对象中存储了一个值。(www.61k.com]

3、用户请求了一个应用程序的 .asp 文件,并且该应用程序的Global.asa 文件使用 < OBJECT> 标签创建带有会话作用域的对象的实例。

如果用户在指定时间内没有请求或刷新应用程序中的任何页,会话将自动结束。这段时间的默认值是 20 分钟。可以通过在 Internet 服务管理器中设置“应用程序选项”属性页中的“会话超时”属性改变应用程序的默认超时限制设置。应依据您的 Web 应用程序的要求和服务器的内存空间来设置此值。例如,如果您希望浏览您的 Web 应用程序的用户在每一页仅停留几分钟,就应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽您的服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时值的超时值,可以设置 Session 对象的 Timeout 属性。例如,下面这段脚本将超时值设置为 5 分钟。

< % Session.Timeout = 5 %>

当然你也可以设置一个大于默认设置的超时值,Session.Timeout 属性决定超时值。你还可以通过 Session 对象的 Abandon 方法显式结束一个会话。例如,在表格中提供一个“退出”按钮,将按钮的 ACTION 参数设置为包含下列命令的 .asp 文件的 URL。

< % Session.Abandon %>

今天,我们学习了两个在 WEB 页面特别是基于 WEB 的 BBS 或 Chat 上经常使用 ASP 内建对象,由于这两个对象在实际运用中很实用,因此在下一篇中作者将运用至此我们所学过的 4 个 ASP 内建对象,给大家演示一个完整的 ASP 应用程序,相信通过这个练习,能大大加深你对 ASP 应用程序的理解和掌握。敬请关注“动态网站设计十八般武艺 --ASP 篇 (9)”。

第十章 Global.asa文件的使用及Chat程序 在上一篇中作者给大家详细介绍了两个非常实用的 ASP 内建对象 Application 和 Session 的使用方法。由于这两者的 OnStart、OnEnd 事件的脚本都必须在 Global.asa 文件中声明 , 因此,本篇将给大家详细介绍 Global.asa 文件的使用方法。为使大家熟练掌握至今所学过的知识,本篇还将举出一个 ASP 的 Chat 程序,供各位参考。

最近很多朋友来信问我,为什么前两期的范例程序运行时有这样那样的错。首先,我要向大家声明,这些程序都是我自己写的,在出“厂”前都经过合格检验,绝无“假冒伪劣产品”。:) 由于程序中使用了 cookie 记录客户信息,所以如果你在浏览器中没有设置接受 cookie 则程序将不能正常运第 45 页 共 90 页 第45页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

行。(www.61k.com]另外,程序将客户信息记录在客户端的 cookie 所使用的方法是

Response.Cookie,此语句必须写在 ASP 文件中的第一个 < HTML> 标记前,这是因为 Cookie 是作为 HTTP 传输的头信息的一部分发送给客户的,如果当 HTTP 报头信息已经传输给客户后再使用 Response.Cookie,将出现以下错误 :“HTTP 标题已经写入到客户浏览器。任何 HTTP 标题的修改必须在写入页内容之前。”,可能一些朋友在剪贴程序的时候没有注意,打乱了程序的前后次序 , 或者是错误的将 HTML 代码添加在 ASP 范例程序之前,因而导致程序运行出错。因此,我建议大家一方面在首次运行例程的时候不要对程序进行任何改动,尽量在看懂程序的基础上逐步改进,另一方面在运行 ASP 程序时至少要在浏览器中选择可接受 Cookie,否则一旦 ASP 程序中使用了 Cookie 或 Session,它们都将无法正常运行。

下面我来向大家介绍 Global.asa 文件的使用方法。

什么是 Global.asa 文件?它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的根目录中。每个应用程序只能有一个 Global.asa 文件。

在 Global.asa 文件中,如果包含的脚本没有用 < SCRIPT> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。我们可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 < SCRIPT> 标记中。 在 Global.asa 文件中声明的过程只能从一个或多个与

Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序的 ASP 页中,它们是不可用的。如果要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端包容 (SSI) 语句将该文件包含在调用该过程的 ASP 程序中。通常,包含文件的扩展名应为 .inc。

下面是一个很标准的 Global.asa 文件 :

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

'Session_OnStart 当客户首次运行 ASP 应用程序中的任何一个页面时运行 'Session_OnEnd 当一个客户的会话超时或退出应用程序时运行

'Application_OnStart 当任何客户首次访问该应用程序的首页时运行 'Application_OnEnd 当该站点的 WEB 服务器关闭时运行

< /SCRIPT>

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

Sub Application_OnStart

VisitorCountFilename = Server.MapPath ("/ex2") + "\VisitCount.txt"

Set FileObject = Server.CreateObject("Scripting.FileSystemObject")

第 46 页 共 90 页 第46页

asp教程 ASP完整教程(完全ASP编程)

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

Active Server Pages教程

Set Out= FileObject.OpenTextFile (VisitorCountFilename, 1, FALSE, FALSE) Application("visitors") = Out.ReadLine

Application("VisitorCountFilename") = VisitorCountFilename

End Sub

'========================================================= SUB Application_OnEnd

Set FileOutObject = Server.CreateObject("Scripting.FileSystemObject")

Set Out= FileOutObject.CreateTextFile (Application("VisitorCountFilename"), TRUE,FALSE)

Out.WriteLine(application("visitors"))

End Sub

'=========================================================Sub Session_OnStart

Session.Timeout = 5

Application("visitors") = Application("visitors") + 1

Session("ID")=Session.SessionID

End Sub

< /SCRIPT>

在这个 Global.asa 程序中,涉及到了 ASP 的 File Access 组件,它可以提供用于访问文件系统的方法、属性和集合。(www.61k.com)这将在以后 ASP 的组件中进行展开讨论。在这里,它起到了在服务器上创建新文件并对文件进行写操作的作用。这其实是一个 ASP 页面访问记数器应用程序的 Global 文件,首先当客户首次访问该应用程序的首页时 , 过程 Application_OnStart 定义了在服务器上指定的虚拟目录下新建一个 VisitCount.txt 的文本文件,并将文件的路径和内容保存在应用程序级的变量中。而当任何一个客户访问 ASP 应用程序中的任何一个页面时,过程 Session_OnStart 定义将应用程序级的变量 visitors 的值自动加一。这样,每当有客户访问页面时,变量 visitors 都将自动加一,以起到统计点击率的作用。由于变量 visitors 的值是存储在系统内存之中,所以如果服务器关闭或重新启动,存储在变量中的数据将自动丢失,所以通过定义过程 Application_OnEnd,在服务器关闭或重启之前将数据写入事先建立的文本文件之中,这样就能确保当服务器再次启动时,Application_OnStart 过程可以从 VisitCount.txt 文件中读取以前的统计数。

经过这段时间的学习,相信大家已经能够比较熟练的运用我们所学过的这些 ASP 内建对象来编写一些较简单的 ASP 应用程序,可别小看你现在所掌握的这些 ASP 基本知识哦 ! 其实你已经能够开发一些简单但实用的 ASP 应用程序了。下面我就举一个非常简单的 ASP WEB 聊天室程序,你会发觉写聊天室原来是一件这么容易、轻松的事。可能朋友们已经在一些杂第 47 页 共 90 页 第47页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

志上看到过 ASP 聊天程序的编写方法,但作者在这里自己写了一个更简单的程序,仅仅使用了一个 .asp 文件。[www.61k.com]请将以下代码剪贴到记事簿并保存为 chat.asp。

< %@ Language=VBScript %>

< %

Response.Buffer=true ' 设置输出缓存,用于显示不同页面。

On error resume next ' 忽略程序出错部分

If Request.ServerVariables("Request_Method")="GET" then

' 判断客户是以什么方式请求 WEB 页面

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

' 客户登陆界面

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

%>

< form method="POST" action="chat.asp">< p>

< input type="text" name="nick" size="20" value="nick"

style="background-color: rgb(192,192,192)">< br>

< input type="submit" value=" 进入聊天室 " name="B1" style="color: rgb(255,255,0); font-size: 9pt; background-color: rgb(0,128,128)">

< p>< input type="hidden" name="log" size="20" value="1">< br>< /p> < /form>

< %

Response.End ' 结束程序的处理

Else

Response.clear ' 清空缓存中的内容

dim talk

If Request.Form("nick")<>"" then

' 判断客户是是否在聊天界面中

Session("nick")=Request.Form("nick")

End If

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

客户聊天界面

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

%>

< form method="POST" action="chat.asp" name=form1> < p><

%=Session("nick")%> 说话:< input type="text" name="talk" size="50">< br> < input type="submit" value=" 提交 " name="B1">

< input type="reset" value=" 取消 " name="B2">< /p>

< /form>

第 48 页 共 90 页 第48页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< A HREF="/asptest/shusheng/chat.asp"> 离开 < /a>< br>< br>

< %

If Request.Form("log")<>1 then

If trim(Request.Form("talk"))="" then

' 判断用户是否没有输入任何内容

talk=Session("nick")&" 沉默是金。[www.61k.com]"

Else

talk=trim(Request.Form("talk"))

' 去掉字符后的空格

End If

Application.lock

Application("show")="< table border='0' cellpadding='0' cellspacing='0'

width='85%' >< tr>< td width='100%' bgcolor='#C0C0C0'>< /td>< /tr>< tr>< td width='100%'>< font color='#0000FF'> 来自 "&Request.ServerVariables

("remote_addr") & " 的 "&Session("nick") &time&" 说:< /font>"& talk & "< /td>< /tr>< tr>< td width='100%' bgcolor='#C0C0C0'>< /td>< /tr>< /table>< br>"&Application("show")

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

Application.UnLock

Response.Write Application("show")

End If

End If

%>

第一次运行 chat.asp 程序,你首先将看到如下页面 :

选择你的 nick 进入聊天室后,将看到如下页面 :

输入你想要说的话,对话将出现在输入框的下方,如下图 : 下面我们来对这个聊天室程序进行逐步的分析。

首先,由于聊天室的所有客户都要能够共享信息,所以不可避免的要用到具有应用程序级变量的对象 Application,这是建立 Chat 程序的关键所在,所有的谈话数据都存放在一个应用程序级变量中,以便让所有的客户读取。我们可以用所学过的 request 对象获取客户所输入的谈话,并保存在变量 talk 中 , 然后将 talk 的值存入应用程序级变量 show 中,如下 : < % Application("show")=talk&Application("show") %>

接下来要考虑的是当不同的客户同时向 Chat 应用程序进行操作的时候如何处理。这个问题其实与在数据库中的两个用户同时写入同一个记录一样,如果两个用户同时对同一个应用程序级变量进行写操作,则一个用户所作的修改会被另一个用户的操作所覆盖,所以,如果对 Application 对象数据的并发访问不采取一定措施,则会导致当两个用户试图同时对 Asp 聊天室应用程序提交时,一个用户的提交内容会被另一个用户的提交内容所覆第 49 页 共 90 页 第49页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

盖,在被参加到会话中的任何人看到之前就消失了。[www.61k.com]为了避免这类问题的出现,我们需要使用 Application 对象的 Lock 属性来约束只允许当前的用户编辑或增加 Application 对象的属性,这样当用户开始修改应用程序级变量开始,到 Application 对象被显式地 Unlocked 为止,Application 对象的属性只能被该用户编辑,如果此时有其他用户请求编辑 Application 对象,则这些用户要排队等待,知道应用程序被 Unlock 为止。如下所示 : Application.lock

Application("show")=talk&Application("show")

Application.UnLock

现在整个程序的核心部分你已经了解了,下面考虑如何保存客户信息,这里我们要用到一个会话级变量,即将客户的 nick 保存在 Session 中。如: Session("nick")=Request.Form("nick")

最后,我们要考虑的是如何仅在一个 .asp 文件中处理各种事件 , 如 : 客户登陆界面、客户聊天界面。由于客户第一次请求 .asp 文件时,采用的是简单的 HTTP GET 方式,但是当客户向页面上的表单字段中增加的数据并向自身提交表单后,.asp 文件会再次被请求,不过这次数据是经过 HTTP POST 方式进行传递的。文件被请求的方式可以用两种方法来确定。一是测试 Request.Form 集合是否包含成员,若没有,则表明没有发送给表单处理的数据。二是使用 Request.ServerVariables("Request_Method") 变量。如果表单是通过 HTTP GET 方式被请求的,则这个变量会返回“GET”,如果表单被提交处理则返回“POST”。由于后一种方法对于确定文件的请求方式更直接,所以我们使用如下代码进行判断 :

if Request.ServerVariables("Request_Method")="GET" then

由于我们设置了 ASP 缓存,所以当程序判断页面请求方式为 GET 时,程序运行 Response.End,来结束后面的所有操作,否则则运行

Response.clear, 清空缓存中已有的内容,并继续程序的运行。这样我们就得以用同一个 .asp 文件根据不同情况给客户显示不同的界面。

好了,我已经将这个 ASP Chat 程序的核心部分告诉大家了,剩下的一些细节性问题请各位自己读程序吧,其实这个程序还存在很多不足之处,最大的毛病是我没有写自动刷新的功能,因此如果你在 Chat 中不说话,那也就看不到其他客户所说的话了。Chat 在 Internet 中的魅力大家是知道的,其实 , 用 ASP 也完全能做到同 irc 类似的强大功能,当然这就需要写更多的代码,如果大家有兴趣请写信给我,我将在今后的文章中逐步提升这个 chat 程序的等级,让大家也过过“Oper”的隐。注:有了这个 chat 程序,你就可以用来在自己的 PWS 上建一个 chat 应用程序,只要将你的 IP 地址告诉朋友,如 http://202.96.210.33/asp/chat.asp,你们就可以通过你的电脑在网上聊天了,很爽的,不信你试试 !

第 50 页 共 90 页 第50页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

第十一章 内建对象Server

通过前九篇的理论和实践,相信大家已经对 ASP 有了系统的了解,虽然至今为止,我们只学了 ASP 的 4 个内建对象,但已经完全能够写出一些实用的小程序了。[www.61k.com)今天,作者将继续给大家讲解最后一个 ASP 内建对象——Server。

在开始本次课程之前,我仍要在这里回答一些朋友们提出的比较普遍的问题。最近仍有不少朋友来信问我,如何构建服务器端的 Active Server Page 环境。我想可能是我在前几篇中没有讲清楚,因此,在本篇的开头有必要把这个问题详细阐述一遍。

ASP 的应用完全是基于 Microsoft Internet Infomation Server(简称 IIS)之上的,IIS 有分别用于 Windows NT Server 和 WorkStation 的两个版本中(当然 IIS4.0 也有 Windows98 版,这里暂且不提),其功能几乎完全相同,所不同的只是安装过程。一般来说,我们使用的都是基于 NT 服务器上的 IIS 版本。在 NT Server 的环境中,发布信息、管理站点的工作一般都是通过 IIS 来完成的。通常我们在 NT4.0 版本中运行的是 IIS2.0 版,但它不具有支持 ASP 的功能。ASP 必须在安装完 IIS 后单独安装,安装文件是一个微软发布的 ASP 安装包,大约有 9 兆多,应该可以在微软的网站上下载。当 IIS2.0 中增添了支持 ASP 的功能后,其也就自动升级为 3.0 版本。2.0 和 3.0 对于 WEB 服务器来说,并没有什么大的改动,只是单纯地增加了运行 ASP 的能力。当安装完成后,运行 Internet 服务管理器,你将看到如下画面:

可以到在 IIS3.0 中提供了三种服务:WWW、Gopher、FTP,WWW 服务为客户浏览器提交 WEB 页,并允许客户访问 .asp 文件。当然,你可以直接安装最新的 IIS4.0 版本,作者也建议各位安装此版本,因为它具有更强更高的 WEB 管理机能和安全性。在 IIS4.0 中 IIS 的管理界面发生了根本性的改变,熟悉的 Internet 服务管理器,被取而代之为 Microsoft 管理控制台,简称 MMC。其界面如下图:

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

那么如何安装 IIS4.0 呢?在 NT4.0 上安装 IIS4.0 时,你的系统中必须已经安装了 NT SP3,以及 Internet Explorer4.01,注意这里的 Internet Explorer 的版本必须是 4.01,版本号为 4.72.3110.8。这点很重要,否则你将不能安装 IIS4.0。作者为了安装该版本特意花费了一个晚上在微软的站点上升级 IE 版本。

IIS 支持虚拟目录,通过在“服务器属性”对话框中的“目录”标签可以管理虚拟目录。建立虚拟目录对于管理 WEB 站点具有非常重要的意义。首先,虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中,客第 51 页 共 90 页 第51页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

户通过选择“查看源代码”,很容易就能获取页面的文件路径信息,如果在 WEB 页中使用物理路径,将暴露有关站点目录的重要信息,这容易导致系统受到攻击。[www.61k.com]其次,只要两台机器具有相同的虚拟目录,你就可以在不对页面代码做任何改动的情况下,将 WEB 页面从一台机器上移到另一台机器。还有就是,当你将 WEB 页面放置于虚拟目录下后,你可以对目录设置不同的属性,如:Read、Excute、Script。读访问表示将目录内容从 IIS 传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用 ASP 时,就必须将你存放 .asp 文件的目录设置为“Excute(执行)”。作者建议大家在设置 WEB 站点时,将 HTML 文件同 ASP 文件分开放置在不同的目录下,然后将 HTML 子目录设置为“读”,将 ASP 子目录设置为“执行”,这不仅方便了对 WEB 的管理,而且最重要的提高了 ASP 程序的安全性,防止了程序内容被客户所访问。因为在今年 7 月底的时候 IIS 被一些网络高手发现了一个可怕的 bug,那就是,当你在一个站点的 .asp 文件后加上 ::$DATA 后,客户将能在浏览器中看到该 .asp 文件的所有源代码,这对于一个站点来说是非常可怕的。当然微软已经针对这个 bug,编写了补丁,但是为了彻底杜绝这种可能性的发生,作者还一建议大家不要将 .asp 所在的目录设置为可读。

我想,现在各位应该已经完全了解 ASP 的服务器端设置了,下面我们就进入正题 -- 学习 ASP 的最后一个内建对象 Server。

Server 对象提供对服务器上的方法和属性的访问 , 其中大多数方法和属性是作为实用程序的功能服务的。有了 Server 对象,你就可以在服务器上启动 ActiveX 对象例程,并使用 Active Server 服务提供象 HTML 和 URL 编码这样的函数。

一、语法

Server.property|method

二、属性

ScriptTimeout 超时值,在脚本运行超过这一时间之后即作超时处理。如下代码指定服务器处理脚本在 100 秒后超时。

< % Server.ScriptTimeout=100 %>

这里需要注意的是,通过使用元数据库中的 AspScriptTimeout 属性可以为 Web 服务或 Web 服务器设置缺省的 ScriptTimeout 值。

ScriptTimeout 属性不能设置为小于在元数据库中指定的值。例如,如果 NumSeconds 设置为 60,而元数据库设置包含了默认值 90 秒,则脚本在 90 秒后超时。

三、方法

1、HTMLEncode 方法

HTMLEncode 方法允许你对特定的字符串进行 HTML 编码,虽然 HTML 可以显示大部分你写入 ASP 文件中的文本,但是当你需要实际包第 52 页 共 90 页 第52页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

含 HTML 标记中所使用的字符,就会遇到问题。(www.61k.com]这是因为,当浏览器读到这样的字符串时,会试图进行解释。例如下面的这段文本 :

这是对 HTMLEncode 方法的测试。< br> 这里应该不会另起一行。 会被浏览器显示为 :

这是对 HTMLEncode 方法的测试。

这里应该不会另起一行。

为了避免此类问题,我们就需要使用 Server 对象的 HTMLEncode 方法,采用对应的不由浏览器解释的 HTML Character Code 替代 HTML 标记字符。所以,用下面的代码才能显示正确的 HTMLEncode 字符串,从而在浏览器中按你的需要输出文本。

< %

Response.write Server.HTMLEncode(" 这是对 HTMLEncode 方法的测试。< br> 这里应该不会另起一行。")%>

2、URLEncode 方法

就象 HTMLEncode 方法使客户可以将字符串翻译成可接受的 HTML 格式一样,Server 对象的 URLEncode 方法可以根据 URL 规则对字符串进行正确编码,当字符串数据以 URL 的形式传递到服务器时,在字符串中不允许出现空格,也不允许出现特殊字符。为此,如果你希望在发送字符串之前进行 URL 编码,可以使用 Server.URLEncode 方法。

3、MapPath 方法

MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上。

语法如下 :Server.MapPath(Path)

Path 指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始,则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始,则 MapPath 方法返回同 .asp 文件中已有的路径相对的路径。这里需要注意的是 MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。

对于下列示例,文件 data.txt 和包含下列脚本的 test.asp 文件都位于目录 C:\Inetpub\Wwwroot\asp 下。C:\Inetpub\Wwwroot 目录被设置为服务器的宿主目录。下列示例使用服务器变量 PATH_INFO 映射当前文件的物理路径。以下脚本

< %= server.mappath(Request.ServerVariables("PATH_INFO"))%> 输出

c:\inetpub\wwwroot\asp\test.asp

由于下列示例中的路径参数不是以斜杠字符开始的,所以它们被相对映射到当前目录,此处是目录 C:\Inetpub\Wwwroot\asp。以下脚本 < %= server.mappath("data.txt")%>

第 53 页 共 90 页 第53页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< %= server.mappath("asp/data.txt")%>

输出

c:\inetpub\wwwroot\asp\data.txt

c:\inetpub\wwwroot\asp\asp\data.txt

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

4、CreateObject 方法

Server.CreateObject 恐怕是 ASP 中最为实用,也是最强劲的功能了。(www.61k.com]它用于创建已经注册到服务器上的 ActiveX 组件实例。这是一个非常重要的特性,因为通过使用 ActiveX 组件能够使你轻松地扩展 ActiveX 的能力,正是使用了 ActiveX 组件,你可以实现至关重要的功能,譬如数据库连接、文件访问、广告显示和其他 VBScript 不能提供或不能简单地依靠单独使用 ActiveX 所能完成的功能。正是因为这些组件才使得 ASP 具有了强大的生命力。

其语法如下:

Server.CreateObject("Component Name")

默认情况下,由 Server.CreateObject 方法创建的对象具有页作用域。这就是说,再当前 ASP 页处理完成之后,服务器将自动破坏这些对象。如果要创建有会话或应用程序作用域的对象,可以使用 < OBJECT> 标记并设置 SESSION 或 APPLICATION 的 SCOPE 属性,也可以在对话及应用程序变量中存储该对象。如下例程 :

< % Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%> 这里需要注意的是,不能创建与内建对象同名的对象实例,否则,如下列脚本将返回错误。

< % Set Response = Server.CreateObject("Response") %>

至今为止,我们已经学习完了 ASP 所有的内建对象,不知大家是不是很兴奋?其实 ASP 是很简单的,只要大家不断的实践,相信一段时间后都不难成为 ASP 的高手。从下一篇起作者将开始介绍 ASP 内建 ActiveX 组件,这也是 ASP 运用中非常重要和实用的一部分。敬请关注。 第十二章 数据库查询语言(1)

原定计划从本篇开始就要给大家介绍 ASP 内建的 ActiveX 组件,但是考虑到我们在往后的学习中将会接触到大量的数据库查询,因此作者临时决定花一到两篇的篇幅向大家简要介绍一些数据库查询语言的基本知识,这其实也是学习 ASP 所必须掌握的一门知识。是否能够灵活地运用数据库查询语言,将直接关系到 ASP 程序的执行效率等一系列问题,所以请各位务必重视。

第 54 页 共 90 页 第54页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

相信很多朋友都听说过 SQL 这个名字,如果你是计算机方面的行家,SQL 的大名一定是如雷贯耳。(www.61k.com)那么 SQL 究竟是什么呢?SQL 一词实际上是 "Structured Query Language" 结构式查询语言的缩写,是用于对存放在计算机数据库中的数据进行组织、管理和检索的一种工具;是一种特定类型的数据库 -- 关系数据库。而控制这种数据库的计算机程序就是我们常说的 DBMS-- 数据库管理系统。譬如:SQL Server、Oracle、Sybase、DB2 等等。当用户想要检索数据库中的数据时,就通过 SQL 语言发出请求,接着 DBMS 对该 SQL 请求进行处理并检索所要求的数据,最后将其返回给用户,此过程被称作为数据库查询,这也就是数据库查询语言这一名称的由来。 SQL 并不是象 C、COBOL 和 Fortran 语言那样的完整的计算机语言。SQL 没有用于条件测试的 IF 语句,也没有用于程序分支的 Goto 语句以及循环语句 For 或 Do。确切的讲,SQL 是一种数据库子语言,SQL 语句可以被嵌入到另一种语言中,从而使其具有数据库存取功能。SQL 也非严格的结构式语言,它的句法更接近英语语句,因此易于理解,大多数 SQL 语句都是直述其意,读起来就象自然语言一样明了。SQL 还是一种交互式查询语言,允许用户直接查询存储数据,利用这一交互特性,用户可以在很短的时间内回答相当复杂的问题,而同样问题若让程序员编写相应的报表程序则可能要用几个星期甚至更长时间。

在大部分 ASP 应用程序中我们都会接触到数据库,而我们在编写 ASP 应用程序时用来进行数据库操作的标准语法正是 SQL,因此 SQL 语法的重要性是不言而喻的。下面,我们就从最常用的 SQL 语句 SELECT 着手,一步一步地来学习 SQL。

查询是 SQL 语言的核心,而用于表达 SQL 查询的 SELECT 语句则是功能最强也是最为复杂的 SQL 语句,它从数据库中检索数据,并将查询结果提供给用户。在本文中我们将建立一个名为 tianjiao 的简单数据库,该库中存放了一个叫 sales 的销售记录表,如下所示 :

姓名 性别 工资 销售目标 销售额 地区

书生 男 2500 8000 9000 上海

吴冠军 男 3000 10000 9999 北京

雷鸣 男 2000 8000 10000 四川

雪儿 女 2500 5000 6000 广州

顾一 男 2600 9000 9800 大连

阿卓 女 2000 4000 4000 天津

熠天 男 4000 20000 20000 全国

在该表中有六列即六个字段 : 姓名、性别、工资、销售目标、销售额、地区,首先我们用 Select 语句列出姓名、销售目标和销售额 :

Select 姓名,销售目标,销售额 From sales

结果如下 :

第 55 页 共 90 页 第55页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

姓名 销售目标 销售额

书生 8000 9000

吴冠军 10000 9999

雷鸣 8000 10000

雪儿 5000 6000

顾一 9000 9800

阿卓 4000 4000

熠天 20000 20000

然后,我们再列出所有男性的姓名、销售目标和销售额 :

Select 姓名,销售目标,销售额 From sales Where 性别 =" 男 " 结果如下 :

姓名 销售目标 销售额

书生 8000 9000

吴冠军 10000 9999

雷鸣 8000 10000

顾一 9000 9800

熠天 20000 20000

接下来,我们做一个相对复杂的查询,列出销售额大于销售目标的所有男性的姓名、销售目标和销售额,并且按销售目标排序。(www.61k.com)

Select 姓名,销售目标,销售额

Form sales

Where 销售额 > 销售目标

And 性别 =" 男 "

Order By 销售目标

结果如下 :

姓名 销售目标 销售额

书生 8000 9000

雷鸣 8000 10000

顾一 9000 9800

熠天 20000 20000

大家可以看到,对于简单查询,SQL Select 语句和英文语法很相象,我们来分析一下 SELECT 语句的完整格式,它包括六个子句,其中 SELECT 和 FROM 子句是必须的,其它子句可以任选,每个子句的功能如下 :

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

1、Select 子句列出所有要求 SELECT 语句检索的数据项。它放在 SELECT 语句开始处,指定此查询要检索的数据项。这些数据项通常用选择表表示,即一组用“,”隔开的选择项。按照从左到右的顺序,每个选择项产生的一个列的查询结果,一个选择项可能是以下项目:

(1)、列名:标识 FROM 子句指定表中的列。如果列名作为选择项,则 第 56 页 共 90 页 第56页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

SQL 直接从数据库表中每行取出该列的值,再将其放在查询结果的相应行中。[www.61k.com)

(2)、常数:指定在查询结果的每行中都放上该值。

(3)、SQL 表达式:说明必须将要放入查询结果中的值按表达式的规定进行计算。

2、From 子句列出包含所要查询数据的表,它由关键字 FROM 后跟一组用逗号分开的表名组成。每个表明都代表一个包括该查询要检索数据的表。这些表称为此 SQL 语句的表源,因为查询结果都源于它们。

3、Where 子句告诉 SQL 只查询某些行中的数据,这些行用搜索条件描述。

4、Group By 子句指定汇总查询,即不是对每行产生一个查询结果,而是将相似的行进行分组,再对每组产生一个汇总结果。

5、Having 子句告诉 SQL 只产生有 Group By 得到的某些组的结果,和 Where 子句一样,所需要的组也用一个搜索条件指定。

6、Order By 子句将查询结果按一列或多列中的数据排序。如果省略此子句,则查询结果将是无序的。

下面作者将提供一个简单但实用的运用 SQL 语句查询的 ASP 程序供大家参考。

为了使大家更清楚更直接地了解 SQL 语法在 ASP 中的应用,我们先将查询的所有核心过程写成一个名为 query2table 的 SUB,然后利用 ASP 的服务器端包容功能调用该 SUB。请将以下语句剪贴到记事簿,保存为 subdbtable.inc 文件,并置于虚拟目录 asptest 下 :

< %

sub query2table(inputquery)

set conntemp=server.createobject("adodb.connection")

conntemp.open "DSN=Student;uid=student;pwd=aspmagic"

set rstemp=conntemp.execute(inputquery)

howmanyfields=rstemp.fields.count -1

' 统计数据库中的列数

%>

< table border=1>< tr>

< %

for i=0 to howmanyfields

%>

< td>< b>< %=rstemp(i).name%>< /B>< /TD>

< % next %>

< /tr>

< %

第 57 页 共 90 页 第57页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

do while not rstemp.eof

%>

< tr>

< % for i = 0 to howmanyfields

thisvalue=rstemp(i)

If isnull(thisvalue) then

thisvalue="?

' 如果字段为空,则将变量 thisvalue 的值定义为一个空格

end if%>

< td valign=top>< %=thisvalue%>< /td>

< % next %>

< /tr>

< %rstemp.movenext

loop%>

< /table>

< %

rstemp.close

set rstemp=nothing

conntemp.close

set conntemp=nothingend sub%>

完成了 SUB 的定义过程,在下面几个 ASP 程序中我们只要加入想要使用的 SQL 查询语句,并调用该过程就可以非常方便的得到查询结果。[www.61k.com]将以下四段代码分别保存为 asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp 四个 .asp 文件。

< HEAD>< TITLE>asp11a.asp< /TITLE>< /HEAD>

< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where name like 'A%%'") ' 将表 publishers 中所有姓名中有字母 A 的记录查询出来

%>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> < HEAD>< TITLE>asp11b.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from titles where Year_Published > = 1998") ' 将表 titles 中所有发表年份大于或等于 1998 年的记录查询出来 %>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> 第 58 页 共 90 页 第58页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< HEAD>< TITLE>asp11c.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where amount>10000 and sex='male'")

' 将表 publishers 中所有数量大于 10000 且性别为男的记录查询出来 %>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> < HEAD>< TITLE>asp11d.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">

< %

call query2table("select * from publishers where state< > 'NY'")

'将表 publishers 中所有所在城市不为纽约的记录查询出来。[www.61k.com)

%>

< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML> 利用 subdbtable.inc 文件中的所定义的过程 query2table,你就可以非常迅速地对数据库进行查询,你所要做的只是将“conntemp.open

"DSN=Student;uid=student;pwd=aspmagic"”中的数据库名称、用户身份和密码稍加改动,并在调用 query2table 时输入想要使用的 SQL 查询语句即可。是不是很简单 ? 这就是 ASP 和 SQL 的魅力所在 !!!

今天,我们虽然用了一整篇的篇幅只学习了一个 SQL 指令,但请你相信你所获得远不同于一个 DOS 指令,SELECT 指令使得你可以非常容易地对数据库进行查询,或许在这之前你对数据库查询还一无所知,但是通过本篇的学习,你其实已经会使用 ASP 进行常用的数据库查询了,是不是很激动 ? 在下一篇中,作者将继续给大家介绍 SQL 的其它几个基本指令。在结束本文之前,作者在这里要向很多来信的朋友致歉,由于最近作者工作繁忙,实在无暇一一回答各位的问题,请见谅,我会尽量将一些常见的、发生频率较高的问题在文章中写出来,至于一些不常见的问题,我建议大家到下面这个站点提问,你将会得到及时的答复。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

www.onlinechina.net/friend/flybird/bbs/wwwboard.asp?id=1, 这是作者至今为止所见的最棒的中文 ASP 学习站点,由上海的飞鸟主持,大家务必去看看。 第十三章 数据库查询语言(2)

在本篇的开头,我要感谢一些朋友来信给我指出了前几篇文章中的错误。不知大家是否记得在第八篇中我举了一个简单的利用 Application 制作第 59 页 共 90 页 第59页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

的页面访问计数器?有位朋友来信问我,为何当他改变计数器起始变量 NumVisits 的值后对最后的记数结果没有任何作用?起初我也大惑不解,让我们来回忆一下这段源程序,如下:

< %

Dim NumVisits

NumVisits=0

Application.Lock

Application("NumVisits") = Application("NumVisits") + 1

Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

在这段程序中,如果你试图通过改变变量 NumVisits 的值来改变记数器结果,是绝对办不到的。(www.61k.com]因为用变量的值去改变 Application 的值是不可以的,这两者是不相关的。所以这里对变量的定义和赋值都是多余的。那么我们究竟应该如何来给 Application("NumVisits") 定义一个初始值呢?请看以下修正后程序:

< %

If Application("NumVisits")< 999 then

Application("NumVisits")=999

End If

Application.Lock

Application("NumVisits")=Application("NumVisits")+1

Application.Unlock

%>

欢迎光临本网页,你是本页的第 < %= Application("NumVisits") %> 位访客 !

这里的 999 就是你要设定的计数器初始值,如此一来问题就迎刃而解了。我非常感谢这位姓康的朋友给我指出了这个错误,虽然这只是一个很小的漏洞,但我们在共同学程序写程序的过程中非常需要这种严谨细致的作风,希望今后朋友们们一旦发现文中的错误即刻来信告知,我也能及时纠正,谢谢。

SQL 语言可以分为两大部分:数据定义语言和数据操纵语言,继上一篇我们学习了数据操纵语言中的 Select 语句后,今天作者要继续给大家简要介绍其余的 SQL 语句。

SQL 是一种完备的数据处理语言,不仅用于数据库查询,而且用于数据库中的数据修改和更新,与支持 SQL 查询的 Select 语句的复杂性相比较,更改数据库内容的 SQL 语句就格外简单。然而对于一个 DBMS 来说,第 60 页 共 90 页 第60页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

数据更新所造成的风险大大超出了数据查询。[www.61k.com]数据库管理系统必须在更改期内保护所存储的数据的一致性,确保有效的数据进入数据库,数据库必须保持一致性, DBMS 还必须协调多用户的并行更新,以确保用户和他们的更改不至于影响其他用户的作业。

用于修改数据库内容的 SQL 语句主要有以下三个:

1、 Insert,向一个表中加入新的数据行

2、 Delete,从一个表中删除数据行

3、 Update,更改数据库中已经存在的数据

首先我们来看看 Insert 的用法:

标准语法:

INSERT INTO table_name (col1, col2...) VALUES(value1, value2...) 下例要将书生作为一个新的销售员加入表 Salesreps 中

Insert Into Salesreps (name,num,sales,hire_date,income) values

('shusheng',9,10000,'23-Feb-99',2000)

在此语句中,列的名称列在括号中以逗号隔开,接下去是 Value 短语和括号中同样以逗号隔开的每列数据,应该注意的是数据和列名称的顺序是相同的,而且若是字符串型则以单引号隔开。从概念上来讲, Insert 语句建立的一个与表列结构相一致的数据行,用取自 Values 子句的数据来填充它,然后将该新行加入表中,表中的行是不排序的,因此不存在将该行插入到表的头或尾或两行之间的这个概念。 Insert 语句结束后,新行就是表的一部分了。

Insert 语句还可以将多行数据添加到目标表中去,在这种形式的 Insert 语句中,新行的数据值不是在语句正文中明确地指定的,而是语句中指定的一个数据库查询。添加的值来自数据库自身的行,这乍看起来似乎有些奇怪,但是在某些特定的状态下,这是非常有用的。比如,你想把 1998 年 12 月 30 日之前产生的订单编号、日期和数目从 order 表中拷贝到另一个名为 oldorder 的表中去,多行 Insert 语句为拷贝数据提供了一种紧凑而高效的方法,如下:

Insert into oldorder (Num,Date,Amount)

Select Num,Date,Amount

From order

Where Date<'30-12-98'

这条语句看起来有些复杂,其实很简单,语句标识了接收新行的表 oldorder 和接收数据的列,完全类似于单行 Insert 语句。语句的剩余部分是一个查询,它检索 order 表中的数据。 SQL 先执行对 order 表的查询,然后将查询结果逐行插入到 oldorder 表中去。

下面我们来看看 Update 的用法, Update 语句用于更新单表中选定行的一列或多列的值。要更新的目标表在语句中定义, Set 子句则指定要更第 61 页 共 90 页 第61页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

新哪些列并计算他们的值。(www.61k.com) Update 语句总是包含 Where 语句,而且 Update 语句比较危险,所以您必须明确地认识到 Where 语句的重要性, Where 语句被用来指定需要更新的行。

标准语法:

UPDATE table_name

SET columnname1 = value1

[, columname2 = value2]...

WHERE search_condition

以下是一个简单的 Update 语句的例子 :

Update customers

Set credit=100000.00,id=99

Where name='asp'

在此例中我们将表 customers 中客户名为 asp 的客户的信贷值更新为 10 万并将他的 ID 变更为 99。再看下例:

Update customers

Set credit=200000.00,state=021

Where ID in (80,90,100,120)

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

我们可以发现,其实 SQL 处理 Update 语句的过程就是逐行遍历所指定的表,更新其搜索条件结果为“真”的行,跳过其搜索条件结果为“假”或“空”的行。

最后,来看看 Delete 语句。

标准语法:

DELETE FROM tablename

WHERE condition

由于它过于简单,所以所造成的后果也是严重的,虽然其中的 Where 子句是任选的,但它几乎总是存在的,若将 Where 子句从 Delete 语句中省略掉,则目标表的所有行都将被删除。看下例:

Delete from order Where ID=99

在文章的末尾,作者在给大家简要介绍一下数据定义语言。它是用来创建和修改数据库结构的一种语句,包括 Create 和 Drop 语句。

1、 Create 语句

标准语法:

CREATE TABLE table_name

( field1 datatype [ NOT NULL ],

field2 datatype [ NOT NULL ],

field3 datatype [ NOT NULL ]...)

如:

CREATE TABLE BILLS

第 62 页 共 90 页 第62页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

( NAME CHAR(30),

AMOUNT NUMBER,

ACCOUNT_ID NUMBER)

尽管 Create Table 比前面介绍的语句难理解一些,但仍然很直观。(www.61k.com]它将 bills 赋予一个新表,并指定表中三列的名称和数据类型。表被建立后我们就可以添入数据了。如:

Insert into bills(name,amout,account_id) values('gates',100,1)

如果,你觉得不再需要保存产品信息,则可用 Drop table 语句将该表及其所包含的所有数据从数据库中删除掉。

标准语法:

DROP TABLE table_name

至此,我们已经了解了所有常用的 SQL 语句,可别小看这些貌似英文的简单语句,它们的功能十分强大,当我们编写 asp 程序时必须使用他们对数据库进行操作。从下一篇开始,作者将给大家介绍 ASP 的内建 ActiveX 组件,敬请关注。

第十四章 ActiveX 组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等,本文从本篇开始将陆续给大家介绍 ASP ActiveX 组件的使用方法。 从今天开始我们将正式学习 ASP 的精华部分 --ActiveX 组件。事实上,当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作或者对 WEB 服务器上的文件系统进行操作,亦或你需要一个 WEB 广告交换程序,所有这一切你都必须通过调用 ASP 内建的 ActiveX 组件或自己编写所需的组件来完成。

那么,究竟什么是 ActiveX 组件呢?它又是如何运作的呢?其实 ActiveX 组件是一个存在于 WEB 服务器上的文件,该文件包含执行某项或一组任务的代码,组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。例如,股票行情收报机组件可以在 Web 页上显示最新的股票报价。当你在 WEB 服务器上安装完 ASP 环境后,就可以直接使用它自带的几个常用组件,如 Database Access 组件。当然你也可以从第三方开发者处获得可选的组件 , 也可以编写自己的组件。你可以利用组件作为脚本和基于 Web 应用程序的基本构造块,只要知道如何访问组件提供的对象,即使你是位编写脚本的新手,也可以在不了解组件运作方式的情况下编写 第 63 页 共 90 页 第63页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

ASP 程序。[www.61k.com]总而言之, ActiveX 组件使您不用学习复杂的编程就能够写出强大的 WEB 服务器端脚本。如果您是位 Web 应用程序的开发者,可以使用任何支持组件对象模型(COM)的语言来编写组件,如, C、 C++、 Java 或 Visual Basic。如果你熟悉 COM 编程, ActiveX 组件就是 Automation 服务器。但是要在 Web 服务器上运行, ActiveX 组件不能有图形用户接口元素,如 Visual Basic 的 MsgBox 函数。组件是可以重复使用的。在 Web 服务器上安装了组件后,就可以从 ASP 脚本、 ISAPI 应用程序、服务器上的其他组件或由另一种 COM 兼容语言编写的程序中调用该组件。

那么我们在 ASP 中应该如何调用组件呢?如前所述,组件是包含在动态链接库 (.dll) 或可执行文件 (.exe) 中的可执行代码。组件可以提供一个或多个对象以及对象的方法和属性。要使用组件提供的对象,我们首先要创建对象的实例并将这个新的实例分配变量名。使用 ASP 的

Server.CreateObject 方法可以创建对象的实例。接着,使用脚本语言的变量分配指令为对象实例命名。创建对象实例时,必须提供实例的注册名称“PROGID”。如下要创建一个 Ad Rotator 对象的实例 :

< % Set MyAds = Server.CreateObject("MSWC.AdRotator") %>

我们必须使用 ASP 的 Server.CreateObject 方法来创建对象实例,否者 ASP 无法跟踪脚本语言中对象的使用。

使用 HTML< OBJECT> 标签同样可以创建对象实例,但必须为

RUNAT 属性提供服务器值,同时也要为将在脚本语言中使用的变量名提供 ID 属性组。使用注册名 (PROGID) 或注册号码 (CLSID) 可以识别该对象。下面的例子使用注册名 (PROGID) 创建 Ad Rotator 对象的实例:

< OBJECT RUNAT=Server ID=MyAd PROGID="MSWC.AdRotator">< /OBJECT>

下面列出了 ASP 可安装的常用组件。

Ad Rotator 创建一个 AdRotator 对象,该对象可按指定计划在同一页上自动轮换显示广告。

Browser Capabilities 创建一个 BrowserType 对象,该对象决定访问 Web 站点的每个浏览器的性能、类型及版本。

Database Access 提供用 ActiveX Data Objects (ADO) 对数据库的访问。 Content Linking 创建一个 NextLink 对象,该对象可生成 Web 页内容列表,并象书一样将各页顺续连接。

File Access 组件 提供文件的输入输出访问。

Collaboration Data Objects for NTS 组件 可以快速、简便的在 Web 页上添加收发邮件功能。该组件只适用于 Internet Information Server for Windows NT? Server 。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

MyInfo 创建一个 MyInfo 对象,该对象追踪个人信息,例如站点管理员的姓名、地址及显示选择。

第 64 页 共 90 页 第64页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Counters 创建一个 Counters 对象,该对象可以创建、保存、增加或检索任意数量的独立计数器。(www.61k.com)

Content Rotator 自动翻转 Web 主页上的 HTML 内容字符串。 Page Counter 记录并显示 Web 页被打开的次数。

现在 WEB 广告几乎充斥了整个网络,那么究竟如何在你自己的网站上建立一个符合广告领域标准功能的广告系统呢?答案是利用 ASP AD Rotator 组件 ! 它允许在每次访问 ASP 页面时在页面上显示新的广告,并且提供了很强的功能,例如 : 旋转显示在页面上的广告图象的能力、跟踪特定广告显示次数的能力以及跟踪客户端在广告上单击次数的能力。 AD Rotator 组件的工作是通过读取 AD Rotator 计划文件来完成的,该文件包括与要显示的图象文件的地点有关的信息以及每个图象的不同属性,下面就是一个标准的 AD Rotator 计划文件 :

---ADROT.TXT---

REDIRECT /scripts/adredir.asp

WIDTH 440

HEIGHT 60

BORDER 1

*

ads/homepage/chinabyte.gif

http://www.chinabyte.com/

Check out the IT site

2

ads/homepage/gamichlg.gif

-

Sponsored by Flyteworks

3

ads/homepage/asp.gif

http:// www.aspallian.com/

Good ASP site on net

3

ads/homepage/spranklg.gif

http://www.clocktower.com/

The #1 Sports site on the net

2

该段代码的前四行包含广告的全局设置。 Redirect 行指出广告将成为其热连接的 URL, 注意这里不是为广告本身指定的 URL,而是将调用的中间页面的 URL,这样我们就可以通过这个中间页面跟踪单击广告的次数。该 Redirect URL 将与包含两个参数的查询字符串一起调用 : 特定广告主第 65 页 共 90 页 第65页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

页的 URL 和图象文件的 URL。[www.61k.com]星号上面的其余三行简单说明如何显示广告。前两行以像素为单位指定网页上广告的宽度和高度,默认值是 440 和 60 个像素。后一行,同样是以像素为单位指定广告四周超链接的边框宽度 , 默认值是 1 个像素。如果将该参数设置为 0,则将没有边框。

星号下面的行以每四行为一个单位描述每个广告的细节。在此例中共有 16 行,描述四个广告。每个广告的描述包含图象文件的 URL、广告的主页 URL(如果广告客户没有主页,请在该行写上一个连字符“-”,指出该广告没有链接)和图象的替代文字以及指定该页与其他页交替显示频率的数值。 图象是重定向页面的热连接,它在查询字符串中设置了两个值,

url=/scripts/adredir.asp 以及 image=/ads/homepage/asp.gif。要确定广告显示的频率,可以将计划文件中所有广告的权值相加,在该例中总数是 10,那么 aspallian 的广告权值为 3,这意味着 AdRotator 组件每调用十次,它则显示 3 次。

重定向文件是用户创建的文件。它通常包含用来解析由 AdRotator 对象发送的查询字符串的脚本并将用户重定向到与用户所单击的广告所相关的 URL。用户也可以将脚本包含进重定向文件中,以便统计单击某一特定广告的用户的数目并将这一信息保存到服务器上的某一文件中。增加计数器和重定向用户是通过下面两行 ASP 脚本来实现的 :

< %

Counter.Increment(request.querystring("url"))

response.redirect(request.querystring("url"))

%>

现在我们看一下 Ad Rotator 组件是如何在页面中使用的,首先必须使用 Server.CreateObject 方法实例化 Ad Rotator 对象。 Ad Rotator 组件的 PROGID 属性是 MSWC.AdRotator。完整的代码如下 :

< % Set ad = Server.CreateObject("MSWC.AdRotator") %>

< %= ad.GetAdvertisement("/ads/adrot.txt") %>

Ad Rotator 组件支持的唯一方法是 GetAdvertisement,它只有一个参数 :AdRotator 计划文件的名称。注意指向文件的路径是从当前虚拟目录的相对路径,物理路径是不允许的。 GetAdvertisement 方法从 Rotator 计划文件中获取下一个计划广告的详细说明并将其格式化为 HTML 格式。下面的 HTML 由 GetAdvertisement 方法生成且被添加到网页的输出中,以便显示 Rotator 计划文件中的下一个广告。

< A

HREF="http://www.chinabyte.com/scripts/adredir.asp?http://www.aspallian.com/">< IMG

SRC="http://www.chinabyte.com/ads/homepage/asp.gif" ALT="Good ASP site on net" WIDTH=440 HEIGHT=60 BORDER=1>< /A>

第 66 页 共 90 页 第66页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

使用 AdRotator 组件我们可以直接通过对象属性而不是计划文件中的设置来直接控制某些广告特性,其可用属性如下 :

Border 指定广告边框的大小。[www.61k.com)

Clickable 指定广告是否为超链接。

TargetFrame 指定显示广告的框架的名称。

< %

Set ad = Server.CreateObject("MSWC.AdRotator")

ad.Border = 0

ad.Clickable = true

ad.TargetFrame = AdFrame

ad.GetAdvertisement("/ads/adrot.txt")

%>

通过上面的学习,相信你已经能够熟练运用 ASP 的内建 AdRotator 组件为自己的网站建立一个标准的广告显示程序了。你是否难以相信一切竟是如此的简单?其实真正能令你震惊的还在后头呢,敬请关注下一篇 ASP ActiveX 组件大揭密!

第十五章 常用的ASP ActiveX组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等,继上篇介绍了 AD Rotator 组件后,本篇将接着给大家介绍其它一些常用的 ASP ActiveX 组件的使用方法。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

最近仍有不少朋友来信问我, ASP 是否只能在 Microsoft IIS 上运行,是否可以在非 NT 平台上运作?本来这个问题我已经回答过很多遍了 : 我只是听说过有某种可以支持的软件,却从没见过。但一些热情的朋友仍然孜孜不倦地来信询问,于是在朋友们的盛情之下,我访遍了 ASP 相关站点,竟惊奇的发现,原来 ASP 的确是可以运行在其它非 NT 平台上的,因此在本篇的开头,我就给来信的朋友们简要介绍一下如何在非 NT 平台上使用 ASP。

要在非 NT 平台上开发并运行 ASP 应用程序我们可以依赖于一套名为 Instant ASP 的第三方软件,它的广告标语非常吸引人“ASP Anytime, Anywhere”,我想所有 ASP 的开发者们看到如此的标语必然兴奋不已。这套由 Halcyon 软件公司开发的软件使得你无需重复开发原有 ASP 应用程序即可以将它运行在任何操作平台上 ! 这样非但节省了大量的开发时间,而且使得 ASP 真正成为了一种跨平台的 Internet、 Intranet 或 Extranet 应第 67 页 共 90 页 第67页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

用程序。(www.61k.com] Instant ASP 本身其实是一套基于 Java 的应用程序,因此通过它你可以将基于 WEB 的 ASP 应用程序运行在任何平台上,下表列出了 Instant ASP 目前版本所支持的操作平台。

更令人吃惊的是 Instant ASP 不仅提供了 ASP 的运作环境,而且它较目前市场上的 ASP 应用还提供了更为强大和实用的功能,它将 ActiveX 组件和 Enterprise Java Beans 或者 CORBA-compliant objects 组合起来,从而使 ASP 有了更为广泛的应用。它同样提供了通过 ADO 接口访问连接各种数据库,并生成动态页面的强大功能。对于开发者而言可以使用自己擅长的编程语言或工具如 :Visual Basic, JScript, VBScript, C++, Java, HTML,

Delphi , MS Visual InterDev 等等来进行开发。关于 Instant ASP 具体安装和操作我就不在这里展开了,有兴趣的朋友可以到它的站点上去看看 halcyonsoft.com,你还可以免费下载一个试用版试试。

继上一篇中作者给大家介绍了 AD Rotator 组件的使用方法后,今天我们接着来看看其它的一些 ASP 常用组件。

一、 Database Access 组件

我们在 WEB 服务器上运用 WEB应用程序进行的最常见和最实用的任务就是访问服务器端的数据库。而

ASP 内建的 Database Access 组件使得我们能够轻而易举地通过 ActiveX Data Objects (ADO) 访问存储在服务器端的数据库或其他表格化数据结构中的信息。

ADO 是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到你的 Active Server 页面上。可以使用 ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源,这样 ASP 程序员就可以访问任何与

ODBC 兼容的数据库,包括 MS SQL SERVER、Access、Oracle 等等。如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现 ADO 命令语句并不复杂而且容易掌握。同样地,如果您是一个经验丰富的数据库编程人员,您将会正确认识 ADO 的先进的与语言无关性和查询处理功能。熟悉 VB 数据库编程的朋友会发现 ADO 与RDO (Remote Data Objects) 有某种类似的地方。但据说 ADO 的访问的速度更快,内存需要更小。 下面给大家简要介绍一下利用 ASP 的 Database Access 组件通过 ADO 连接并操作 WEB 数据库的步骤

第一步 : 指定想要连接的数据库,有 DSN 和 DSN-less 两种方法。 DSN(Data Source Name 数据源名称 ): 建立一个系统数据源名称,方法如下 :

1、单击“开始”,选设置控制面板。

2、双击图标“32 位 ODBC” , 将弹出一个对话框,选标签“System DSN” 第 68 页 共 90 页 第68页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

3、单击“Add”添加一个 DSN 入口 , 选择如“Microsoft Access Drive”并确认。[www.61k.com)

4、在“Data Source Name”栏里输入你希望指定的 DSN, 然后单击“Select”选择数据库存放位置,你可以按“Browse”来选取。

5、以上步骤完成后在 ASP 程序中指定 DSN,如下 :

< %connstr = "DSN"%>

DSN-less:

是另一种通过在 ASP 文件里直接指定数据库文件所在位置,而无需建立 DSN 的方法。由于许多公司没有自己的 WEB 服务器,他们的网站往往是存放在远端的虚拟服务器上,因此要建立和修改 DSN 的设置比较麻烦。而使用 DSN-less 方法直接指定远端数据库所在位置恰恰解决了这一问题,方法如下 :

< %

connstr =

"DBQ="+server.mappath("database/source.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver

(*.mdb)};DriverId=25;FIL=MSAccess;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;

PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;" %>

在指定了想要连接的数据库后,就可以通过以下方法连接并打开数据库 :

< %

Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open constr %>

第二步 : 指定想要执行的 SQL 指令,可以使用 RecordSet。

当连接了数据库后就可以对数据库进行操作,比如查询、删除、更新等等,这些操作都是通过 SQL 指令来完成的,如下例在数据库表 datebase 中查询所有姓名中有“A”的记录 :

< %

sql="select * from datebase where name like 'A%%'"

Set rs = Conn.Execute(sql)

%>

尽管 Connection 对象简化了连接数据库和查询任务,但 Connection 对象仍有许多不足。确切地说,检索和显示数据库信息的 Connection 对象不能用于创建脚本,您必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。对于检索数据、检查结果、更改数据库, ADO 提供了

Recordset 对象。正如它的名称所暗示的那样, Recordset 对象有许多您可第 69 页 共 90 页 第69页

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

以使用的特性,根据您的查询限制,检索并且显示一组数据库行,即记录。[www.61k.com] Recordset 对象保持查询返回的记录的位置,允许您一次一项逐步扫描结果。根据 Recordset 对象的指针类型属性设置,您可以滚动和更新记录。数据库指针可以让您在一组记录中定位到特定的项。指针还用于检索和检查记录,然后在这些记录的基础上执行操作。

Recordset 对象有一些属性,可用于精确地控制指针的行为,提高您检查和更新结果的能力。

Recordset 的使用方法如下 :

Set rs = Server.CreateObject("ADODB.Recordset")

rs.Open SQL 指令 , Conn, 1, 1 ' 读取

rs.Open SQL 指令 , Conn, 1, 3 ' 新增、修改、或删除

第三步 : 使用 RecordSet 属性和方法,并显示执行的结果。

通过以上指令,我们创建了一个包含数据的游标 (RecordSet)“rs”,事实上游标是存储在活动内存中的类似记录和字段的数组的东西,当通过

RecordSet 组件创建一个游标时,它从数据提供者的得到一个数据集,并用它来充实游标,我们可以想象 ADO 产生的 RecordSet 是一个象电子表格的记录,它有一行行的记录,在任何时候都有一行是它的当前行,而

RecordSet 的字段是用 RecordSet 的Field 集合表示的。下面列出了所创建的 RecordSet 对象 (游标 )的一些属性和方法 :

rs.Fields.Count: RecordSet 对象的字段总数。

rs(i).Name: 第 i 个字段的名称, i 由 0 算起到 rs.Fields.Count-1。 rs(i): 读取第 i 个字段的数据, i 由 0 算起到 rs.Fields.Count-1。 rs(" 字段名称 "): 读取指定字段的数据。

rs.RecordCount: 游标中的数据记录总数。

rs.EOF: 是否已指到最后一条记录。

rs.MoveNext: 将指标移到下一笔记录。

rs.MovePrev: 将指标移到上一笔记录。

rs.MoveFirst: 将指标移到第一笔记录。

rs.MoveLast: 将指标移到最后一笔记录。

rs.Close: 关闭 RecordSet 对象

有关 ADO 的其他介绍,作者将在今后给大家详细讲解。

二、 Content Linking 组件

如果你的网站有一系列相互关联的页面的话, Content Linking 组件将非常适合你的需求,它非但可以使你在这些页面中建立一个目录表,而且还可以在它们中间建立动态连接,并自动生成和更新目录表及先前和后续的 Web 页的导航链接。这对于列出联机报刊、电子读物网站以及论坛邮件是十分理想的选择。

第 70 页 共 90 页 第70页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Content Linking 组件创建管理 URL 列表的 Nextlink 对象,要使用 Content Linking 组件,必须需要先创建 Content Linking List 文件。(www.61k.com) Content Linking 组件正是通过读取这个文件来获得处理我们希望链接的所有页面的信息。事实上该文件是一个纯文本文件,其内容如下 :

page1.htm one

page2.htm two

page3.htm three

page4.htm four

page5.htm five

page6.htm six

这个文本文件的每行有如下形式 :

url description comment

其中, URL 是与页面相关的超链地址, description 提供了能被超链使用的文本信息, comment 则包含了不被 Content Linking 组件解释的注释信息,它的作用如同程序中的注释。 description 和 comment 参数是可选的。

下面我们来看看如何具体使用 Content Linking 组件 :

< html>

< head>

< meta http-equiv="Content-Type" content="text/html; charset=gb2312"> < title> 网络电子读物宝藏 < /title>

< /head>

< body>

< p> 网络电子读物导航

< %

Set Link = Server.CreateObject("MSWC.NextLink")

count = Link.GetListCount("nextlink.txt")

Dim I

For I=1 to count

%>

< ul>< li>< a href="< %= Link.GetNthURL("nextlink.txt", I) %>">< %= Link.GetNthDescription("nextlink.txt", I) %>< /a>

< % Next %>

< /body>

< /html>

在以上代码中,我们先用 GetListCount 方法确定在文件 nextlink.txt 中有多少条项目,然后利用循环语句,并使用 GetNthURL、 GetNthDescription 方法逐一将存储在 nextlink.txt 文件中的内容读出并显示给客户端浏览器。 第 71 页 共 90 页 第71页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

下面列出了 Content Linking 组件所有可使用的方法 GetListCount(file) 统计内容链接列表文件中链接的项目数。[www.61k.com)

GetNextURL(file) 获取内容链接列表文件中所列的下一页的 URL。 GetPreviousDescription(file) 获取内容链接列表文件中所列的上一页的说明行。

GetListIndex(file) 获取内容链接列表文件中当前页的索引。

GetNthDescription(file,index) 获取内容链接列表文件中所列的第 N 页的说明。

GetPreviousUR(file) 获取内容链接列表文件中所列的上一页的 URL。 GetNextDescription(file) 获取内容链接列表文件中所列的下一页的说明。

GetNthURL(file,index) 获取内容链接列表文件中所列的第 N 页的说明。

在我们创建了网站的总导航页面后,我们当然还希望在每一页中添加一个“上一页”、“下一页”的导航超链,下面我们就来看看如何实现导航超链。 由于考虑到你的网站可能包含了上千或更多的页面,所以我们不可能在每一个页面中都编写实现导航超链的 ASP 代码。因此,我们必须利用前几篇中所学到的服务器端包容 SSI,这样就避免了大量的重复作业,请看下例 :

< !--#include file="nextprev.inc"-->

只要将这端代码放在每个页面中即可。 nextprev.inc 文件的内容如下 : < %

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

Set Link = Server.CreateObject("MSWC.NextLink")

count = Link.GetListCount("nextlink.txt")

current = link.GetListIndex("nextlink.txt")

If current > 1 Then

%>

< a href="< %= Link.GetPreviousURL("nextlink.txt") %>"> 上一页 < /a> < %

End If

If current < count Then

%>

< a href="< %= Link.GetNextURL("nextlink.txt") %>"> 下一页 < /a> < % End If %>

今天的学习又到此结束了,在这里我要再次感谢所有关心我的文章的朋友们,你们的来信给了我很大的鼓舞,不过请大家不要再称我为“老师”,其实我也和你们一样是在不断的学习和摸索中,有问题我们可以一起探讨,我的文章中肯定还存在很多不足或漏洞,也希望大家发现后能及时向我提第 72 页 共 90 页 第72页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

出。(www.61k.com]由于近来 ASP 已经在国内的网站中广泛运用起来,所以应朋友们的要求,在国内 ASP 高手飞鸟的热情帮助下,我决定写一些 ASP 应用实例作为现在这篇文章的姊妹篇,这样也就可以为大家提供一些真正实用的东西了,敬请关注。

第十六章 其它的ASP常用组件

当你用 ASP 编写服务器端应用程序时,必须依靠 ActiveX 组件来强大 Web 应用程序的功能,譬如:你需要连接数据库,对数据库进行在线操作等等。

上两篇中作者给大家介绍了 AD Rotator、 Database Access 等组件的使用方法,今天我们接着来看看其它的一些 ASP 常用组件。

一、 Browser Capabilities 组件众所周知,并不是所有浏览器都支持现今 Internet 技术的方方面面。有一些特性,某些浏览器支持而另一些浏览器却不支持,如 : ActiveX 控件、影像流、动态 HTML、 Flash 以及脚本程序等。使用 ASP 的 Browser Capabilities 组件,就能够设计“智能”的 Web 页,以适合浏览器性能的格式呈现内容。 Browser Capabilities 组件能够创建一个 BrowserType 对象,该对象提供带有客户端网络浏览器的功能说明的用户脚本。该组件之所以能识别客户浏览器的版本等信息,主要是因为当客户浏览器向服务器发送页面请求时,会自动发送一个 User Agent HTTP 标题,该标题是一个声明浏览器及其版本的 ASCII 字符串。 Browser Capabilities 组件将 User Agent 映射到在文件 Browscap.ini 中所注明的浏览器 , 并通过 BrowserType 对象的属性来识别客户浏览器。若该对象在 browscap.ini 文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项且 browscap.ini 文件中也未指定默认的浏览器设置,则它将每个属性都设为字符串 "UNKNOWN"。在默认情况下,browscap.ini 文件被存放在 WINDOWS\SYSTEM\INERSRV(如果是

95/98+PWS4) 或 NT\SYSTEM32\INERSRV( 如果是 NT) 目录中,你可以自己编辑这个文本文件,以添加自己的属性或者根据最新发布的浏览器版本的更新文件来修改该文件。请看以下 checkCookie() 过程,使用 BrowserCap 对象的 Cookie 属性来判断客户端浏览器是否支持 Cookie,并返回信息 : < %

Sub checkCookie()

Set BrowserCap=Server.CreateObject("MSWC.BrowserType")

if BrowserCap.Cookie=True then

response.write "你的浏览器支持 Cookie!"

第 73 页 共 90 页 第73页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

else

response.write "对不起,你所使用的浏览器不支持 Cookie!"

end if

end Sub

%>

有关 Browser Capabilities 组件的详细信息,请参见动态网站设计十八般武艺 --ASP 篇 (2)。[www.61k.com)

二、 File Access 组件如果你的网龄足够大的话,你一定见过“恐龙时代”的 CGI 留言簿,那是 WEB 留言簿最早的雏形。那时候在基于 Internet 的 WEB 应用程序中连接服务器后端数据库还十分困难,因此留言簿中的历史信息并不是同如今一样存储在后端数据库中。那么这些数据究竟是保存在哪里的呢?答案就是“文本文件”, CGI 程序可以将从客户端接收的信息写进一个存放在服务器端的文本文件中,该文件可以是 HTML 文件或 TXT 等文件,这样就使得程序员们可以不通过同数据库连接就可以将客户信息保存下来,但是写此类 CGI 程序甚是烦琐,下面列出了一个此类程序的最简单的样本 :

#!/usr/local/bin/perl

# Perl Location one your server

print "Content-type: text/plain\n\n";

if($ENV{'REQUEST_METHOD'}eq"POST"){

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});

}elsif($ENV{'REQUEST_METHOD'}eq"GET"){

$buffer=$ENV{'QUERY_STIRNG'};

}

@pairs=split(/&/,$buffer);

foreach $pair(@pairs){

($name,$value)=split(/=/,$pair);

$value=~tr/+//;

$value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg;

$FORM{$name}=$value;}

$file_name="guestbook.txt";#File name

#具体内容

open(FILE,">>$file_name")||die "打开文件错误";

print FILE "记录时间":$date \n\n";

print FILE "姓名":$FORM{'name'}";

print FILE "单位":$FORM{'company'}\n";

print FILE "电话":$FORM{'phone'}

print FILE "地址":$FORM{'address'}\n";

第 74 页 共 90 页 第74页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

print FILE "邮编":$FORM{'zip'}

print FILE "邮件地址":$FORM{'email'}\n";

print FILE "返回意见":$FORM{'content'}

close (FILE)

大家可以感觉到,与 ASP 相比此类 CGI 程序的可读性和易操作性都较差。[www.61k.com)那么你一定想问 ASP 是否也能直接在服务器上写文件呢?答案当然是肯定的。但是聪明的朋友可能会想到,既然 ASP 同 WEB 数据库的连接如此便捷,我们又何需再将客户信息写在文本文件中呢, ASP 的这个功能岂不是画蛇添足?的确,对于那些我们常见的留言簿、 BBS 等 WEB 应用程序而言,无论是在程序的执行效率还是易用性上,我们都不可能再用写文本文件来替代数据库,但是在某些 WEB 应用领域里写文本文件既是一种规范也是一种相对数据库而较便捷的方法。如果你对 NT 较熟悉的话,你一定知道 NT 具有非常强大的安全机制,它可以将几乎所有的服务器操作和连接的信息自动保存在一个后缀名为 .log 的文件中,其实这种技术也完全可以被运用在 WEB 上,用来记录一些的客户登陆信息。下面的这段程序正是利用 ASP 读写文本文件的特性,在一个 WEB BBS 程序中创建自动记录每个用户发言记录的功能。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

< %

Set fs = CreateObject("Scripting.FileSystemObject")

ForReading = 1

'以只读模式打开文件。不能对此文件进行写操作。

ForAppending = 8

'打开文件并在文件末尾进行写操作。

TristateUseDefault = -2

TristateTrue = -1

TristateFalse = 0

'-----------写入系统log开始--------

servermap=server.MapPath("\bbs\log\")

'映射系统物理路径

temp=servermap&"\"&year(date)&month(date)&"\"

'获取系统物理路径和时间,并以此作为log文件存放的物理路径

if Not fs.FolderExists(temp) then

fs.CreateFolder(temp)

end if

'检测是否存在文件夹,否则自动创建

dim syslog

dim tempname

tempname=date

第 75 页 共 90 页 第75页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

syslog=temp&tempname&".log"

'文件名为e:\bbs\log\月份\月日.log

li=user&"&"&Now&"&"&Request.ServerVariables("REMOTE_ADDR")&"&"&tempfile&"&"&letter&"&"&title

'log文件记录的格式为:用户名&发信时间&用户ip&文件路径&信区&信件标题

if fs.FileExists(syslog) then

Set ss = fs.OpenTextFile(syslog,ForAppending,true)

else

set ss = fs.CreateTextFile(syslog,ForWriting,false)

end if

'检测log文件是否存在,如果存在则追加文件内容,反之则直接写文件 ss.WriteLine(li)

ss.Close

'-----------log文件写入结束---------

%>

如果你没有完全看懂上面的这段程序,就请听作者慢慢道来。[www.61k.com] File Access 组件提供了可用来访问计算机文件系统的方法和属性。我们可以使用 File Access 组件创建 FileSystemObject 对象,以上程序的第一句就是利用 File Access 组件创建了一个名为 fs 的对象实例。在对象被创建后,你可以通过它访问文件,该对象没有属性,它唯一的意义就是创建、打开或读写文本文件。 FileSystemObject 对象有两种最常用的方法,一种用来创建文件,另一种是用来打开并读写文本文件。 CreateTextFile 方法获得你指定的文件名并创建该文件,它返回一个 TextStream 对象,你可以用该对象在文件被创建后操作该文件, CreateTextFile 方法的语法如下 :

Set objTextStream= FileSystemObject.CreateTextFile (Filename,

[Overwrite] , [Unicode])

下面作者给大家解释一下 CreateTextFile 方法的参数

1、 Filename 包含文件路径名的字符串,可以是文件的全路径名,包括驱动器名和目录名,或者也可以只是文件名,如果只包含文件名的话,文件将被创建在站点的根目录下。

2、 Overwrite 布尔量,设置成 False 时可以防止 FileSystemObject 对象在创建一个新文件时删除已存在的文件,该参数是可选的,如果没有赋值系统默认为 true,具有相同文件名的已有文件会被删掉。

3、 Unicode 可选参数。布尔值指明是否以 Unicode 或 ASCII 文件格式创建文件。如果以 Unicode 文件格式创建文件,则该值为 True;如果以 ASCII 文件格式创建文件,则该值为 False。如果省略此部分,则假定创建 ASCII 文件。

第 76 页 共 90 页 第76页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

在前面的程序中我们用 set ss=fs.CreateTextFile(syslog,ForWriting,false) 来在 log 文件不存在的情况下创建文件并对文件进行写操作,这里的“ForWriting”表示写文件。(www.61k.com]

与 CreateTextFile 方法不同, OpenTextFile 方法用来获得你指定的文件名并打开该文件,利用它所带的参数我们可以对文件进行各种不同的操作,和 CreateTextFile 方法一样, OpenTextFile 方法返回一个 TextStream 对象,使得你可以在文件被打开后操作该文件。 OpenTextFile 方法的语法如下 :

Set objTextStream=FileSystemObject.OpenTextFile (Filename,

[IOmode],[Create],[Format])

参数说明如下 :

1、 Filename 必须的变量,同 CreateTextFile 的 filename

2、 IOmode 可选的常量,取值为下列两个常数之一 ForReading 或 ForAppending,如果 mode 为 1,文件以只读方式打开,如果为 8,则文件以追加的方式打开。

3、 Create 可选的布尔量,指定如果你想打开的文件不存在是做什么操作,如果其值为 True,当文件不存在时就自动创建一个空的文件。如果为 False,就会在文件没找到时产生一个出错信息,其默认值是 False,建议将其设为 True,以避免在打开文件时检查是否出错。

4、 Format 可选值,可以选择三种 Tristate 值分别指定文件的格式, -2、 -1、和 0 分别对应于系统缺省、 unicode 和 ASCII。

在打开或创建了文本文件后,就得到一个 TextStream 对象,该对象有一个光标,就好象是在字处理程序中的光标一样,指出接下来要敲入的字符将出现的位置,它同时也指出你要读取的字符的位置。不能通过 CreatObject 来创建一个 TextStream 对象,得到 TextStream 对象的唯一方法是如前所述的用 FileSystemObject 对象打开一个存在的文本文件或者创建一个新的文件。

下面列出了 TextStream 对象的属性和方法

TextStream.AtEndOfLine 只读布尔量,当光标在当前行的末尾时,其值为 true,反之则为 false

TextStream.AtEndOfStream 只读布尔量,如果光标在流的末尾时,其值为 true,否则为 false

TextStream.Column 只读的整数,统计从行首到当前光标位置之间的字符数

TextStream.Line 只读的整数,指明光标所在行在整个文件中的行号 TextStream.close() 关闭流以及对应的文本文件

TextStream.read(Num) 指定从光标的当前位置开始从文本文件中读取一定数目的字符

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

第 77 页 共 90 页 第77页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

TextStream.readall() 将整个流读入一个字符串中

TextStream.readline() 将一整行的字符读入一个字符串中

TextStream.write(text) 将一个字符串写入流中

TextStream.writeline() 将一个文本串写入流中

TextStream.skip(Num) 在流中,将光标的位置移动一定数目的字符串长度

TextStream.skiplines() 在流中,将光标移动一定数目的行数

TextStream.writeblank 将一定数目的空行写入流中

lines(num)

相信大家现在已经可以感觉到 ASP File Access 组件的强大功能了,其实它远不仅仅可以写一些 log 文件,通过它你甚至可以毫不费力的远程自动更新你的网站,你只要把固定格式的文本文件传送到远端的服务器上,通过 File Access 组件读取文件,并自动生成全新 HTML 页面即可,而不必再辛辛苦苦地一个一个地更新 HTML 文件。[www.61k.com]如果你有兴趣,你完全可以用 ASP 的 File Access 组件写一个自己的全自动 HTML 生成器,充分享受维护网站的超前轻松感。

第十七章 ADO 存取数据库时如何分页显示

什么是 ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一定数目的帖子数,譬如 20 条。想不想了解如何实现分页显示?请看本文!

《动态网站设计十八般武艺 --ASP 篇》一文从第一期至今已和朋友们一起度过了大半个年头,相信通过在这一段时间中的学习、实践到再学习、再实践,大家已经能够熟练运用 ASP 的内建对象、 ActiveX 组件去编写一些基本的 ASP 应用程序。从我收到的朋友们的来信中可以明显的感觉到,大家的 ASP 功力正不断地提升。最近很多朋友来信希望我写一些 ASP 在现实运用中的实例。因此,从本期开始我决定将《动态网站设计十八般武艺 --ASP 篇》的定位从介绍和学习 ASP 基础知识转向到 ASP 实际运行的探讨和深化。应朋友们的要求,在本期中我将给大家着重谈一谈“ADO 存取数据库时如何分页显示”的问题。

什么是 ADO 存取数据库时的分页显示?如果你使用过目前众多网站上的电子公告板程序的话,那你应该会知道电子公告板程序为了提高页面的读取速度,一般不会将所有的帖子全部在一页中罗列出来,而是将其分成多第 78 页 共 90 页 第78页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

页显示,每页显示一定数目的帖子数,譬如 20 条。(www.61k.com]这就是数据库查询的分页显示,如果你还不明白,去看看 yahoo 等搜索引擎的查询结果就会明白了。

那么究竟如何才能做到将数据库的查询结果分页显示呢?其实方法有很多,但主要有两种:

一、将数据库中所有符合查询条件的记录一次性的都读入 recordset 中,存放在内存中,然后通过 ADO Recordset 对象所提供的几个专门支持分页处理的属性: PageSize( 页大小 )、 PageCount( 页数目 ) 以及 AbsolutePage( 绝对页 ) 来管理分页处理。

二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。

两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。

我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过 100 个的客户在线查询,那么 ASP 应用程序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的 ASP 程序编写相对第二种方法要简单明了得多。

在这里作者就以我们常见的 ASP BBS 程序为例,来给大家分析一下如何在 BBS 程序里实现分页显示功能,由于我们一般使用的 BBS 程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。

进行 ADO 存取数据库时的分页显示,其实就是对 Recordset 的记录进行操作。所以我们首先必须了解 Reordset 对象的属性和方法: BOF 属性:目前指标指到 RecordSet 的第一笔。

EOF 属性:目前指标指到 RecordSet 的最后一笔。

Move 方法:移动指标到 RecordSet 中的某一条记录。

AbsolutePage 属性:设定当前记录的位置是位于哪一页

AbsolutePosition 属性:目前指标在 RecordSet 中的位置。

PageCount 属性:显示 Recordset 对象包括多少“页”的数据。 PageSize 属性:显示 Recordset 对象每一页显示的记录数。 RecordCount 属性:显示 Recordset 对象记录的总数。

下面让我们来详细认识一下这些重要的属性和方法

一、 BOF 与 EOF 属性

第 79 页 共 90 页 第79页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

通常我们在 ASP 程序中编写代码来检验 BOF 与 EOF 属性,从而得知目前指标所指向的 RecordSet 的位置,使用 BOF 与 EOF 属性,可以得知一个 Recordset 对象是否包含有记录或者得知移动记录行是否已经超出该 Recordset 对象的范围。[www.61k.com]

如: < % if not rs.eof then ... %>

< % if not (rs.bof and rs.eof) %>

若当前记录的位置是在一个 Recordset 对象第一行记录之前时, BOF 属性返回 true,反之则返回 false。

若当前记录的位置是在一个 Recordset 对象最后一行记录之后时, EOF 属性返回 true,反之则返回 false。

BOF 与 EOF 都为 False:表示指标位于 RecordSet 的当中。 BOF 为 True:目前指标指到 RecordSet 的第一笔记录。 EOF 为 True:目前指标指到 RecordSet 的最后一笔记录。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

BOF 与 EOF 都为 True:在 RecordSet 里没有任何记录。

二、 Move 方法

您可以用 Move 方法移动指标到 RecordSet 中的某一笔记录,语法如下:

rs.Move NumRecords,Start

这里的“rs”为一个对象变量,表示一个想要移动当当前记录位置的 Recordset 对象;“NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;“start”是一个可选的项目,用来指定记录起始的标签。

所有的 Recordset 对象都支持 Move 方法,如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动;如果一个空的 Recordset 对象调用 Move 方法,将会产生一个错误。

MoveFirst 方法:将当前记录位置移至第一笔记录。

MoveLast 方法:将当前记录位置移至最后一笔记录。

MoveNext 方法:将当前记录位置移至下一笔记录。 MovePrevious 方法:将当前记录位置移至上一笔记录。

Move [n] 方法:移动指标到第 n 笔记录, n 由 0 算起。

三、 AbsolutePage 属性

AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。

与 AbsolutePosition 属性相同, AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录, AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。

第 80 页 共 90 页 第80页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

四、 AbsolutePosition 属性

若您需要确定目前指标在 RecordSet 中的位置,您可以用

AbsolutePosition 属性。(www.61k.com]

AbsolutePosition 属性的数值为目前指标相对於第一笔的位置,由 1 算起,即第一笔的 AbsolutePosition 为 1。

注意 , 在存取 RecordSet 时,无法保证 RecordSet 每次都以同样的顺序出现。

若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ), asp 码如下:

rs2.CursorLocation = 3

五、 PageCount 属性

使用 PageCount 属性,决定 Recordset 对象包括多少“页”的数据。这里的“页”是数据记录的集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。

六、 PageSize 属性

PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。

七、 RecordCount 属性

这也是一个非常常用和重要的属性,我们常用 RecordCount 属性来找出一个 Recordset 对象包括多少条记录。如: < % totle=RS.RecordCount %> 在了解了 Recordset 对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过

RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀,下面让我们来看看程序该如何实现呢?

我们建立这样一个简单的 BBS 应用程序,它的数据库中分别有以下五个字段:“ID”,每个帖子的自动编号;“subject”,每个帖子的主题;“name”,加帖用户的姓名;“email”,用户的电子邮件地址;“postdate”,加帖的时间。数据库的 DSN 为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中,方便调用。程序如下:

'----BBS 显示帖子分页----

< % Sub ShowList() %>

< %

PgSz=20 '设定开关,指定每一页所显示的帖子数目,默认为20帖一页 第 81 页 共 90 页 第81页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Set Conn = Server.CreateObject("ADODB.Connection")

Set RS = Server.CreateObject("ADODB.RecordSet")

sql = "SELECT * FROM message order by ID DESC"

'查询所有帖子,并按帖子的ID倒序排列

Conn.Open "bbs"

RS.open sql,Conn,1,1

If RS.RecordCount=0 then

response.write "< P>< center>对不起,数据库中没有相关信息!< /center>< /P>"

else

RS.PageSize = Cint(PgSz) '设定PageSize属性的值

Total=INT(RS.recordcount / PgSz * -1)*-1 '计算可显示页面的总数 PageNo=Request("pageno")

if PageNo="" Then

PageNo = 1

else

PageNo=PageNo+1

PageNo=PageNo-1

end if

ScrollAction = Request("ScrollAction")

if ScrollAction = " 上一页 " Then

PageNo=PageNo-1

end if

if ScrollAction = " 下一页 " Then

PageNo=PageNo+1

end if

if PageNo < 1 Then

PageNo = 1

end if

n=1

RS.AbsolutePage = PageNo

Response.Write "< CENTER>"

position=RS.PageSize*PageNo

pagebegin=position-RS.PageSize+1

if position < RS.RecordCount then

pagend=position

else

pagend= RS.RecordCount

第 82 页 共 90 页 第82页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

end if

Response.Write "< P>< font color='Navy'>< B>数据库查询结果:< /B>" Response.Write "(共有"&RS.RecordCount &"条符合条件的信息,显示"&pagebegin&"-"&pagend&")< /font>< /p>"

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

Response.Write "< TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF>"

Response.Write "< TR BGCOLOR=#5FB5E2>< FONT SIZE=2>< TD>< B>主题< /B>< /TD>< TD>< B>用户< /B>< /TD>< TD>< B>Email< /B>< /TD>< TD>< B>发布日期< /B>< /TD>< /FONT>< TR BGCOLOR=#FFFFFF>" Do while not (RS is nothing)

RowCount = RS.PageSize

Do While Not RS.EOF and rowcount > 0

If n=1 then

Response.Write "< TR BGCOLOR=#FFFFFF>"

ELSE

Response.Write "< TR BGCOLOR=#EEEEEE>"

End If

n=1-n %>

< TD>< span style="font-size:9pt">< A href='view.asp?key=< %

=RS("ID")%>'>< % =RS("subject")%>< /A>< /span>< /td>

< TD>< span style="font-size:9pt">< % =RS("name")%>< /A>< /span>< /td> < TD>< span style="font-size:9pt">< a href="mailto:< % =RS("email")%>">< % =RS("email")%>< /a>< /span> < /TD>

< TD>< span style="font-size:9pt">< % =RS("postdate")%>< /span> < /td> < /TR>

< %

RowCount = RowCount - 1

RS.MoveNext

Loop

set RS = RS.NextRecordSet

Loop

Conn.Close

set rs = nothing

set Conn = nothing

%>

< /TABLE>

< FORM METHOD=GET ACTION="list.asp">

< INPUT TYPE="HIDDEN" NAME="pageno" VALUE="< % =PageNo %>"> 第 83 页 共 90 页 第83页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

< %

if PageNo > 1 Then

response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE=' 上一页 '>"

end if

if RowCount = 0 and PageNo < >Total then

response.write "< INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE=' 下一页 '>"

end if

response.write "< /FORM>"

End if

%>

< % End Sub %>

相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。(www.61k.com)值得注意的是在这段程序中运用了一个小技巧 < INPUT

TYPE="HIDDEN" NAME="pageno" VALUE="< % =PageNo %>">,这是用来在每次调用该 ASP 文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form 来传递数据将会达到更好的效果。

好了,又到了说再见的时候了,如果你没完全看懂本篇中所列的程序,那你必须加把油,看一看 VbScript 的语法;如果你还有某些疑问,可以“妹儿”我,我将尽力解答;如果你有什么更好的建议也千万要来信告诉我哦 :) 第十八章 堵住ASP漏洞

无论你相不相信,通过 asp,可能可以很方便地入侵 web server、窃取服务器上的文件、捕获 web 数据库等系统的用户口令,甚至恶意删除服务器上的的文件,直至造成系统损坏,这些都决非耸人听闻,而且都确确实实发生过,本文将向你一一揭示这些 asp 存在的漏洞,并提出一些防范意见。 上一篇中给大家着重谈了“ADO 存取数据库时如何分页显示”的问题,有位朋友来信给我指出我在计算页面总数时忽略了 Recordset 对象的一个重要参数“PageCount”,它能在给 Pagesize 赋值后自动得出页面的总数,而无须用“INT(RS.recordcount/PgSz*-1)*-1”这样繁琐的公式。我要感谢这位朋友热心地给我指出程序中的不足,由于这个程序是我在很久以前写的,因为在分页显示的时候记录的总数不一定能整除页面显示记录的数目,而当时第 84 页 共 90 页 第84页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

我又不能肯定 PageCount 是否能正确得出页面的数目,所以偷懒写了这个公式:),说实话我到现在还都没试过用 pagecount,有兴趣的朋友千万要试一下哦,可别学我的懒惰呀。(www.61k.com]

最近我在 chinaasp 的 bbs 上讨论问题时发现很多朋友对于 asp 的一些安全性问题不甚了解,甚至不知道如何解决最常见的 asp::$DATA 显示源代码的问题,因此我觉得非常有必要在这里给广大朋友们重点谈一谈这个问题,在征得 chinaasp 飞鸟的同意下,我将他曾经写过的一点关于 asp 漏洞的介绍加上我自己的一些实践经验拿出来给大家详细分析一下这个对于 webmaster 来说至关重要的 asp 的安全性问题。

当去年 ::$DATA 的漏洞被发现并公布的第二天,我曾经检测了当时国内大部分运用 asp 的站点,其中百分之九十九都存在以上可以看见源代码的问题,当日我甚至在微软的站点上抓下了 search.asp 这个文件的源代码。可能你会觉得看到源代码并没有什么大碍,如果作为 webmaster 的你这么想就大错特错了。譬如,如果 asp 程序员将站点的登陆密码直接写在 asp 里,那么一旦源码被发现,他人就可以很容易的进入本不该被看到的页面,我就曾经利用这个方法免费成为了一个收费网站的成员(大家可别揭发我哦!),而且很多数据库的连接用户名和密码也都是直接写在 asp 里,一旦被发现,如果你的数据库允许远程访问而且没有设防的话就相当危险了。在一些用 asp 开发的 bbs 程序中,往往使用的是 access mdb 库,如果 mdb 库存放的路径被获知,数据库就很有可能被他人下载,加之如果数据库里含有的密码不加密,那就非常危险了,获取密码的人如果有意进行恶意破坏,他只需要以 admin 身份登陆删除所有 bbs 里的帖子,就够你呛的了。下面列出了目前已经发现的一些漏洞,希望大家提高警惕一、经过实验我们发现, win95+pws 上运行 ASP 程序,只须简单地在浏览器地址栏的 asp 文件名后多加一个小数点 ASP 程序就会被下载下来。 IIS3 也存在同样的问题,如果你目前还在使用 IIS3 一定要测试一下。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

二、 iis2、 iis3、 iis4 的一个广为人知的漏洞就是 ::$DATA,通过它使用 ie 的 view source 或 netscape 直接访问该 asp 文件就能轻而易举地看到 asp 代码。 win98+pws4 不存在这个漏洞。

究竟是什么原因造成了这种可怕的漏洞呢?究其根源其实是 Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统: NTFS,这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制,但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道, NTFS 支持包含在一个文件中的多数据流,而这个包含了所有内容的主数据流被称之为“DATA”,因此使得在浏览器里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而直接导致 ::$DATA 的原因是由于 IIS 在解析文件名的时候出了问题,它没有很好地规范文件名。

第 85 页 共 90 页 第85页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

我们该如何解决这个问题呢?办法有几种:

a、是将 .asp 文件存放的目录设置为不可读(ASP 仍能执行),这样 html、 css 等文件就不能放在这个目录下,否则它们将不能被浏览。(www.61k.com] b、是安装微软提供的补丁程序,下载的地址如下(注意针对不同的系统有不同的补丁):

该补丁是针对 IIS3, Intel 平台

ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis3-datafix/iis3fixi.exe 该补丁是针对 IIS3, Intel 平台

ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis3-datafix/iis3fixa.exe 该补丁是针对 IIS4, Alpha 平台

ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixi.exe 该补丁是针对 IIS4, Alpha 平台

ftp.microsoft.com/bussys/iis/iis-public/fixes/cht/security/iis4-datafix/iis4fixa.exe c、是在服务器上安装 ie4.01sp1,这个是否有效,作者本人没具体试过。 d、纯粹作者的个人意见,尽量安装英文版的 NT,而不要使用中文版,究其原因作者也说不清,只是根据实践经验英文版的 NT 较中文版 bug 少,如果哪位朋友知道原因千万要告诉我。

三 . 支持 ASP 的免费主页空间以及虚拟主机服务的服务器面临的问题

1、服务器上的 ASP 代码很可能被人其他拥有 asp 权限的人非法获取。

举个很简单的例子,在微软提供的 ASP1.0 的例程里有一个 .asp 文件专门用来查看其它 .asp 文件的源代码,该文件为

ASPSamp/Samples/code.asp。如果有人把这个程序上传的服务器,而服务器端没有任何防范措施的话,他就可以很容易地查看他人的程序。

例如 :

code.asp?source=/directory/file.asp

2、使用的 ACCESS mdb 数据库可能被人下载一般来说在提供 asp 权限的免费主页服务器上不可能提供代为设定 DSN 的服务,因此 asp 程序使用的数据库通常都局限在使用 mdb 库,而 mdb 远端数据库所在的位置是使用我们在第十四期中讲到过的 DSN-less 方法直接在 asp 中指定的,方法如下 :

< %connstr = "DBQ="+server.mappath("database/source.mdb")+"; DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)}; DriverId=25; 第 86 页 共 90 页 第86页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

FIL=MS Access; ImplicitCommitSync=Yes; MaxBufferSize=512;

MaxScanRows=8; PageTimeout=5; SafeTransactions=0; Threads=3;

UserCommitSync=Yes;"%>

正如前文所言,在这种情况下 mdb 库很可能被他人下载,从而造成诸如密码等的泄露。(www.61k.com]

所以,作为 webmaster 应该采取一定的措施,严禁 code.asp 之类的程序(似乎很难办到 , 但可以定期检索特征代码),限制 mdb 的下载。

3、来自强大的 filesystemobject 组件的威胁

IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现,包括文本文件的读写目录操作、文件的拷贝改名删除等,但是这个强大的功能也留下了非常危险的“后门”。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区,如果权限没有设定好的话,同样也能破坏,一不小心你就可能遭受“灭顶之灾”。遗憾的是很多 webmaster 只知道让 web 服务器运行起来,很少对 ntfs 进行权限设置,而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此,如果你是 Webmaster,作者强烈建议你密切关注服务器的设置,尽量将 web 目录建在 ntfs 分区上,目录不要设定 everyone full control,即使是是管理员组的成员一般也没什么必要 full control,只要有读取、更改权限就足够了。

四、 ASP 应用程序可能面临的攻击过去许多 Internet 上 CGI 写的留言本或 BBS 是把客户输入的留言变为一个变量,然后再把这个变量插入到显示留言的 HTML 文件里,因此客户输入的文本如要在 HTML 文件里显示就得符合 HTML 标准,而 CGI 程序里一般都加入了特定的 HTML 语言。当客户输入内容,插入 HTML 文件时,即同时插入到了头尾 HTML 语句中,如:

< font> 客户输入的变量 < /font> 但如果把前后的 HTML 标记给敝屏了,就可以做很多事情了。

如输入时打上:

< /font> 符合 HTML 标准的语句 < font> 前后的 < font> 是用来敝屏 CGI 中的 HTML 语句用的。插入到 HTML 文件里的就变成了:

< font>< /font> 符合 HTML 标准的语句 < font>< /font> 由于这样一个特性,使得写个 javascript 的死循环变得非常容易,只要在输入框中输入: < a href="URL" onMouseover="while(1){window.close('/')}"> 或 < a herf="URL" onMousever="while(ture){window.close('/')}"> 那么就能让其他查看该留言的客户的浏览器因死循环而死掉。 ASP 开发的程序同样可能存在这个问题,因此当你用 asp 编写类似程序时应该做好对此类操作的防范,譬如可以写一段程序判断客户端的输入,并屏蔽掉所有的 HTML、 Javascript 语句。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

看完本期后,如果你非常的震惊,那么你必须彻底对你现有的网站或 第 87 页 共 90 页 第87页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

asp 程序进行一翻检测,看看是否存在上述漏洞。[www.61k.com)如果你对文中所谈到的漏洞都有所了解并已有足够的对策,那么在恭喜你的同时,还是要提醒你经常查看你的网站和 asp 程序,如果你有数据库也应该经常查看,以防他人利用一些我们未知的漏洞进行攻击。最后,如果你对本文所谈论的 asp 安全性问题有什么独特的见解,或对漏洞有新的发现,希望能来信同我探讨。 第十九章 最新的ASP、IIS安全漏洞

当ASP以其灵活、简单、实用、强大的特性迅速风靡全球网站的时候,其本身的一些缺陷、漏洞也正威胁着所有的网站开发者,继上一篇中介绍了一些IIS的系统漏洞及ASP的安全问题后,本期中将针对最新的ASP、IIS安全漏洞进行详细的探讨,请所有的ASP网站开发者密切关注,提高警惕。 本月初微软再次被指责对其出品的WEB服务器软件的安全问题不加重视。在微软的流行产品IIS SEVER4.0中被发现存在一种被称为“非法HTR请求”的缺陷。据微软称,此缺陷在特定情况下会导致任意代码都可以在服务器端运行。但用发现这一漏洞的Internet安全公司eEye的CEO Firas Bushnaq的话说:这只是冰山一角而已。Bushnaq说,微软隐瞒了些情况,比如黑客可以利用这一漏洞对IIS服务器进行完全的控制,而恰恰许多电子商务站点是基于这套系统的。

下面罗列出了该IIS系统漏洞的详细情况:

IIS的最新安全漏洞受影响的系统:

Internet Information Server 4.0 (IIS4)

Microsoft Windows NT 4.0 SP3 Option Pack 4

Microsoft Windows NT 4.0 SP4 Option Pack 4

Microsoft Windows NT 4.0 SP5 Option Pack 4

公布日期:6.8.1999

microsoft已经证实了这个漏洞,但目前还没有提供可用的补丁程序。 微软安全公告 (MS99-019):

主题:"非正常的 HTR 请求" 漏洞

发布时间: 6.15.1999

摘要:

微软已经证实在其发布的WEB服务器产品Internet Information Server 4.0中存在一个严重的系统漏洞,该漏洞导致对于IIS服务器的“服务拒绝攻击”,在这种情况下,可能导致任何2进制代码在服务器上运行。有关该漏洞的补丁将在近期发布,请所有IIS用户密切关注。

漏洞介绍:

第 88 页 共 90 页 第88页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

IIS支持多种需要服务器端处理的文件类型,譬如:ASP、ASA、IDC、HTR,当一个WEB用户从客户端请求此类文件时,相应的DLL文件将自动对其进行处理。(www.61k.com)然而在ISM.DLL这个负责处理HTR文件的文件中被发现存在严重的安全漏洞。(注:HTR文件本身是用来远程管理用户密码的) 该漏洞包含了一个在ISM.DLL中未经验证的缓冲,它可能对WEB服务器的安全运作造成两方面的威胁。首先,是来自服务拒绝攻击的威胁,一个来自非正常的对.HTR文件请求将导致缓存溢出,从而直接导致IIS崩溃,当这种情况发生时,无须重启服务器,但是IIS WEB 服务器必须重新启动。另一个威胁更令人头痛,通过使用一个精心构建过的文件请求将可以利用标准的缓存溢出手段导致2进制代码在服务器端运行,在这种情况下,什么都可能发生!该漏洞不包括提供用来管理用户密码的功能的.HTR文件。 原理分析:

至少在一个IIS的扩展名中(例如:ASP,IDC,HTR)存在溢出。我们推测溢出将在IIS把完整的URL传递给DLL去处理扩展名时发生。如果ISAPI DLL 没有正确的检查限制范围从而导致INETINFO.EXE产生一个溢出,用户就从可以远端执行2进制代码。攻击方法:向IIS发一个如下的HTTP请求:"GET /[overflow].htr HTTP/1.0",IIS将崩溃。这里的[overflow]可以是3K长的代码。

大家可能对.HTR文件不是很熟悉,其实IIS具有让NT用户通过WEB目录/iisadmpwd/更改自己的口令的能力。而这个功能正是由一组.HTR文件和ISAPI的一个扩展DLL: ISM.DLL实现的。当一个完整的URL传递到ISM.DLL时,由于没有适当的大小限制的检查,就会导致溢出产生,从而使得服务器崩溃。HTR/ISM.DLL ISAPI 是IIS4缺省安装。

解决途径:

由于目前微软尚未发布可供使用的补丁程序,因此我们只能做一些应急的防范。

1、将.HTR扩展名从ISAPI DLL 的列表中删除

在你的NT桌面上,点击“开始”—>“程序”—>“Windows NT 4.0 Option Pack”—>“Microsoft Internet Information Server”—>“Internet 服务管理器”;双击“Internet Information Server”;鼠标右键单击计算机名称并选择“属性”;在“主属性”下拉式菜单中选择“WWW服务”并点击“编辑”按钮;选择“主目录”文件夹,并点击“配置”按钮,在“应用程序映射”列表框中选中.HTR的相关映射,选择“删除”,并确定。

2、安装微软提供的补丁程序,请密切关注以下网址

http://www.microsoft.com/security

http://www.microsoft.com/security/products/iis/CheckList.asp

可能一些朋友会感到不解,为什么我在ASP篇17、18期连续利用两大篇幅着重讨论IIS、ASP的安全性问题,如果你是一个WEB开发者、ASP第 89 页 共 90 页 第89页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

程序员,我想你就应该能够体会我的用意。[www.61k.com]我们进行网络编程、开发交互性的网站,当然首先是为了发展、建设自身网站,但是这一些都是建立在安全的基础上,这里的安全包括对自己辛辛苦苦开发的ASP或其他网络应用程序代码的保护、确保网站服务器安全正常的运行、确保用户信息的安全及认证等等,当今后电子商务成为真正广泛运作的一种商务运行手段后,安全性更是关键之关键。我们中的很多朋友在作为ASP程序员的同时又身兼网络管理员的职责,因此熟悉系统的运作、及时了解系统漏洞、第一时间解决安全性问题就显得十分重要和必要,因此在本文的结尾,作者将整理的一些关于NT、IIS系统配置的安全性建议罗列出来,希望能给大家一些帮助。

1、使用最新版本的Microsoft Internet Information Server4.0,并安装NT最新版本的Service Pack5,服务器的文件系统不要使用FAT,应该使用NTFS。

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

2、把IIS中的sample、scripts、iisadmin和msadc等web目录设置为禁止匿名访问并限制IP地址。在微软还没有提供补丁之前,把ism.dll有关的应用程序映射删除。

3、有条件的话就采用防火墙机制,最简单的如web服务开在前台,目录放在后台,如果能一个服务一台机当然最好。

4、Web目录,CGI目录,scripts目录和winnt目录等重要目录要用NTFS的特性设置详细的安全权限,包含注册表信息的Winnt目录只允许管理员完全控制,一般的用户只读的权限也不要给。凡是与系统有关的重要文件,除了Administrator,其它帐号都应该设置为只读权限,而不是everyone/完全控制 。

5、只开你需要的服务,block掉所有不应该打开的端口,如NetBios端口139,这是一个典型的危险端口;怎样禁止这些端口?除了使用防火墙外,NT的Tcp/IP设置里面也提供了这种功能:打开控制面板-网络-协议-TCP/IP-属性-高级-启用安全机制-配置,这里面提供了TCP和UDP端口的限制和IP协议的限制功能。

6、管理员的帐号要设置得复杂一些,建议加入特殊字符。

7、把FTP,Telnet的TCP端口改为非标准端口,通常我都是设置到10000~65000的范围

8、删除可以删除的所有共享,包括打印机共享和隐藏的共享如

ICP$,Admin$等,微软说这些特殊共享资源很重要,大多数情况下不能删除,而实际上放在Internet上的机器大多数不需要共享。

IPC$: 适用于远程管理计算机和查看共享资源,在网上最好不要用 Admin$: 实际上就是 c:\winnt,也没有必要共享

C$: 登录为Admin和Backup-operator的用户可以用\\计算机名\C$的方式访问C盘,虽然仅限于局域网,但是远程黑客也有办法伪装成局域网的登录用户,所以都应该关掉。

第 90 页 共 90 页 第90页

asp教程 ASP完整教程(完全ASP编程)

Active Server Pages教程

Print$: 这是放打印机驱动程序的目录,与上面的一样也是个很危险的入口。[www.61k.com)

Netlogon: 这是处理域登录请求的共享。如果你的机器为主域控制器,域内有其它机器要登录进来,就不要删除它,否则照样可以删除。

如何关闭这些共享?用“服务器管理器”—>“共享目录”—>“停止共享”

9、将ASP的目录集中管理,ASP的程序目录设置详尽的访问权限,一般建议不要使用“读”权限。

10、把winnt下的sam._文件改名,实践证明这个可能泄露密码的文件可以删除不要。

11、对于已知的NT安全漏洞,都应该在自己的机器上做测试检查。并及时安装补丁程序。

12、有必要的情况下采用IIS4.0提供的SSL安全通信机制来防止数据在网上被截获。

第 91 页 共 90 页 第91页

扩展:asp完整教程 / c 高级编程第9版 完整 / go并发编程实战完整版

四 : ASP 3.0高级编程(四十一)

9.2.3 存储过程
存储过程的使用是Command对象得到应用的一个领域。存储过程(有时也称存储查询)是存储在数据库中预先定义的SQL查询语句。
为什么应该创建和使用存储过程而不是在代码中直接使用SQL字符串呢?主要有以下几个理由:
· 存储过程被数据库编译过。这样可以产生一个“执行计划”,因此数据库确切地知道它将做什么,从而加快了过程的执行速度。
· 存储过程通常被数据库高速缓存,这样使它们运行得更快,因为此时不需要从磁盘中读取它们。并非所有的数据库都支持这种缓存机制,比如微软的Access就不支持,而SQL Server却支持。
· 通过指定数据库中的表只能被存储过程修改,可以确保数据更安全。这意味着具有潜在危险的SQL操作不会执行。
· 可以避免将ASP代码和冗长的SQL语句混在一起,从而使ASP代码更易于维护。
· 可以将所有SQL代码集中存放于服务器。
· 可以在存储过程中使用输出参数,允许返回记录集或其他的值。
一般说来,存储过程几乎总是比相当的SQL语句执行速度快。
为了使用存储过程,只要将存储过程的名字作为命令文本,并设置相应的类型。例如,考虑前面更新书价的例子。如果在SQL Server上创建一个存储过程,可以编写代码:
CREATE PROCEDURE usp_UpdatePrices
AS
UPDATE Titles
SET Price = Price * 1.10
WHERE TYPE='Business'
对于微软的Access数据库,可以使用一个简单的更新查询语句完成相同的任务

要在ASP网页中运行该存储过程,只需要使用以下代码:
Set cmdUpdate = Server.CreateObject("ADODB.Command")

cmdUpdate.ActiveConnection = strConn
cmdUpdate.CommandText = "usp_UpdatePrices"
cmdUpdate.CommandType = adCmdStoredProc

cmdUpdate.Execute , , adExecuteNoRecords
这只是运行存储过程。没有记录集返回,因为只是在更新数据。需要记住的是,除非确实需要,不要创建记录集。
虽然这样做也可以,但并不是很灵活,因为仅仅处理一种类型的书。更好的做法是创建一个允许我们选择书类型的过程,这样就不必为每类书创建一个过程。同样也可去掉固定的10%更新,这样使得灵活性更好。那么,如何才能做到这一点呢,很简单,使用参数。
1. 参数
存储过程的参数(或变量)与一般的过程和函数的参数一样,可以传到函数内部,然后函数可以使用它的值。SQL Server(其他数据库也一样,包括Access)中的存储过程都具有这样的功能。
为了使存储过程能处理多种类型的书,甚至允许用户指定价格的增加(或减少),需要增加一些参数:
CREATE PROCEDURE usp_UpdatePrices
@Type Char(12),
@Percent Money

AS
UPDATE Titles
SET Price = Price * (1 + @Percent / 100)
WHERE Type = @Type
现在,存储过程usp_UpdatePrices带有两个参数:
· 一个是书的类型(@Type)。
· 一个是书价变化的百分比(@Percent)。
与VBScript的函数一样,这些参数都是变量。然而,与VBScript和其他脚本语言不同的是:在这些脚本语言中的变量都是variant类型,而SQL变量具有确定的类型(char、Money等等)。必须遵守SQL变量的命名规范,即变量必须以符号@开始。
注意,我们让百分数作为一个整数(如10代表10%),而不是作为一个分数值传入此过程。这只是让存储过程变得更直观一些。
2. Parameters集合
那么,现在有了带参数的存储过程,但如何通过ADO来调用它呢?我们已经见到了如何用Command对象调用不带参数的存储过程,实际上,它们之间并没有什么不同。不同之处在于Parameters集合的使用。
Parameters集合包含存储过程中每个参数的Parameter对象。然而,ADO并不会自动地知道这些参数是什么,因此,必须用CreateParameter方法创建它们,采用下面的形式:
Set Parameter = Command.CreateParameter (Name, [Type], [Direction], [Size], [Value])
参数及说明如表9-3所示:
表9-3 CreateParameter方法的参数及说明
参 数
说 明

Name
参数名。这是Parameters集合中的参数名,不是存储过程中的参数名。然而,使用相同的名字是一个好的做法

Type
参数的数据类型。可以是一个adDataType常数,详见附录

Direction
参数的方向,指明是参数向存储过程提供信息,还是存储过程向ADO返回信息。可以是下面的值之一:
adParamInput,参数是传给存储过程的输入参数
adParamOutput,参数是从存储过程检索出的输出参数
adParamInputOutput,参数可同时作为输入和输出参数
adParamReturnValue,该参数包含存储过程返回的状态

Size
参数长度。对于固定长度的类型,比如整型,该值可以忽略

Value
参数的值

一旦创建了参数就可以将其追加到Parameters集合中,例如:
Set parValue = cmdUpdate.CreateParameter("@Type", adVarWChar, adParamInput, _
12, "Business")
cmdUpdate.Parameters.Append parValue

Set parValue = cmdUpdate.CreateParameter("@Percent", adCurrency, _
adParamInput, , 10)
cmdUpdate.Parameters.Append parValue
没有必要显式地创建一个对象去保存参数,缺省的Variant类型已经可以工作得相当好。如果不想创建一个变量,也可以走捷径,例如下面的代码:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput, , 10)
这使用CreateParameter方法返回一个Parameter对象,并用Append方法接收它。这种方法比使用变量运行得快,却加长了代码行,可读性比较差。可以根据自己的爱好选择其中一种方法。
参数加到Parameters集合后,就保留在其中,因此,不一定在创建参数时就为每个参数赋值。可以在命令运行前的任何时候设置参数的值。例如:
cmdUpdate.Parameters.Append = _
cmdUpdate.CreateParameter("@Percent", adCurrency, adParamInput)

cmdUpdate.Parameters("@Percent") = 10
前一章提到了访问集合中的值有好几种方法,Parameters集合并没有什么不同。上面的例子使用参数的名字在集合中检索参数,也可以使用索引号进行检索:
cmdUpdate.Parameters(0) = 10
以上代码对参数集合中第一个(Parameters集合从0开始编号)参数进行了赋值
本文标题:asp编程-ASP 3.0高级编程(四十四)
本文地址: http://www.61k.com/1122542.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1