当前位置:首页 >> 高中教育 >> 动态网页设计教程

动态网页设计教程


ASP动态网页设计教程
? 第1章 ASP设计基础

? 第2章 HTML语言
? 第3章 JavaScript脚本语言介绍 ? 第4章 VBScript脚本语言介绍 ? 第5章 ASP的内置对象 ? 第6章 ASP组件 ? 第7章 ASP的数据库存取组件及ADO技术 ? 第8章 ASP动态网页设计开发实例 ---通用企业网站模板程序

/>1

第1章 ASP设计基础
? 1.1 Web基础
? ? ? 1.1.1 Web概述 1.1.2 Web常用术语 1、1、3WEB服务器技术 1.2.1 什么是ASP 1.2.2 ASP的运行环境及安装 1.2.3 创建虚拟目录 1.3.1 ASP的一个简单实例 1.3.2 ASP文件的基本构成和约定 1.4.1 ASP的开发工具 1.4.2 ASP的调试技巧

?

1.2 ASP基础
? ? ?

?

1.3 ASP语法简介
? ?

?

1.4 ASP的开发工具及调试技巧
? ?

2

1.1.1 Web概述
Web(World Wide Web)也称万 维网,是Internet上一个非常重要的信息 资源网,产生于20世纪90年代初。它遵循 超文本传输协议,以超文本或超媒体的形式 传送各种各样的信息,为用户提供了一个具 有友好的图形化界面—Web页,以查阅 Internet上的信息文档。

3

1.1.2 Web常用术语
Web页面: 就是通常在浏览器中所看到的网页,其实是一个单 一的文件。 网页: 就是用HTML编写的文本文件,包含有文字、表格、 图像、链接、声音和视频等。 网站: 就是由若干网页按一定方式组织在一起,放在服务 器上,提供相关信息资源。 主页: 有时也称首页,是网站的第一个页面。通常,总是 和一个URL网址相对应,引导用户浏览网站。
4

1.1.2 Web常用术语(续上)
URL(Uniform Resource Locator) : 即统一资源定位器,是一种唯一标识Internet上计 算机、目录和文件的位置的命名规则。它由资源类型、存 放资源的主机地址和端口以及资源目录和文件名构成。 具体如下:
资源类型 表示信息传输的协议,如http、ftp等。 主机地址 即为提供资源的主机IP地址或域名地址。 端口 表示某一服务器在该主机上所使用的TCP端口。 目录 表示提供服务的信息资源所在的目录。 文件名 由基本文件名和扩展名两部分构成。 例如: http://www.student.com:80/study/default.html ↑ ↑ ↑ ↑ ↑ 资源类型 主机地址 端口 目录 文件名
5

1.1.2 Web常用术语(续上)
HTTP(Hypertext Transfer Protocol):

超文本传输协议,是Internet上访问WWW信息资
源的一种协议,用来传输多媒体信息。 HTML(HyperText Markup language): 超文本标记语言,是一种描述文档结构的语言,而 不能描述实际的表现形式。HTML语言使用描述性的标记 符(称为标签)来指明文档的不同内容。

6

1、1、3WEB服务器技术
? Microsoft IIS 5、0(6、0) ? PWS ? APACHE ? IPlanet Web Server ? EAServer ? Netscape Web Server等 思考: 1、如何来选择使用? 2、一台服务器中如果安装两种WEB服务器软 件时应注意什么?
7

1.2.1 什么是ASP
ASP(Active Server Pages)是一套微软开发的服务器 端脚本环境,它内含于IIS(Internet Information Server) 或PWS(Personal Web Server)中。使用它可以创建和运 行动态、交互的Web服务器应用程序。 ASP的工作原理,就是当客户端浏览器上某用户申请一个 *.ASP的文件(ASP文件的后缀名为.asp)时,Web服务器就 会响应该HTTP请求,并调用ASP引擎,解释被申请文件,最后 输出标准的HTML格式文件传送给客户端浏览器,由浏览器解释 运行,并显示出结果,如图1-1所示。 当遇到任何与ActiveX Scripting兼容的脚本(如 VBScript和JavaScript)时,ASP引擎会调用相应的脚本引 擎进行处理。若脚本指令中含有访问数据库的请求,就通过 ODBC与后台数据库相连,由数据库访问组件执行访问操作等。 由于ASP脚本是在服务器端解释执行的,所以其所有相关的发布 工作都由Web服务器负责。
8

1.2.2 ASP的运行环境及安装
如果只是用HTML设计网页,并不需要特殊的环境,

直接在浏览器上浏览即可。而用ASP设计的网页是在服
务器端运行的,因此必须配置相应的运行环境。 ASP的运行环境可以选择如下安装:
如果是在Windows 95/98平台上运行ASP文件,需要安装个
人Web服务器PWS。 如果是在Windows NT 4.0 Server平台上运行ASP文件,需

要安装IIS 4.0。
如果是在Windows 2000/XP平台上运行ASP文件,由于其已 内置了IIS 5.0以上版本,故只需添加其IIS组件即可。

下面以Win XP为例,介绍如何添加IIS 5.0组件。
9

1.2.2 ASP的运行环境及安装(续上)
具体安装步骤如下:
① 选择“开始?设置?控制面板”命令,在“控制面板”窗口中,双击
“添加或删除程序”图标,出现如图1-2所示的窗口。

10

1.2.2 ASP的运行环境及安装(续上)
② 双击“添加/删除Windows组件”图标,打开“Windows组件向导”

对话框,如图1-3所示。

11

1.2.2 ASP的运行环境及安装(续上)
③ 选中“组件”列表框中的“Internet信息服务(IIS)”复选框。并根据

需要选择其他组件,然后单击“详细信息”按钮,打开如图1-4所示
的对话框。在IIS的子组件列表中选择所需组件,选择完毕后单击 “确定”按钮,返回“Windows组件向导”对话框。

12

1.2.2 ASP的运行环境及安装(续上)
④ 单击“下一步”按钮,此时安装程序要求插入光盘来读取需要的文件,

当放入Windows 2000光盘后,单击“确定”按钮,此刻安装程序
开始复制文件并进行配置IIS,如图1-5所示。

13

1.2.2 ASP的运行环境及安装(续上)
⑤ 文件复制完成后,出现如图1-6所示的对话框。单击“完成”按钮即

可。

14

1.2.2 ASP的运行环境及安装(续上)
同样,当IIS安装完成后,单击鼠标右键“我的电脑”选择“管理”,打

开“计算机管理”对话框,找到“Internet信息服务”选项中的
“默认Web站点”,如图1-7所示,发现该服务已经启动,此时只 需在IE浏览器地址栏中输入“http://localhost”,即可看到如图18所示的画面。

15

1.2.3 创建虚拟目录
当Web服务器启动后,只要将ASP文件放在其默认主

目录“C:\Inetpub\wwwroot”下即可运行。但为了调试
方便,往往需创建一个虚拟目录。所谓虚拟目录,就是在 URL地址中使用的目录名称,或称之为URL映射,其可以 与物理目录相同,也可以不同。

下面以Windows 2000为例介绍如何创建虚拟目录。
具体操作步骤如下:
① 首先,在计算机上创建一个名为ASP的文件夹,比如D:\ASPWEB。

② 其次,打开“Internet信息服务”对话框(方法见上。
16

1.2.3 创建虚拟目录(续上)
③ 选中“默认Web站点”,单击右键,选择“新建?虚拟目录”,出现

如图1-9所示安装向导对话框。

17

1.2.3 创建虚拟目录(续上)
④ 在向导过程中,依次输入相应内容:别名“ASPWEB”、目录

“D:\ASPWEB”以及权限“至少包含读取和运行脚本”后,单击
“完成”按钮即可,此时如图1-10所示。

18

1.2.3 创建虚拟目录(续上)
⑤ 选中“ASPWEB”,单击右键,选择“属性”,出现如图1-11所示对

话框,可以对虚拟目录重新设置。

19

1.2.3 创建虚拟目录(续上)
⑥ 单击“文档”选项,可以添加新的默认文档,如index.htm或

index.asp,并可以调整其先后顺序,如图1-12所示。

至此,虚拟目录就创建完成了,以后本书中所有的例 子,只要存放在该目录下即可进行调试运行。
20

1.3.1 ASP的一个简单实例
下面将编写一个简单的 ASP文件,以分析ASP的基 本构成。 具体操作步骤如下:
① 选择“开始?程序?附件?记事本” 命令,以启动记事本程序。 ② 在记事本程序窗口中,输入以下内 容: ③ 从“文件”菜单中选择“保存”命 令,将弹出“另存为”对话框, 选择一个保存位置,如前面设置 的名为ASPWEB虚拟目录下的 chapter1子文件夹,并将文件类 型改为“所有文件”,同时在 “文件名”框中输入“exam11.asp”,单击“保存”按钮。

<html> <head> <title>ASP的一个简单实例</title> </head> <body> <script language="vbscript"> <!-xm=inputbox("请输入您的大名:","输入名称") if time()>=#6:00:00# and time()<#12:00:00# then str=" 早上好!" elseif time()>=#12:00:00# and time()<#19:00:00# then str=" 下午好!" else str=" 晚上好!" end if document.write "<h2 align='center'>您好," & xm & str document.write "<br>欢迎光临我的第一个ASP页面</h2>" --> </script> <p align="center"> <% 'date()为日期函数 y=year(date()) '取当前日期的年份 m=month(date()) '取当前日期的月份 d=day(date()) '取当前日期是几号 t=time() '取当前时间 Select Case weekday(date()) '取当前日期是星期几 Case 2 w="一" Case 3 w="二" Case 4 w="三" Case 5 w="四" Case 6 w="五" Case 7 w="六" Case Else w="日" End Select str=y & "年" & m & "月" & d & "日 星期" & w & " " & t & "<br>" & str response.write str %> </body> </html>

该程序功能是显 示当前来访日期与时 间,并根据当前时刻 显示不同的问候语, 如早上的时候,会显 示“早上好!”。

21

1.3.1 ASP的一个简单实例(续上)
④ 打开IE,在地址栏中输入 “http://localhost/ASPWEB/chapter1/exam1-1.asp”,程序运 行结果如图1-24、图1-25所示。

22

1.3.2 ASP文件的基本构成和约定
1、基本构成
从上述这个简单的ASP程序中,经分析发现,通常由以下3个部分构成:
? ? ? 普通的HTML文件,即一般的Web页面内容 放在<% … %>内的Script脚本语言代码,由服务器端运行。 放在<Script> … </Script>内的Script脚本语言代码,由客户端直接运行。

2、约定
在ASP中,默认语言是VBScript,若要使用其他的脚本语言,可以采用
以下方法切换: <%@Language=VBScript%> 或<%@Language=JavaScript%> 在ASP中,VBScript脚本语言中的用户界面函数(如InputBox和 MsgBox)只能在客户端<Script> … </Script>使用,而不能服务器端 <% … %>中使用。 在ASP中,VBScript脚本语言不区分大小写,而JavaScript则区分大小写。
23

1.4.1 ASP的开发工具
一般来说,任何文本编辑器工具都可作为ASP的开 发工具,只要编写完毕后存成后缀为.asp的文件即可。 对于初学者而言,最简单最好使用的就是系统自带 的记事本程序。当然,要想开发一些大型的Web应用程

序,最好还是使用一些专门的开发工具,如Microsoft Visual InterDev以及Macromedia Dreamweaver MX等。 现在网上也提供了一些很好用的ASP开发小工具, 如UltraEdit等,它可以将ASP脚本语言与HTML语言 分颜色显示,并可帮助编写复杂的HTML语句。大家可 以到一些软件园地去下载。
24

1.4.2 ASP的调试技巧
在编写ASP的过程中,不出错误是不可能的,通

常,可以采用边编辑边浏览的调试方法。在运行过程
中,当程序出错时,页面上会显示错误描述、出错代 码行数等信息,根据这些信息,再回到编辑器中进行 修改。 另外,还可以采用注释方法,将一些语句暂时注释 掉,逐段调试。或者临时添加一些输出语句如 Response.Write将中间结果输出查看。若调试数据

库程序,经常还会用到SQL语句输出查看错误。
25

第2章 HTML语言
? 2.1 一个HTML文件实例 ? 2.2 HTML基本结构及语法规则
? 2.2.1 HTML的基本结构 ? 2.2.2 HTML语法规则

? 2.3 HTML常用标签
? ? ? ? ? ? ? ? ? 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.8 2.3.9 网页结构类标签 段落类标签 列表类标签 格式化类标签 超链接类标签 图像类标签 表格类标签 框架类标签 表单类标签
26

? 2.5 HTML综合实例

2.1 一个HTML文件实例
【例2-1】 用记事本编写HTML语言, 制作一个简单的网页,如图2-1所示。
其代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> <title>这是我编写的第一个HTML页面</title>

</head> <body> <h2 align="center">HTML简介</H2> <p>&nbsp&nbsp一个HTML文件是<b><i>一页文字信息</i></b>,就象一封电子邮件或一个word字处理文 档,而且实际上你完全可以使用Word字处理软件来编写一个HTML网页。你也可以通过其它字处理软件编写文本文件, 网络浏览器只能处理文本信息。</p> <p>&nbsp&nbsp一个HTML文件中包含了所有将显示在网页上的文字信息,其中也包括对浏览器的一些指示,如哪些 文字应放置在何处,显示模式是什么样的等。如果你还有一些图片、动画、声音或是任何其它形式的资源,HTML文件也 会告诉浏览器到哪里去查找这些资源,以及这些资源将放置在网页的什么位置。HTML文件通过<font size="5" color="red">标签(tag)</font>来实现这一功能。</p> </body> </html>
27

2.2.1 HTML的基本结构
通过上面这个实例,可以发现其基本结构如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html;charset=gb2312"> <title>……</title> </head> <body> …… </body> </html>

HTML文件总是以<html>标签开头,</html>标签结束,用来 表明这是一个HTML文件。在<html>和</html>标签对之间是HTML 的所有内容,一般由头部和主体构成。头部总是由<head>和 </head>标签对定义,其中包含了该HTML页面的标题和说明信息, 如编码方式、关键字、编辑软件、作者信息等。头部以下就是主体部分, 它以<body>作为起始标签,</body>作为结束标签,中间部分就是 在浏览器中所看到的内容,如文字、图片动画等。
28

2.2.2 HTML语法规则
通常,在编写HTML语言时需遵守以下语法规则:
? HTML文件总是以htm或html作为文件的扩展名。
? HTML标签不区分大小写,如<p>与<P>是一样的。 ? 多个HTML标签间可以循环嵌套,但不可以交叉嵌套。

? HTML文件一行可以写多个标签,一个标签也可分多行书写,
不用加任何续行符。 ? HTML文件由浏览器解释时只认标签,并不解释源文件中的换 行、回车和多个连续空格。若要显示换行则用<br>标签,换 段则用<p>标签,而要显示多个空格,则需使用多个&nbsp;。

29

2.3.1 网页结构类标签
1、HTML文档标签
格式:<html>……</html> 说明:<html>处于文档的最前面,表示HTML文档的开始,即浏览器 从<html>开始解释,直到</html>为止。

2、HTML文件头标签
格式:<head>……</head> 说明:<head>紧跟<html>标签的后面,表示文件头部开始,到 </head>结束。其内容包含了该HTML页面的标题和说明信息, 如编码方式、关键字、编辑软件、作者信息等。

3、HTML文件标题标签
格式:<title>……</title> 说明:该标签定义的标题内容不在浏览器窗口中显示,而是在浏览器 的标题栏中显示。通过该标题内容的设定,可以使读者迅速了解 该网页的主要内容以及在使用搜索引擎时可以找到该页。
30

2.3.1 网页结构类标签(续上)
4、HTML文件说明信息标签
格式:<meta>……
说明:该标签可以用来设定说明信息,一般放在文件头部内。 属性: (1)描述语言字符集的信息,例如:<meta httpequiv="Content-Type" content="text/html;charset=#">, 常用的#可以为gb2312、x-mac-roman、big5等。 (2)描述文档的自身信息,如作者信息、过期时间、关键词列表等。

例如:
<meta http-equiv="作者" content="李冰"> <meta http-equiv="文档期限" content="2004/4/20">

31

2.3.1 网页结构类标签(续上)
5、HTML文件主体标签
格式:<body>……</body> 说明:位于头部之后,以<body>开始,直到</body>结束。定义了 网页上显示的主要内容与显示格式,是整个网页的核心,浏览器 窗口中所能显示的内容全部被包含在该标签中。 属性:用于设定网页的总体风格。其中: bgcolor 设置网页的背景色。 background 设置网页的背景图像。 text 设置网页文本的颜色。 link 设置尚未被访问过的超链接颜色,默认为蓝色。 vlink 设置已被访问过的超链接颜色,默认为蓝色。 alink 设置一个正被激活的超链接颜色,默认为红色。

6、注释标签
格式:<!--……--> 说明:在HTML文件中加入注释可以使程序清晰,容易理解。该标签中 的内容在被浏览器解释时会被忽略,也不会被显示。
32

2.3.2 段落类标签
1、标题标签
格式:<hn>……</hn> 说明:该标签可以用来指明页面上的n级标题,其中n=1~6,主要用 于对文本中的章节进行划分。

2、段落标签
格式:<p>……</p> 说明:该标签可以定义一个段落。 属性: align 用来设定段落的对齐方式。取值有:left、right和 center。

3、换行标签
格式:<br> 说明:此标签是不分段换行。
33

2.3.2 段落类标签(续上)
4、水平线标签
格式:<hr>
说明:该标签可以用来在页面上插入一条水平标尺线。 属性:

align
size

用来设定横线放置的位置。取值有:left、right和center。
用来设定线条粗细,取值为n个像素,默认为2。

width 用来设定线段长度,取值可为绝对值(n个像素)或相对值

(相对于当前窗口的百分比),默认值为100%。

34

2.3.2 段落类标签(实例)
【例2-2】段落类标签演示,如图2-2所示。
其代码如下:
<HTML> <HEAD> <TITLE>段落类标签演示</TITLE> </HEAD> <BODY> <H1 ALIGN="LEFT">南京国力臭氧设备有限公司</H1> <p>欢迎您的光临!</p> <H2 ALIGN="CENTER">公司简介</H2> <p>南京国力臭氧应用设备有限公司是臭氧技术应用研究学会组委单位;是 臭氧技术应用研究基金会成员;是臭氧发生器和臭氧化应用设备研究、设计 专业制造商。<br> 国力技研是国内首先(一九八二年)研究低电场(3000V)生产臭氧,以空 气为媒介作用于空气及物体表面微生物的臭氧发生器和臭氧化应用设备专家。 <br> 公司采用先进的电真空技术和设备,并具有完整的生产工艺和检测设施,按 GMP和FDA标准在中国开创新一代适用于空气和物体表面灭菌的臭氧发生 器和臭氧化应用设备。</p> <p>现有产品八个系列六十余品种,供制药、生物制品、食品饮料、遗传工 程、医疗卫生等领域替代紫外线灯照射、化学薰蒸、Co60放射和蒸气消毒、 高温灭菌时选用。</p> <hr> <H3 ALIGN="RIGHT">产品介绍<H3> </BODY> </HTML>

35

2.3.3 列表类标签
1、编号列表标签
格式:<ol>……</ol> 说明:该编号列表中每一项由<li>开头。 属性:type,用来设定编号方案。其中: type=1 默认值,用数字对应编号符,如1,2,3等。 type=A 用大写字母编号表项,如A,B,C等。 type=a 用小写字母编号表项,如a,b,c等。 type=I 用大写罗马字母编号表项,如I,II,III,IV等。 type=i 用小写罗马字母编号表项,如i,ii,iii,iv等。

2、项目列表标签
格式:<ul>……</ul> 说明:该项目列表中每一项也由<li>开头。 属性:type,用来设定项目符的形状。其中: type=DISC 实心圆点(默认值)。 type=CIRCLE 空心圆点。 type=SQUARE 实心方块。
36

2.3.3 列表类标签(实例)
【例2-3】列表类标签演示,如图2-3所示。
其代码如下:
<HTML> <HEAD> <TITLE>列表类标签演示</TITLE> </HEAD> <BODY> <UL TYPE="CIRCLE"> <LI> <P ALIGN="LEFT"><FONT FACE=黑体 SIZE=5 COLOR=RED>公司口号</FONT></LI> <OL TYPE="A"> <LI><P ALIGN="LEFT">开拓创新、追求无限</LI> <LI><P ALIGN="LEFT">度身设计、专业服务</LI> <LI><P ALIGN="LEFT">科技领先、群策管理</LI> </OL> <LI><P ALIGN="LEFT"><FONT FACE=黑体 SIZE=5 COLOR=RED>产品介绍</FONT></LI> <OL> <LI><P ALIGN="LEFT">GJF、GJF—F系列臭氧发生器 </LI> <LI><P ALIGN="LEFT">GSK、GZK系列臭氧发生器电源控制 系统</LI> <LI><P ALIGN="LEFT">GJF-T系列臭氧发生器</LI> <LI><P ALIGN="LEFT">GYD、GYD—F系列臭氧发生器 </LI> </OL> </UL> </BODY> </HTML>

37

2.3.4 格式化类标签
1、字符风格标签
格式: <b>……</b> <i>……</i> <u>……</u> <strike>……</strike> <big>……</big> <small>……</small> <sup>……</sup> <sub>……</sub>
粗体 斜体 下划线 删除线 以较大字体显示 以较小字体显示 上标 下标

2、预格式化标签
格式:<pre>……</pre> 说明:多数情况下,html文件中的文本是基于html标签进行格式化的, 文本中任何额外的空白字符(空格、制表符、回车符等)都将被 浏览器忽略。这个规则的一个例外就是使用该标签。任何被该标 签括起来的空白字符都可以出现在最后的屏幕输出中。
38

2.3.4 格式化类标签(续上)
3、字符格式标签
格式:<font>……</font>
说明:该标签可以文字的字体、字号和颜色。 属性:

size
face color

设置文字大小,取值范围是从1到7,其中3是默认值。
设置文字字体,如黑体、宋体、楷体_GB2312、Times New Roman等。 设置文字颜色,取值是颜色名(如red)或颜色数值(如 #003366)。

39

2.3.4 格式化类标签(实例)
【例2-4】格式化类标签演示,如图2-4所示。
其代码如下:
<HTML> <HEAD> <TITLE>格式化类标签演示</TITLE> </HEAD> <BODY> <pre> 度身设计、专业服务: 根据应用项目选择设备属性——人为制造臭氧的方法; 根据应用要求确定臭氧浓度——计算臭氧应用量; 根据应用环境条件、臭氧用量——选择设备类别、型号。 </pre> <FONT FACE=仿宋_gb2312 size=4 color=red>每 个不同的<b>应用环境、使用条件、作用目的</b>都存在 着<i><font face=黑体 color=blue>物理、化学及其相 关</font></i>的差异,正确的选择机型及用量就是成功 的先决条件,<strike>国力公司</strike>的技术人员会 为您作出正确的选择及满意的服务。</font> </BODY> </HTML> 40

2.3.5 超链接类标签
1、超链接的定义: 是一个网页指向另一个目的端的链接,目的端可以是另一个网页或者同一个 网页上的不同位置 2、格式: <a name="对象名">…</a> 用来设定指定的对象为一个超链接的目标, 用来设定同一文档的一个目标。 用来设定超链接的另一目标或目标资源。

即定义锚点。
<a href="#对象名">…</a> <a href="URL">…</a>

<a name=“URL#对象名”>…</a>用来设定另一文档中的一个目标。 要注意文档路径的设置。文档路径可以分为绝对路径、文档相对路径和根相对 路径。 3、分类:

文档链接、锚点链接、邮件链接、脚本链接、空链接。
41

2.3.5 超链接类标签(实例)
【例2-5】超链接类标签演示,如图2-5所示。
其代码如下:
<HTML> <HEAD> <TITLE>超链接类标签演示</TITLE> </HEAD> <BODY> <OL TYPE=A> <LI><FONT SIZE="2"><A HREF="#gsjj">公司简介</A></FONT></LI> <LI><FONT SIZE="2"><A HREF="cpjs.htm" target="_blank">产品介绍 </A></FONT></LI> </OL> <HR SIZE="1"COLOR="#000080"WIDTH="60%"ALIGN="LEFT"> <P><A NAME="gsjj">南京国力臭氧应用设备有限公司</A>是臭氧技术应用研究学会组 委单位;是臭氧技术应用研究基金会成员;是臭氧发生器和臭氧化应用设备研究、设计专业制造 商。国力技研是国内首先(一九八二年)研究低电场(3000V)生产臭氧,以空气为媒介作用 于空气及物体表面微生物的臭氧发生器和臭氧化应用设备专家。公司采用先进的电真空技术和设 备,并具有完整的生产工艺和检测设施,按GMP和FDA标准在中国开创新一代适用于空气和物 体表面灭菌的臭氧发生器和臭氧化应用设备。现有产品八个系列六十余品种,供制药、生物制品、 食品饮料、遗传工程、医疗卫生等领域替代紫外线灯照射、化学薰蒸、Co60放射和蒸气消毒、 高温灭菌时选用。<br> 该类产品于一九八八年六月四日通过省级技术鉴定,一九九二年在第二届北京国际博览会上获得 “银杯奖”,一九九八年《臭氧技术在医药工业中的应用设计》论文被“99国际医药、医疗器 械、制药机械成果博览学术交流研讨会”有关专家评选为“优秀成果金奖”,2001年通过 ISO9001:2000国际质量体系认证,具备产品检测、鉴定和验证能力。<br> “开拓创新、追求无限”是“国力人”的精神,企业始终贯彻“以人为本、科技领先” 的经营理 念,积极引进国内外先进技术,不断完善和开发新型的臭氧应用设备为广大用户服务。国力公司 的每项成果均融汇着每一位国力参与者的才华、力量和信心。热忱欢迎各大专院校、科研院所、 制药企业和同仁来我公司实验、研讨、考察、验证,为华夏臭氧产业共铸辉煌。 </P> </BODY> </HTML>

42

2.3.6 图像类标签
1、图像格式
要想把在文档放置图像,其格式可以是GIF、JPEG、XBM、TIFF、 BMP和PICT等。其中:GIF格式文件最多只能显示256中颜色,一般用于 制作透明、隔行和动画效果图片等;而JPEG格式文件可以拥有计算机所能 提供的最多种颜色,适合存放高质量的彩色图片、照片。

2、内嵌图像标签
格式:<img> 说明:用来在文档中嵌入图像。 属性: src 用来设定要被包含的图像的位置和文件名,其路径名使用规则同超 链接中的href属性。 alt 用来设定在纯文本浏览器中替换图像的文本。 width和height 用来设定图像的尺寸,可取绝对值或相对值。 border 用来设定图像边框的宽度,其默认值为0,无图像边框。 align 用来设定图像的位置,取值有bottom、middle、top等。
43

2.3.6 图像类标签(实例)
【例2-6】图像类标签演示,如图2-6所示。
其代码如下:
<HTML> <HEAD> <TITLE>图像类标签演示</TITLE> </HEAD> <BODY> <FONT FACE=隶书 SIZE=6 COLOR=RED><H2 ALIGN="CENTER">国力公司主要客户</FONT></H2> <P ALIGN="LEFT"><IMG SRC="images/zykh01_small.jpg" WIDTH="100" HEIGHT="60" ALIGN="LEFT">第一个</P> <P ALIGN="CENTER">第二个<BR><IMG SRC="images/zykh02_small.jpg" WIDTH="100" HEIGHT="60" ALIGN="CENTER"></P> <P ALIGN="RIGHT"><IMG SRC="images/zykh03_small.jpg" WIDTH="100" HEIGHT="60" ALIGN="RIGHT">第三个</P> </BODY> </HTML>

44

2.3.7 表格类标签
格式: <table> <tr><td></td>…</tr> …… </table> 说明: 表格标签除了可以显示大量数据列表格式外,往往还可以用于网 页的布局。 属性: border 用来设定表格边框粗细。若省略,则无边框。 width和height 用来设定表格宽度和高度,可取绝对值或相 对值。 cellspacing 用来设定表格间隙。 cellpadding 用来设定表格内部空白。 Background 设置表格的背景图像 Bgcolor 设置表格的背景颜色 Align 设置表格的对齐方式:center,left和right

<table> <tr> <th>表头1</th> <th>表头2</th> …… <th>表头n</th> </tr> <tr> <td>表项1</td> <td>表项2</td> …… <td>表项n</td> </tr> …… </table>

45

2.3.7 表格类标签(实例)
【例2-7】表格类标签演示,如图2-7所示。
其代码如下:
<html> <head> <title>表格类标签演示</title> </head> <body> <p align="center">GMX-FB系列设备技术参数</p> <center> <table border="1" cellspacing="0" cellpadding="0"> <tr> <td width="102" align="center">型号</td> <td width="82" align="center">电源<br>V/Hz</td> <td width="78" align="center">臭氧产量<br>g/h</td> <td width="78" align="center">整机功率<br>kw</td> <td width="90" align="center">臭氧浓度<br>ppm*</td> <td width="100" align="center">脉动压力<br>MPa/td> <td width="127" align="center">工作室尺寸<br>L.W.H(mm)**</td> </tr> <tr> <td width="102" align="center">GMX-FB1000</td> <td width="82" align="center">220/50</td> <td width="78" align="center">2.2+10%</td> <td width="78" align="center">0.45</td> <td width="90" align="center">≥80</td> <td width="100" align="center">0.015~0.03</td> <td width="127" align="center">960×750×1400</td> </tr> <tr> <td width="102" align="center">GMX-FB1600</td> <td width="82" align="center">220/50</td> <td width="78" align="center">3.8+10%</td> <td width="78" align="center">0.65</td> <td width="90" align="center">≥80</td> <td width="100" align="center">0.015~0.03</td> <td width="127" align="center">1200×950×1400</td> </tr>

<tr> <td width="102" align="center">GMX-FB2200</td> <td width="82" align="center">220/50</td> <td width="78" align="center">5.8+10%</td> <td width="78" align="center">0.85</td> <td width="90" align="center">≥80</td> <td width="100" align="center">0.015~0.03</td> <td width="127" align="center">400×1100×1400</td> </tr> </table> </center> </body> </html>

46

2.3.8 表单类标签
格式:
<form name=“” action="URL" method="get|post”> <input type="表单项" name="表单项名1"> …… <input type="表单项" name="表单项名n”> </form>

说明:
使用表单可以在网页中实现交互操作。

属性:
action 用来设定将要处理表单的服务器的URL。 method 用来设定客户与服务器的数据交换方式。 type 用来设定要加入表单项的类型(text,password,checkbox, radio,image,hidden,submit,reset,file、button等)。 name 用来设定该表单项名,主要在处理表单时起作用。
47

? 菜单项 <select name=“” size=“”> <option selected>菜单项</option> <option>菜单项</option> …. </select> ? 文本输入框 <textarea name=“名” rows=“” cols=“”></textarea>
48

2.5 HTML综合实例
本节给出一个综合实例并加以说明,如图2-7所 示。通过该实例,读者可以学会一个完整的网页制作 方法。

49

2.5 HTML综合实例(源代码)
其代码如下:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>走近西部</title> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> </head> <body background="images/100.jpg"> <div align="center"><center> <table border="0" width="100%" height="51" background="images/Back234.gif" cellspacing="0" cellpadding="0"> <tr> <td width="100%" height="45"><p align="center"><img src="images/top.gif" width="753" height="80" alt="未标题-1.GIF (28866 字节)"></td> </tr> </table> </center></div><div align="center"><center> <table border="0" width="100%" bgcolor="#00FFFF" cellspacing="0" cellpadding="0" height="38"> <tr> <td width="100%" height="38"><p align="right"><a href="index7.htm"><font SIZE="3" color="#800000">何为西部</font></a><font SIZE="3" color="#800000"> |<a href="index7.htm"> </a></font><a href="index5.htm"><font SIZE="3" color="#800000">西部土地 </font></a><font SIZE="3" color="#800000">| <a href="index4.htm">重点工程</a> | <a href="index3.htm">西部之最</a> <a href="index6.htm">| 西部政策 </a>| <a href="index1.htm">它山之石</a> | <a href="index2.htm">西部论坛 | </a><a href="mailto:titi@263.cn">与我联系</a></font></td> </tr> </table> </center></div>

50

2.5 HTML综合实例(源代码)
其代码如下:(续上)
<font SIZE="3"><div align="center"><center> <table border="0" width="99%" height="152" cellspacing="0" cellpadding="0"> <tr>

<td width="103%" height="146" valign="top"><pre>
西部地区经济建设究竟需要哪些人才呢?根据中央“西部开发计划”</pre> <pre>中的重点开发项目和西部地区现状分析,目前西部地区主要缺乏科技开发</pre> <pre>人员、投资创业人员、教育人才和中高级企业经营管理人员等。 </pre> <pre>但西部地区具有丰富的自然资源,大量的自然资源尚未开发与利用。</pre> <pre>最近中央专门制定开发西部的重点投资项目目录,以吸引外商投资和国</pre> <pre>内科技人员带技术开发。因而,西部建设中,科技开发人员是重中之重。</font></pre>

<pre><font size="2">由全国科技精英组成“智囊团”为西部地区经济发展出谋划策;以大幅</font></pre>
<pre><font size="2">度减免税等优惠政策,鼓励、吸引东部地区人才带项目到西部投资创业。</font></pre> <font SIZE="3"><p> </font></td> <td width="44%" height="146"><p align="right"><img src="images/西部能源.jpg" width="300" height="239" alt="西部能源.jpg (25523 字节)"></td> </tr> </table> </center></div><div align="center"><center> <table border="0" width="100%" cellspacing="0" cellpadding="0"> <tr> <td width="100%"><img border="0" src="images/line200.gif" width="748" height="26"></td> </tr> </table> </center></div>

51

2.5 HTML综合实例(源代码)
其代码如下: (续上)
<div align="center"><center> <table border="0" width="100%" height="206" cellspacing="0" cellpadding="0"> <tr>

<td width="43%" height="200" valign="top"><font
size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 西部大开发还要加强生态环境的保护建设,继续大力加强农业的基础地位,同时加快将资源优势转化为经济优势,从实际出发,发展特色经 济。加强旅游事业的管理,把旅游业及相关产业发展成为西部地区的支柱产业之一。<br> 李子彬强调,西部地区应深化改革,进一步提高开放水平。他还认为,西部大开发应当以现有的经济基础较好,人口较密集,沿交通干线和 城市枢纽地区作为开发的重点区域,依托欧亚大陆桥、长江黄金水道、西南出海通道,促进陇海和长江上游等经济带的形成。</font> </td>

<td width="50%" height="200"><img src="images/中国西部.GIF" width="400" height="308"
alt="中国西部.GIF (61701 字节)"></td> <td width="41%" height="200" valign="top"><pre style="line-height:15px"> 在西部加快建立并完善社会主义 市场经济体制,进一步提高西部地区对内对外开放水平。实现社会全面进步,切实提高人民生活水平。突出加强文化、卫生、体育、计划生育 等社会事业,逐步使西部地区各族人民都能享受到最基本的公共服务。<font size="2">西部大开发战略是在我国经过 50年的经济建设, 特别是20年的改革开放和社会主义现代化建设的大背景下提出并实施的,所以既不能沿用传统计划经济时期的区域开发模式,也不能照搬东部 地区的发展模式。</font></pre> <font SIZE="3"><pre style="line-height:15px"> </font></td> </tr> </table> </center></div> </body> </html> </pre>

52

第3章 JavaScript脚本语言介绍
? 3.1 什么是JavaScript ? 3.2 JavaScript的基本语法 ? 3.3 变量和数据类型
? ? ? ? ? ? 3.3.1 3.3.2 3.3.3 3.3.4 基本数据类型 常量 变量 表达式和运算符

? 3.4 程序控制语句
3.4.1 选择语句 3.4.2 循环语句

? 3.5 函数 ? 3.6 对象、方法、属性和事件
? ? ?
? ? ? ?

? 3.7 JavaScript综合举例
3.7.1 3.7.2 3.7.3 3.7.4 页面交互功能的应用 状态栏的应用 鼠标事件的应用 窗口的应用
53

3.6.1 基本概念 3.6.2 常用对象的介绍 3.6.3 常用事件的应用

3.1 什么是JavaScript
JavaScript是由一种基于对象(Object)和事件驱

动(Event Driven)并具有安全性能的脚本语言。它是
通过嵌入在标准的HTML语言中实现的。它的出现弥补 了HTML语言的不足之处,它是Java与HTML的折衷。 它的开发环境简单,不需要Java编译器,而是直接运 行在Web浏览器中,因而使用它与HTML超文本标记语 言、Java脚本语言结合在一起,来实现一个Web页面 中链接多个对象,与Web客户交互作用,从而可以开

发客户端的应用程序等。
54

3.2 JavaScript的基本语法
【例3-1】利用JavaScript编写的Hello World程序。 如图3-1-1、图3-1-2所示。
其代码如下:
<html> <head> <title>exam3-1.htm</title> </head> <script language="JavaScript"> <!-alert("Hello World!"); --> </script> <body> Hello World! </body> </html>

通过这个简单的实例,在HTML语言中插入JavaScript脚本语言的语法格式为: <Script language="JavaScript"> <!-JavaScript代码 --> </Script> 注意:JavaScript语句对大小写比较敏感,因此,在写JavaScript语句时要注意。
55

3.3 变量和数据类型
JavaScript脚本语言同其它语言一样,有它自身的基本数据类型、 表达式和算术运算符以及程序的基本框架结构。JavaScript提供了四种 基本的数据类型用来处理数字和文字,而变量提供存放信息的地方,表 达式则可以完成较复杂的信息处理。 【例3-2】JavaScript的变量定义、声明及赋值的演示。如图3-2所示。 其代码如下: <html>
<head><title>exam3-2.htm</title></head> <body> <script language="JavaScript"> var x1=5; x2=7; x3=x1+x2; x4=x1<x2; x5=”运算结果如下:” document.write(x5,x1, "+",x2, "=",x3," --- "x4); </script> </body></html>

通过这个实例,可以得到JavaScript变量的定义方法和赋值方法等, 其语法格式为: var 变量名=数据的值
56

3.3.1 基本的数据类型
在JavaScript中四种基本的数据类型为:
● 数值(整数和实数)
● 字符串型(用" "或’ ’括起来的字符或数值) ● 布尔型(使用True或False表示)

● 空值

在JavaScript的基本类型中的数据可以是常量,也 可以是变量。由于采用弱类型的形式,因而一个数据的

变量或常量不必首先作声明,而是在使用或赋值时才确
定其数据的类型。当然也可以先声明该数据的类型,它 是通过在赋值时自动说明其数据类型的。
57

3.3.2 常量
JavaScript的常量主要有以下几种:
● 整型常量(又称字面常量,是不能改变的数据。可以使用十六进 制、八进制和十进制表示其值) ● 实型常量(由整数部分加小数部分表示,如13.48、197.99。 可以使用科学或标准方法表示:3E6、2e8等) ● 布尔常量(只有True或False两种值,主要用来说明或代表是或 否状态) ● 字符型常量(使用单引号或双引号括起来的一个或多个字符。如 "JavaScript"、"1234567890"等 ● 空值(即null,表示什么也没有。如试图引用没有定义的变量, 则返回一个null值) ● 特殊字符(同C语言一样,是一些以反斜杠开头的不可显示的特 殊字符。通常称为控制字符)
58

3.3.3 变量
变量的主要作用是存取数据、提供存放信息的容器。对于变量必须明确变量的 命名、变量的类型、变量的声明及其变量的作用域。 JavaScript中的变量命名同其他语言非常相似,不同之处在于: ● 必须是一个有效的变量,即变量以字母开头,中间可以出现数字如x1、y2等。 除下划线外,变量名不能有空格、+、-和其他符号。 ● 不能使用JavaScript中的关键字作为变量。JavaScript定义了40多个关键字, 供内部声明用的,如Var、int、double、true等。 在JavaScript中,变量可以用命令Var声明: var mytest;------ 定义一个mytest变量,但没有赋予它的值 var mytest=“This is a test”;------ 定义一个mytest变量,同时赋予了它的值 在JavaScript中,变量也可以不作声明,而在使用时再根据数据的类型来确定其变 量的类型。如: x1=200 x2="345" x3=True x4=12.34等 其中x1为整数,x2为字符串,x3为布尔型,x4为实型。
59

3.3.4. 表达式和运算符
在定义完变量后,就可以对它们进行赋值、改变、计算

等一系列操作,这一过程通常由表达式来完成,可以说它是
变量、常量、布尔及运算符的集合。表达式可以分为算术表 达式、字串表达式、赋值表达式及布尔表达式等。 运算符是完成操作的一系列符号,在JavaScript中有:
● 算术运算符(如+、-、*、/等)

● 比较运算符(如!=、==等)
● 逻辑布尔运算符(如!、|、||等) ● 字串运算符(如+、+=等)

60

3.4.1 选择语句
【例3-3】if-else语句的使用。如图3-3所示。
其代码如下:
通过这个实例,可以得到if-else选择语句结构,其语法格式为: if(条件表达式){ 语句段1; …… } else { 语句段2; …… } 功能:若条件表达式为true,则执行语句段;否则执行语句段2。 if-else语句是JavaScript中最基本的控制语句。如果有多个分支, 则需嵌套使用if-else语句,其语法格式为: if(布尔值)语句1; else(布尔值)语句2; else if(布尔值)语句3; …… else 语句4; 在这种情况下,每一级的布尔表达式都会被计算,若为真,则执行其 相应的语句,否则执行else后的语句。
<html> <head> <title>exam3-3.htm</title> </head> <body> <script language="JavaScript"> var score=75; if (score<60){ document.write("不合格"); }else{ document.write("合格"); } </script> </body> </html>

61

3.4.2 循环语句(一)
【例3-4】for循环语句的使用。如图3-4所示。
其代码如下:
通过这个实例,可以得到for循环语句结构,其语法格式为: for(初值;条件;步长表达式) { 语句集; } 功能:每当进行循环以前都要判断条件,条件为true时,执行语句 集,否则跳出循环体,每循环一次计数变量增加或减少步长表达式 的值。 初值用来设置计数变量并给它赋值。步长表达式用来说明计数 变量的变化规律。三个主要语句之间,必须使用逗号分隔。 for循环是一般目的的循环。而它的一种特殊应用for…in循环则 用于在对象的所有属性内自动移位,其语法格式为: for(j in 对象) { 语句集; } 循环会从0增加j,直到达到该对象中的最后一个属性的下标为止。
<html> <head> <title>exam3-4.htm</title> </head> <body> <script language="JavaScript"> var n=10,s=0; for(var i=1;i<=n;i++) { s=s+i; } document.write("1+2+3+…+",n,"=",s); </script> </body> </html>

62

3.4.2 循环语句(二)
【例3-5】while循环语句的使用。如图3-5-1所示。
其代码如下:
通过这个实例,可以得到while循环语句结构,其语法格式 为: while(条件) { 语句集; break; continue; } 功能:每当进行循环以前都要判断条件,条件为true时, 执行语句集,否则跳出循环体。其中break语句可以完全终 止循环,即使循环没有结束也如此。Continue语句可跳到 语句集的第一句进行下一次循环。 若上述代码中,在语句“s=s=i;”后添加语句 “if(i==5) break;”,则运行后,浏览器显示如图3-5-2所 示。
<html> <head> <title>exam3-5.htm</title> </head> <body> <script language="JavaScript"> var n=10,s=0,i=1; while(i<=n) { s=s+i; i=i+1; } document.write("1+2+3+…+",n,"=",s); </script> </body> </html>

63

3.5 函数
函数为程序设计人员提供了一个非常方便的能力。通 常在进行一个复杂的程序设计时,总是根据所要完成的功 能,将程序划分为一些相对独立的部分,每部分编写一个 函数。从而,使各部分充分独立,任务单一,程序清晰, 易懂、易读、易维护。JavaScript函数可以封装那些在程 序中可能要多次用到的模块。并可作为事件驱动的结果而 调用的程序。从而实现一个函数把它与事件驱动相关联。 这是与其它语言不同的地方。 通常,在进行复杂的程序设计时,总是会发现有些程 序段或模块需要多次执行。为了解决此类问题,可以将之 定义为一个函数,使之相对独立。JavaScript函数就可以 封装那些在程序中可能要多次用到的模块,并可作为事件 驱动的结果而调用的程序,从而实现一个函数把它与事件 驱动相关联。
64

3.5 函数(实例)
【例3-6】函数的定义。如图3-6所示。 其代码如下: <html>
通过这个实例,可以得到函数定义的一般格式为: function 函数名(参数1,参数2,…) { 语句集; } 功能:定义一个称为“函数名”的函数。 通常,函数放在HTML文件的<head>头部事 先定义,然后被HTML文件<body>部分中的语句 调用。需要注意的是: ①函数开头必须为关键字function; ②函数名是区分大的; ③可以通过引用函数名来调用一个函数,同时 参数必须放在括号中,用逗号隔开; ④在程序结束时必须使用return将值返回。
<head> <title>exam3-6.htm</title> <script language="JavaScript"> function welcome(){ alert("Hello,欢迎光临本站!"); } </script> </head> <body onload="welcome()"> </body> </html>

65

3.6.1 基本概念
1、什么是对象
对象是指世上的任何事物,如汽车、人、计算机等,而在 JavaScript语言中,主要是指在计算机中出现的window对象、 form对象、date对象以及document对象等。

2、什么是属性和方法
属性是对对象特征的描述,如人的身高、体重等,方法是控 制对象动作行为的方式,如人会吃饭、走路等。又如document 对象具有属性lastModified和方法write等。

3、什么是事件
事件是指可被一个对象所识别的动作。JavaScript能识别这 些动作,并能够建立程序对这些事件进行响应。比如人饿了就要 吃饭,我们知道,人是一个对象,饿就是一个事件,而吃饭就是 方法。
66

3.6.2 常用对象的介绍
1、string对象
属性: length 表示字符串中字符个数,包括所有符号。 方法:主要有 ① 锚点anchor(),如同HTML中(a name="")一样; ② 有关字符显示的控制方法,如big(),small(),italics(), bold(),blink(),fixed(),fontsize(size)等; ③ 字体颜色fontcolor(color); ④ 字符串大小写转换toLowerCase()和toUpperCase(); ⑤ 字符搜索indexof[character,fromIndex],表示从指定 formIndex位置开始搜索character第一次出现的位置; ⑥ 返回子串substring(start,end),表示从start开始到end的字符 全部返回。
67

3.6.2 常用对象的介绍(续上)
2、Date对象
属性:无。
方法: ① 获取日期和时间,有getYear()、getMonth()、getDate()、

getDay()、getHours()、getMintes()、getSeconds()、
getTime()等; ② 设置日期和时间,有setYear()、setMonth()、setDate()、 setHours()、setMintes()、setSeconds()、setTime()等。

68

3.6.2 常用对象的介绍(续上)
3、windows对象
windows对象是每个窗口或框架的顶层对象,且是文档、位置及历史对 象的父对象。 属性:主要有 frames 确定文档中帧的数目,帧作为实现一个窗口的分隔操作,起到 非常有用的价值。 Parent 指明当前窗口或帧的父窗口。 Defaultstatus 默认状态,它的值显示在窗口的状态栏中。 Status 包含文档窗口中帧中的当前信息。 Top 包括的是用以实现所有的下级窗口的窗口。 Window 指的是当前窗口 Self 引用当前窗口 方法:主要有 prompt() 弹出信息的输入窗口。 Alert() 弹出信息的输出窗口。

另外,JavaScript还提供了几个常用的输出方法。如document.write和 document.writln()等。
69

3.6.3 常用事件的应用
1、Load和Unload事件
Load和Unload事件可以使页面完成下载时生成Load事件,同样,当退出页 面时可以发生Unload事件。OnLoad和onUnload事件处理程序能够使 JavaScript命令在相应的时间内执行。它们可以控制一些活动的起始时间。 Click事件和onClick事件处理程序用于单击按钮和链接的地方时执行 JavaScript命令。该事件通常在下列基本对象中产生:
(1)button(按钮对象) (2)checkbox(复选框)或(检查列表框) (3)radio(单选按钮) (4)reset button(重置按钮) (5)submit button(提交按钮)

2、Click事件

例如: <form><input type="button" value="" onChick="change()"></form> 在onChick等号后,可以使用自己编写的函数作为事件处理程序,也可以使 用JavaScript中的内部函数。同时,还可以直接使用JavaScript的代码等。又 如前面例子中:
<input type="button" value="" onChick=alert("Hello World")>
70

3.6.3 常用事件的应用(续上)
3、MouseOver事件
通常,当我们将鼠标放到链接上面移动后,则产生MouseOver事 件来表达即将要发生的情况。具体在后面的综合实例中做详细介绍。

4、Change事件
一般来说,Change事件与onChange事件处理程序用于当正在进 行的动作改变时执行JavaScript命令。比如说,当利用text或 textarea元素输入字符值改变时引发该事件,同时当在select表格项 中一个选项状态改变后也会引发该事件,例如: <form><input type="text" name="xm" value="xxx" onChange="check(xm)"></form>

5、onFocus事件和onBlur事件
当用户单击text对象或textarea对象以及select对象时,产生 onFocus事件,此时使该对象成为当前对象。而当text对象或 textarea对象以及select对象不再拥有焦点时,则该对象退到后台, 引发该onBlur事件,它与onFocus事件是对应的关系。
71

3.7.1 页面交互功能的应用
【例3-7】通过用户的输入,显示用户的信息。如图3-71、图3-7-2所示。
其代码如下:
<html> <head> <title>exam3-7.htm</title> <script language="JavaScript"> function getname(str) { alert("Hello,"+str+" 欢迎光临本站!"); } </script> </head> <body> 请输入您的大名: <form> <input type="text" name="name" onBlur="getname(this.value)" value=""> </form> </body> </html>
72

3.7.2 状态栏的应用
【例3-8】在状态栏上显示跑马灯的效果。如图3-7所示。
其代码如下:
<html><head><title>exam3-8.htm</title> <script language="JavaScript"> var txt="怎么样,跑马灯的效果如何?,想不想试试"; var lentxt=txt.length; var width=100; var pos=1-width; function scroll(){ pos++; var scroller=""; if(pos==lentxt){ pos=1-width; } if(pos<0){ for(var i=1;i<Math.abs(pos);i++){ scroller=scroller+" ";} scroller=scroller+txt.substring(0,width-i+1); } else{ scroller=scroller+txt.substring(pos,width+pos); } window.status=scroller; setTimeout("scroll()",200); } </script> </head> <body onload="scroll();return true;"> 注意,状态栏马上就要开始跑啦!!! </body></html>

73

3.7.3 鼠标事件的应用
【例3-9】通过鼠标事件自动弹出对话框。如图3-9-1所示。
其代码如下:
<html> <head> <title>exam3-9.htm</title> <script language="JavaScript"> function welcome(){ alert("Hello,欢迎光临本站!"); } </script> </head> <body onload="scroll();return true;"> <a href="" onMouseOver="welcome()"> 鼠标移来试试看!</a> </body> </html>

当用户将鼠标移至超链接处,立即 弹出如图3-9-2所示的消息框。
74

3.7.4 窗口的应用
【例3-10】当打开某一页面,将自动弹出一个新窗口。 如图3-10所示。
其代码如下:
<html><head> <title>exam3-10.htm</title> <script language="JavaScript"> function winopen(){ msg=open("","displaywindow","toolbar=no,di rectories=no,menuba=no,width=400,height=1 50"); msg.document.write("<head><title>最新消息 </title></head>"); msg.document.write("<center><h1>最新新闻 </h1><h2>新产品面世啦</h2></center>"); } </script> </head> <body onload="winopen()"> 主页面 </body></html>
75

第4章 VBScript脚本语言介绍
? ? ? ? 4.1 4.2 4.3 4.4 什么是VBScript VBScript的基本格式 变量和数据类型 程序控制语句

? 4.5 函数
? ? ? ? ? ? 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.5.6

? 4.4.1 选择语句 ? 4.4.2 循环语句 转换函数 输入输出函数 字符串函数 日期和时间函数 数学函数 检验函数

? 4.6 过程

? 4.6.1 sub子过程 ? 4.6.2 function函数
76

4.1 什么是VBScript
VBScript也是一种脚本语言,它同样是嵌入在标准的 HTML语言中实现的,其功能与JavaScript基本相同。但 由于VBScript脚本语言直接来源于VB(Visual Basic) 语言,而VB语言是风靡全球的一种学习简单、功能强大的 程序设计语言,因此VBScript也继承了VB的简单易学的 特点。 一般来说,脚本程序既可以放在客户端浏览器执行,也 可以在服务器端执行。对于ASP程序而言,通常我们把 VBScript放在服务器端执行,而JavaScript放在客户端浏 览器执行。在服务器端运行,通俗地说就是把脚本语言放 在<%和%>之间。有时为了方便或某种需要,也可以放 在客户端执行。
77

4.2 VBScript的基本格式
【例4-1】利用VBScript编写的Hello World程序。如 图4-1-1、图4-1-2所示。
其代码如下:
<html> <head> <title>exam4-1.asp</title> </head> <script language="VBScript"> <!-MsgBox "Hello World! " --> </script> <body> <%="Hello World!"%> </body> </html>

78

4.2 VBScript的基本格式(续上)
通过这个实例,在HTML语言中插入VBScript脚本语言的方式有两种, 即客户端浏览器执行和服务器端执行。 客户端浏览器执行时,其语法格式为:
<Script Language="VBScript"> <!-VBScript代码 --> </Script>

服务器端执行时,其语法格式为:
<Script Language="VBScript" Runat="Server"> <!-VBScript代码 --> </Script> 或 <% VBScript代码 %>

注意: VBScript语句对大小不区分,因此,在写VBScript语句时无需注意。
79

4.3 变量和数据类型
VBScript同JavaScript语言不一样,它只有一种数据类型,称为 Variant,也叫变体类型。Variant是一种特殊的数据类型,根据不同 的使用方式,它包含不同的数据类别信息。Variant变量中保存的数据 类型为变量的子类型。 【例4-2】VBScript的变量定义、声明及赋值。如图4-2所示。 其代码如下:
<html> <head><title>exam4-2.asp</title></head> <body> <% dim x1,x2,x3,x4,x5 x1=5 x2=7 x3=x1+x2 x4=x1<x2 x5="运算结果如下:" response.write x5 & x1 & "+" & x2 & "=" & x3 & " --- " & x4 %> </body> </html>

通过这个实例,可以得到VBScript变量的定义方法和赋值方法等,其语法格式为: dim 变量名 变量名=数据的值
80

4.3 变量和数据类型--1、Variant 子类型

Variant 子类型

除简单数字或字符串以外,Variant可以进一步区分数值信息 的特定含义。例如使用数值信息表示日期或时间。此类数据在与其 他日期或时间数据一起使用时,结果也总是表示为日期或时间。当 然,从Boolean值到浮点数,数值信息是多种多样的。Variant 包 含的数值信息类型称为子类型。大多数情况下,可将所需的数据放 进Variant中,而Variant也会按照最适用于其包含的数据的方式进 行操作。
Variant的数据子类型如表4-1所示。 一般来说,Variant变量回将其代表的数据子类型自动转换, 但有时候,也会遇到一些数据类型不匹配造成的错误,就像一个人 加一头牛等于什么的错误,这时,可是使用VBScript的转换函数来 强制转换数据的子类型。
81

4.3 变量和数据类型--子类型 Empty Null Boolean Byte 描 述

Variant 子类型

表4-1 Variant的数据子类型
未初始化的Variant。对于数值变量,值为 0;对于字符串变量,值为零长度字符串 ("")。 不包含任何有效数据的Variant。 包含True或False。 包含 0 到 255 之间的整数。

Integer
Currency Long Single Double Date (Time) String Object Error

包含 -32,768 到 32,767 之间的整数。
-922,337,203,685,477.5808 到 922,337,203,685,477.5807。 包含 -2,147,483,648 到 2,147,483,647 之间的整数。 包含单精度浮点数,负数范围从 -3.402823E38 到 -1.401298E-45,正数范围从 1.401298E-45 到 3.402823E38。 包含双精度浮点数,负数范围从 -1.79769313486232E308 到 -4.94065645841247E-324,正数 范围从 4.94065645841247E-324 到 1.79769313486232E308。 包含表示日期的数字,日期范围从公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日。 包含变长字符串,最大长度可为 20 亿个字符。 包含对象。 包含错误号。 82

4.3 变量和数据类型---常量
2、常量
常量是指具有一定含义的名称,用于代替数字或字符串,其值 从不改变。声明常量的意义就在于可以在程序的任何部分使用该 常量来代表特定的数值,从而方便程序的编写。例如在计算程序 中常采用PI来表示3.1415926,这样既不容易出错,程序也更加 简洁明了。 在VBScript中,通常使用关键字Const来声明常量。例如: Const MyString = "这是一个字符串。" Const PI=3.1415926 Const CutoffDate = #6-1-97# 注意: 最好采用一个命名方案以区分常数和变量。这样可以避免在运 行脚本时对常数重新赋值。例如,可以使用“vb”或“con”作常数 名的前缀,或将常数名的所有字母大写。将常数和变量区分开可 以在开发复杂的脚本时避免混乱。
83

4.3 变量和数据类型---变量
3、变量
同JavaScript变量定义一样,VBScript变量也是存储在内存中, 用来包含信息地址的名字。变量包含的信息被称为变量的值。例如:
<% x1=3 x2=4 x=x1+x2 %>

在VBSscript中,使用变量之前一般不需要预先声明它,赋值后自 动声明该变量,以后即可被引用。但编写长而复杂的程序,建议还是先 声明再使用。这样便于程序的调试,当敲错了变量名,能及时产生错误。 像许多高级语言一样,VBScript变量根据作用域的不同也可分为过 程级变量和全局级变量。变量的作用域可以根据需要,由声明它的位置 决定。

84

4.3 变量和数据类型---数组
4、数组
数组的命名、声明、赋值和使用同前面的变量基本上是一致的,不 同的是需要定义数组中的项目数。例如:
<%dim a(2) a(0) = 1 a(1) = 2 a(2) = 3 sum = a(0) + a(1) + a(2) %> <%dim a(3,4) a(1,2) = 10 %>

一般来说,VBScript中的数组下标是从0开始计数,故上述定义的 a(2)有3项。对于多维数组的声明也很简单,例如:

另外,还可以声明一个变长数组,或称为动态数组,即声明数组时可以 不确定数组项目数,使用时再确定,例如:
<%dim a() redim a(4) a(2) = "欢迎" redim a(6) a(5) = "光临" %> '定义一个变长数组 '使用时需用redim '赋值 '一般,可以任意多次定义这个数组

85

4.3 变量和数据类型---运算符
5、运算符
在VBScript中,几乎继承了Visual Basic的所有类别的运算符,包 括算术运算符、比较运算符、逻辑运算符和连接运算符。例如: <% sum = a + b*2 + c / 3 '算术运算符 str1 = "欢迎" & user_name '连接运算符,user_name是一个字符串型变量 %> 具体各种运算符及说明如表4-2所示。 通常,当一个表达式中包含多个运算符时,先计算算术运算符,其 次连接运算符,再次比较运算符,最后计算逻辑运算符。在同一类运算 符中,应按从左到右的顺序进行计算。在实际应用时,往往充分利用括 号“()”来强制改变顺序,以达到自己的要求。
86

4.3 变量和数据类型---运算符
表4-2 各种运算符及其说明
算术运算符 符号 + * 说明 加 减 乘 符号 = > < 比较运算符 说明 等于 大于 小于 逻辑运算符 符号 Not And Or 说明 逻辑非 逻辑与 逻辑或 连接运算符 符号 & 说明 用于连接两 个字符串

/
\ Mod ^


取整除法 取模 幂

>=
<= <> Is

大于等于
小于等于 不等于 比较两个对象 是否相同

Xor
Eqv Imp

逻辑异或
逻辑等价 逻辑隐含

87

4.4.1 选择语句(一)
1、if…then…else语句
该语句用于判断的条件是True或False,并根据判断的结果指定要运行的语句。 一般来说,有以下几种形式:
(1) if 条件语句 then 语句段 end if if 条件语句 then 语句段1 else 语句段2 end if if 条件语句1 then 语句段1 elseif 条件语句2 then 语句段2 …… else 语句段n+1 end if

说明:若条件语句为true,则执行下面的语句段,否则跳出该条件语句。
(2)

说明:若条件语句为true,则执行语句段1,否则执行语句段2。
(3)

说明:若条件语句1为true,则执行语句段1,然后跳出if语句;若条件语句2为true, 则语句段2,然后跳出if 语句;……;若条件都不符合,执行语句段n+1。
88

4.4.1 选择语句(实例)
【例4-3】根据分数给出相应的等级。如图4-3所示。
其代码如下:
<% Option Explicit '放在程序首行,强制变量声明 %> <html><head> <title>exam4-3.asp</title> </head> <body> <% Dim Grade Grade=85 '直接赋值,一般来说应该是传过来的参数, '通常也可以从数据库中读出,或由程序计算得出。 If Grade>=90 Then Response.write "优秀" Elseif Grade>=80 and Grade<90 Then Response.write "良好" Elseif Grade>=70 and Grade<80 Then Response.write "中等" Elseif Grade>=70 and Grade<80 Then Response.write "及 格" Else Response.write "不 及格" End if %> </body></html>

89

4.4.1 选择语句(二)
2、select case语句
该语句,其实是if…then…else语句多条件时的另一种形式。在某些时候运用, 可以使程序更加简洁。其语法格式如下:
select case 表达式 case 结果1 语句段1 case 结果2 语句段2 …… case 结果n 语句段n case else 语句段n+1 end select

说明:首先对表达式进行运算。该运算可以为数学运算或字符串运算。然后将运 算结果依次与结果1到结果n+1作比较,当找到与计算结果相等的结果时就 执行该语句段,执行完毕就跳出select case条件式。而当运算结果与所有 的结果都不相等时,就执行case else后面的语句段n+1。
90

4.4.1 选择语句(实例)
【例4-3】根据等级分给出相应的信息。如图4-4所示。
其代码如下:
<% Option Explicit %> <html> <head> <title> exam4-4.asp</title> </head> <body> <% Dim Grade Grade="良好" Select Case Grade Case "优秀" Response.write "你太厉害了,非常棒!" Case "良好" Response.write "很好,争取更上一层楼!" Case "中等" Response.write "尚可,比上不足比下有余!" Case "及格" Response.write "真幸运,及格万岁!" Case ELse Response.write "糟啦,要补考了!" End Select %> </body> </html>

91

4.4.2 循环语句
在VBScript中,循环类型可分为三类: ① 在循环条件变为“假”之前重复执行语句; ② 在循环条件变为“真”之前重复执行语句; ③ 按照指定的次数重复执行语句。 通常,有以下几种循环语句: for…next: 指定循环次数,使用计数器循环运行语句。 do…loop: 当条件为true时或条件变为true之前,重复 执行语句段。 for each…in:对数组中的每个元素或对象集中的每一项 进行重复一组语句。 while…wend:当循环条件为“真”时循环。
92

4.4.2 循环语句(一)
1、for…next循环
该循环是一种强制型循环,用语将语句段运行指定的次数。 在循环体中使用计数器变量,该变量随每次循环增加或减少。其 语法格式如下: for counter = start to end [step step] 语句段 next 其中: counter 循环的计数器变量 start 计数器的初始值 end 计数器的终值 step 计数器的步长,可以为正、负、整数 和小数,默认值为1

93

4.4.2 循环语句(实例)
【例4-5】for…next循环的使用。如图4-5所示。
其代码如下:
<% Option Explicit %> <html> <head> <title>exam4-5.asp</title> </head> <body> <% Dim Sum,I,N Sum=0 N=10 '直接赋值,一般来说应该是传过来的参数, '通常也可以从数据库中读出,或由程序计算得出。 '循环,从1加到N For I=1 to N Sum=Sum+I Next Response.write "1+2+3+…+" & Cstr(N) & "=" & Cstr(Sum) %> </body> </html>

94

4.4.2 循环语句(二)
2、do…loop循环
该循环是一种条件型的循环,当条件为true时或条件变为true之前,重复执 行语句段。一般来说,有两种类型:入口型循环和出口型循环。 (1)入口型循环 该类循环是先判断条件,再执行循环体语句段。其语法格式如下:
do while 条件1 语句段 loop 或 do until 条件2 语句段 loop

说明:前者是while型循环,它首先检查条件1是否为true,如果为true,才会 进入循环体中执行语句段,否则跳出循环;后者是until型循环,它首先检查条 件2是否已变为true,如果为true,就跳出循环,否则进入循环体中执行语句段。 (2)出口型循环 该类循环是先执行循环体语句段,再判断条件。其语法格式如下:
do 语句段 loop while 条件3 或 do 语句段 loop until 条件4

95

4.4.2 循环语句(实例)
【例4-6】do…loop循环的使用。如图4-6所示。
其代码如下:
<html><head> <title>exam4-6.asp</title></head> <body> <%Dim Sum,I,N N=10 '直接赋值,一般来说应该是传过来的参数,通常也可以从数据库中读出,或由程序计算得出。 '先判断条件,再执行循环体 Sum=0 I=1 Do While I<=N Sum=Sum+I I=I+1 Loop Response.write "do while…loop:" & "1+2+3+…+" & Cstr(N) & "=" & Cstr(Sum) & "<br>" Sum=0 I=1 Do until I>N Sum=Sum+I I=I+1 Loop Response.write "do until…loop:" & "1+2+3+…+" & Cstr(N) & "=" & Cstr(Sum) & "<br>" '先执行循环体,再判断条件 sum=0 I=1 Do Sum=Sum+I I=I+1 Loop while i<=N Response.write "do…loop while:" & "1+2+3+…+" & Cstr(N) & "=" & Cstr(Sum) & "<br>" sum=0 I=1 Do Sum=Sum+I I=I+1 Loop until i>N Response.write "do…loop until:" & "1+2+3+…+" & Cstr(N) & "=" & Cstr(Sum) %></body></html>

96

4.4.2 循环语句(三)
3、for each…in循环
该循环是一种特殊的循环,它用于对数组中的每个元素或对象集中 的每一项进行重复一组语句。比如说,在ASP中经常要返回一个数据集 合等。其语法格式如下:
for each 元素 in 集合 语句段 next
<% sum = 0 N = 10 for i = 1 to N sum =sum+i if sum>30 then exit for '如果sum大于30,则强行退出循环 end if next %>

4、while…wend循环
while 条件 语句段 wend

该循环是一个不太常用的循环语句。因为它能实现的功能, do…loop也能实现。建议一般不要使用。其语法格式如下:

5、强行退出循环

一般情况下,都是根据条件判断退出循环,但有时候需要强行退出 循环。其方法如下:
(1)在for…next循环中,使用跳出循环命令exit for; (2)在do…loop循环中,使用跳出循环命令exit do。

97

4.5.1 转换函数
在VBScript中,虽然Variant变量一般会将其代表的数据子类型自动 转换成合适的数据类型。但有时候也会造成一些数据类型不匹配的错误, 这时,往往需要使用转换函数来强制转换数据的子类型。常见的转换函数 如表4-3所示。

函数
CStr(Variant) Cdate(Variant) Cint(Variant) CLng(Variant) CSng(Variant) CDbl(Variant) CBool(Variant)

功能
将变量Variant转化为字符串类型 将变量Variant转化为日期类型 将变量Variant转化为整数类型 将变量Variant转化为长整数类型 将变量Variant转化为Single类型 将变量Variant转化为Double类型 将变量Variant转化为布尔类型

98

4.5.2 输入输出函数
1、MsgBox函数
该函数告诉用户一些信息。其语法格式如下: MsgBox(prompt[,button][,title]) 其中: prompt 显示在窗口中的文字 button 可选项,用以指定窗口的外观和按钮的类型 title 可选项,显示在窗口标题中的文字

2、InputBox函数
该函数用于显示一个输入窗口,要求用户输入数据。其语法格式如下: string = InputBox(prompt[,title][,default]) 其中: string 文本框中的文字内容,即用户输入的内容 prompt 显示在窗口中的文字 title 可选项,显示在窗口标题中的文字 default 可选项,用于指定窗口中文本输入框内的默认字符串
99

4.5.2 输入输出函数(实例)
【例4-7】输入输出函数的使用。如图4-7-1、图4-7-2、 图4-7-3所示。
其代码如下:
<html> <head> <title>exam4-7.asp</title> </head> <body> <script language="VBScript"> <!-Option Explicit '强制要求变量必须声明 Dim xm1,xm2 '声明变量 xm1=InputBox("你最喜欢的人是","输入名称") xm2=InputBox("你最讨厌的人是","输入名称") MsgBox xm1 & "和" & xm2 & "是你最喜欢和最讨厌的两个 人" '注意&的用法 --> </script> </body> </html>

100

4.5.3 字符串函数
在ASP程序开发中,字符串的应用相当广泛,比如说用户注册时输入 的用户名、密码等选项信息,都是作为字符串来处理的。下面给大家列出 常见的字符串函数,如表4-4所示。
函数 Len(string) Trim(string) Mid(string,start,length) 功能 返回string字符串里的字符数目 将字符串前后的空格去掉 从string字符串的start字符开始取得length长度的字符 串,如果省略第三个参数表示是取从start字符 开始到字符串结尾的字符串

Left(string,length)
Right(string,length) Lcase(string) Ucase(string)

从string字符串的左边取得length长度的字符串
从string字符串的右边取得length长度的字符串 将string字符串里的所有大写字母转化为小写字母 将string字符串里的所有小写字母转化为大写字母

StrComp(str1,str2)

返回str1字符串与str2字符串的比较结果,如果两个 字符串相同,则返回0

101

4.5.4 日期和时间函数
在VBScript中,可以使用日期和时间函数来获得各种格式的日期和时 间。其常见函数如表4-5所示。
函数 Now Date Time Month Day WeekDay Year Now() Date() Time() Month(Date) Day(Date) WeekDay(Date) Year(Date) FormatDateTime(Date,vbShortDate) FormatDateTime(Date,vbLongDate) FormatDateTime FormatDateTime(Date,vbShortTime) FormatDateTime(Date,vbLongTime) 语法 功能 取得系统当前日期和时间 取得系统当前日期 取得系统当前时间 取得给定日期的月份 取得给定日期是几号 取得给定日期是星期几 取得给定日期的年份 显示短日期格式 显示长日期格式 显示短时间格式 显示长时间格式

102

4.5.4 日期和时间函数(实例)
【例4-8】日期和时间函数的使用。如图4-8所示。
其代码如下:
<% Option Explicit%> <html> <head> <title>exam4-8.asp</title> </head> <body> <% Dim out1,out2,out3 Out1="日期:" & Date() Out2="时间:" & Time() Out3="日期与时间:" & Now() %> <%=Out1%><br> <%=Out2%><br> <%=Out3%><br> </body> </html>

103

4.5.5 数学函数
在VBScript中,常见的数学函数如表4-6所示。 函数 Abs(number) 返回一个数的绝对值 功能

Sqr(number)
Int(number) Cos(number) Sin(number) Log(number) Tan(number) Rnd(number)

返回一个数的平方根
取整函数,返回小于等于number的第一个整数 返回角度的Cos值 返回角度的Sin值 返回一个数的Log值 返回角度的Tan值 返回一个随机数

104

4.5.6 检验函数

<% num = "ASP" if IsNumeric(num) then response.write "这是数字类型" else 在设计ASP程序中,有时为了防止某些人有意的胡乱填写或无意的遗 response.write "这不是数字类型" 漏了某些选项,需要程序对用户填写的内容进行检查等,此时,往往就要 end if 用到其检验函数。 %> 常见的检验函数如表4-7所示。
函数 功能 检查变量Variant的值,函数值为该变量的数据类型 检查变量Variant的值,如果Variant是Empty,则函数值为true 检查变量Variant的值,如果Variant是Null,则函数值为true 检查变量Variant的值,如果Variant是对象类型,则函数值为true

VarType(Variant) IsEmpty(Variant) IsNull(Variant) IsObject(Variant)

IsNumeric(Variant)
IsArray(Variant) IsDate(Variant)

检查变量Variant的值,如果Variant是数字类型,则函数值为true
检查变量Variant的值,如果Variant是数组类型,则函数值为true 检查变量Variant的值,如果Variant是日期类型,则函数值为true

105

4.6.1 sub子过程
sub子程序的语法格式如下: sub 子程序名(参数1,参数2,…) …… end sub 或 sub 子程序名() …… end sub 其中:“参数1,参数2,…”是指由调用过程传递的常数、变量或表达式。 利用这些参数,可以传递数据。若无参数,则必须使用空括号。 sub子程序的调用方式有两种: (1)使用call语句 call 子程序名(参数1,参数2,…) (2)不使用call语句 子程序名 参数1,参数2,…
106

4.6.1 sub子过程(实例)
【例4-9】sub子程序的使用。如图4-9所示。
其代码如下:
<%Option Explicit%> <html> <head> <title>exam4-9.asp</title> </head> <body> <% Dim user_name '声明一个变量作为实参 user_name="东东" Call Welcome(user_name) '调用子程序,显示欢迎信 息 '下面是子程序,用来显示欢迎用户的信息 Sub Welcome(Name) Dim Str '不能再声明Name了 Str=Name & ":你好,欢迎光临本站!" Response.Write Str '显示Str的值 End Sub %> </body> </html>

107

4.6.2 function函数
function函数的语法格式如下: function 函数名(参数1,参数2,…) …… end function 或 function 函数名() …… end function 其中:“参数1,参数2,…”是指由调用过程传递的常数、变量或表达式。 利用这些参数,可以传递数据。若无参数,则必须使用空括号。 与sub子程序不同的是function函数必须返回一个结果值,该值的 数据类型是Variant。 Function函数的调用方式有一种,即直接调用函数名,而且函数 名必须用在变量赋值语句的右端或表达式中。
108

4.6.2 function函数(实例)
【例4-10】function函数的使用。如图4-10所示。
其代码如下:
<%Option Explicit%> <html> <head> <title>exam4-10.asp</title> </head> <body> <% '下面是函数,用来计算两个数的平方 Function CountSum(x,y) '由于x,y为形式参数,在函数被调用时,其值由实际参数给出, '所以此处不能再定义 CountSum=x^2+y^2 End Function Dim Result Result=CountSum(3,7) '调用函数,计算3和7的平方和 Response.write "3和7的平方和等于"& Cstr(Result) '显示结果 %> </body> </html>

109

第5章 ASP的内置对象
? 5.1 从客户端获得信息的Request对象
? 5.1.1 Request对象简介 ? 5.1.2 获取信息的方法---Form和QueryString ? 5.1.3 得到服务器属性的方法---ServerVariables

? 5.2 向客户端输出信息的Response对象
? ? ? ? ?
? ? ? ?

5.2.1 5.2.2 5.2.3 5.2.4 5.2.5
5.3.1 5.3.2 5.3.3 5.3.4

Response对象简介 直接输出信息的方法---Write 引导客户端至另一个URL位置的方法---Redirect 关于Buffer属性 Request对象和Response对象的综合使用
Cookies集合简介 Cookies集合的操作---写入与读取 Cookies集合的属性 Cookies集合的应用
110

? 5.3 Cookies集合

第5章 ASP的内置对象(续上)
? 5.4 记载特定客户信息的Session对象
? ? ? ? 5.4.1 5.4.2 5.4.3 5.4.4 Session对象简介 利用Session存储信息 利用Session存储数组信息 Session对象的属性和方法

? 5.5 记载所有客户信息的Application对象
? ? ? ? 5.5.1 5.5.2 5.5.3 5.5.4 Application对象简介 利用Application存储信息 利用Application存储数组信息 Global.asa文件及应用

? 5.6 服务器Server对象

? 5.7 ASP内置对象的综合举例

? 5.6.1 设置Web服务器响应时间的属性--ScriptTimeout ? 5.6.2 创建ActiveX组件实例的方法---CreateObject ? 5.6.3 虚拟路径的转换方法---MapPath
111

变量

说明 HTTP请求中查询字符串中变量的值

5.1.1 Request对象简介 存取用户在窗体中输入的相关字段的值 Form
QueryString Cookies

Request对象是ASP内置对象中较为重要的一类对象。主要负责的是从客户 ServerVariables 指定的服务器环境变量的值 端获得具体的用户数据信息。也就是说,可以使用Request对象访问任何基于 ClientCertificate 在发送HTTP请求中储存的客户端证书中的字段值 HTTP请求传递的所有信息,包括从HTML表格用POST方法或GET方法传递的参 数、cookie和用户认证。Request对象使您还能够方便的访问客户端发送给服务 器的二进制数据。Request对象把用户信息保存在几个集合中,供ASP应用来使 用。 Request的语法:Request[.collection\property\method](variable) 表5-1是Request对象集合的相关变量。 变量说明QueryStringHTTP请求中查询字符串中变量的值Form存取用户在 窗体中输入的相关字段的值Cookies获取客户端中Cookies的内容 ServerVariables指定的服务器环境变量的值ClientCertificate在发送HTTP请求 中储存的客户端证书中的字段值 当用户不指定集合的名称时,ASP默认为以QueryString、Form、Cookie 和ServerVariable的顺序搜索所有的集合,当发现匹配的变量时,就认定他是要 引用的成员。当然,一般我们在使用时都指定是哪个集合成员,以便于提高程序 的效率。 例如:Request.Form("yourname")
112

获取客户端中Cookies的内容

5.1.2 获取信息的方法---Form
1、使用Form集合获取信息
我们使用Form变量是用来获取用户在窗体中填写的相关信息。但
是在使用Request.Form的对象时,HTML标记中的<FORM>必须使 用“POST”方法,否则将无法取得窗体中的字段信息。 Form的用法:Request.Form(Element)[(Index).Count] 其中,Request.Form(Element)的值为请求正文中所有Element 值构成的一个数组,通过调用Request.Form(Element).Count来确 定参数中值的个数。如果参数未进行关联,则Count的值为1。如果找

不到该项参数,则为0。如关联了多个值,则必须指定Index的值。
Index的值为1到Request.Form(Element).Count中的任意整数。

下面我们用一个例子来说明一下。
113

5.1.2 获取信息的方法---Form(实例)
【例5-1】
程序名:exam5-1.htm <html> <body> <form method="post" action="exam5-1.asp"> 姓名:<input type="text" name="stuname"><br> 性别:<select name="gender"> <option>男</option> <option>女</option> </select><br> 您的爱好有:<br> <input name="hobby" type="checkbox" value="体育">体育 <input name="hobby" type="checkbox" value="购物">购物 <input name="hobby" type="checkbox" value="阅读">阅读 <br> <input type="submit" name="Submit1" value="提交"> <input type="reset" name="Submit2" value="重置"> </form> </body> </html> 程序名:exam5-1.asp <% @ Language=VBScript %> <% Response.Expires=0 SName = Request.Form("stuname") SGender = Request.Form("gender") %> <html> 您的姓名:<% =SName%><Br><Br> 性 别:<% =SGender%><Br><Br> <% Response.Write"您的爱好有: <Br>" For i=1 to Request.Form("hobby").Count Response.Write Request.Form("hobby")(i)&"<Br>" Next %> </body> </html>

114

5.1.2 获取信息的方法---QueryString
2、使用QueryString集合获取信息
QueryString集合:一般用于检索客户HTTP请求中字符串变量的
值。 QueryString的用法: Request.QueryString(Variable)[(Index)|.Count] 其中,Variable指的是查询字符串中要检索的变量名称,Index和 Count的用法类似于Form集合的用法。 还有要说明的是,通常我们在地址栏中都是以QueryString变量的 方法传送变量名及数值。而且需要注意变量的名称与内容必须放在“?”

符号的后面。我们以一个简单的例子来说明其用法。
115

5.1.2 获取信息的方法---QueryString(实例)
【例5-2】
程序名:exam5-2.htm <html> <head> <title> This is a test!!</title> </head> <body> 用户发送的字符串变量为 strtest,内容为: <font color=red> <% =request.querystring("strtest") %> <Br> </font> </body> <html>

在你的IE中输入 http://localhost/aspweb/chapte r5/exam5-2.asp?strtest=asppro, 这时,IE会显示如图5-2所示。

116

5.1.3 得到服务器属性的方法---ServerVariables
当我们想获取服务器端的各种信息时,我们可以用 ServerVariables 集合来获得。 ServerVariables的用法: Request.ServerVariables(Server Environment Variable) 【例5-3】 读者在运行该程序以后即可看到所有的服务器端
程序名:exam5-3.asp <html> 试着根据自己所需要获得的参数来编写程序,以 <body> 获取服务器端的参数。 <form> <table border=1> <% for each i in Request.ServerVariables %> <tr> <td><% = i %></td> <td><% = Request.ServerVariables(i) %> </td> </tr> <%next %> </table> </form> </body> </html> 117

的相关参数,如图5-3所示。有兴趣的读者可以

5.2.1 Response对象简介
第一节我们谈到的Request对象是从客户端获取信息,而Response对象恰 恰相反,它的作用是将ASP程序运行后的结果信息发送到客户端。Response对 象不像Request对象那么简单,它具有很多的集合、属性和方法。在众多的类 别中,我们经常用到的是Write方法、Redirect方法以及Buffer属性。在以下的 几节中我们会重点介绍它们的用法。 首先,我们来看看Response对象的基本用法: Response.collection|property|method

1、Response的属性
Response对象具有很多属性,具体情况如表5-3所示。
属性 * Buffer ContentType Expires Status IsClientConnected 说明 说明了页输出是否有缓冲。 指定即将开始被送至客户端浏览器的信息种类,默 认值是text/HTML。 在浏览器中缓存的页面超时前,指定缓存的时间。 服务器返回的状态行值。 该值表明了客户端与服务器的状态是连接还是断开
118

5.2.1 Response对象简介(续上)
2、Response对象的方法
方法 Clear 清除所有缓冲中的HTML输出 说明

End
Flush * Redirect

立即停止当前正在处理的.ASP文件,并且将会返回当前缓冲区里的所有信息。
立刻将所有缓冲区内的信息发送到客户端 将重定向的URL发送给浏览器,并尝试连接

* Write

直接以HTML的方式输出信息

3、集合对象
对于Response而言,它的集合对象只有Cookies一种。它设置了Cookie 的值。如果指定的Cookie不存在,则自动的创建它。Cookies集合的具 体属性情况见下表。
属性 说明 该值只允许写,被指定时,将cookie发送到该域的请求中。 该值只允许写,指定Cookies存放在客户端浏览器中的有效期限。 该值只允许写,指定浏览器的网页必须在指定的路径下,该Cookies才允许被读取。 该值只允许读,指定Cookies是否包含关键字。
119

Domain
Expires

Path
HasKey

5.2.2 直接输出信息的方法---Write
Response的Write方法可以将任何类型的变量输出到浏览器上去。 我们可以用三种不同的方式去做同样的事情。下面我们用一个实际的例子 来阐述Write方法的用法。 【例5-4】
程序名:exam5-4.asp <html> <body> <% Dim Str1 Str1 = "1234" <%=Str1%> Response.Write(Str1 & "<br>") Response.Write("1234<br>") %> <%=Str1%> </body> </html>

其运行结果如图5-4所示。

120

5.2.3

引导客户端至另一个URL位置的方法---Redirect

Redirect将重定向的URL发送给浏览器,并尝试连接。

其语法为:
Response.Redirect URL 需要提醒大家注意的是:当调用该方法时,任何在当前 页面中显式设置的响应都将被终止。而替代它的是一个经过 重定向的URL。这个新的URL既可以是一个完整的网址,也 可以是一个HTML或ASP文件。

121

5.2.4 关于Buffer属性
1、Buffer的送出方法
Web服务器在解释ASP脚本的过程中,既可以将结果立即输出到客户 端的浏览器上,也可以把结果存放在缓冲区之中,等所有的ASP脚本执 行完毕以后,再将所有结果输出到浏览器上。 通常有三种方法可以操作Buffer: (1)在当前页面的所有服务器脚本全部处理完毕以后; (2)调用了End方法后,系统将终止当前的ASP脚本,并将原来已经完 成解释的脚本送到浏览器上加以显示; (3)选择使用Flush方法立刻将缓冲区的内容送到浏览器。

2、Buffer的设置
Buffer的设置语法为: Response.Buffer[=Flag] 其中,Flag参数决定是否缓冲输出。 当Flag标志为FALSE时,服务器在处理脚本的同时将输出发送到浏 览器,此种方式为默认方式。 当Flag标志为TRUE时,除非当前页面的所有ASP脚本处理完毕或调 用了End或Flush方法,否则服务器不将缓冲送给浏览器。
122

5.2.5

Request对象和Response对象的综合使用

【例5-5】演示如何向服务器发送数据,在提交表单后如何显示出提交的 结果。 <% Else %>
程序名:exam5-5.asp <html> <body> <% Response.Expires=0 If Request.ServerVariables("Content_Length") <> 0 Then '通过Content_Length来判断时候已经提交过信息 strName=Trim(Request.Form("yourname")) ' 使用Trim函数来删除首尾多余的空格,下同! strSex=Trim(Request.Form("sex")) strLiuyan= Trim(Request.Form("message")) strMessage=Replace(strLiuyan,vbcrlf, "<br>"& vbcrlf) %> <html> <body> 您的姓名: <%=strName%><br> 性 别: <%=strSex%><br> 留 言: <br><br><br> <%=strMessage%><br><br><br> <% Response.Write "您共选择了" & Request.Form("hobby").Count & "项爱好:" & "<br>" For i=1 to Request.Form("hobby").Count Response.Write Request.Form("hobby")(i) & "<br>" Next %> </body> </html>

<html> <body> <form Method="post" action= "<%Request.ServerVariables("Script_name")%>"> 姓名:<input type="text" name="yourname"><br> 性别:<select name="sex"> <option>男</option> <option>女</option> </select><br> 留言:<textarea name="message"> 欢迎 请填写完您的留言 </textarea><br> 您的爱好有:<br> <input name="hobby" type="checkbox" value="体育">体育 <input name="hobby" type="checkbox" value="购物">购物 <input name="hobby" type="checkbox" value="阅读">阅读 <br> <input type="submit" name="Submit1" value="提交"> <input type="reset" name="Submit2" value="重置"> </form> </body> </html> <%End If%>

其运行结果如图5-5-1、图5-5-2所示。
123

5.3.1 Cookies集合简介
Cookies可以理解成存放在客户端的相关数值的集合,它经常被用 于在客户端上存储一些数据,从而在下一次客户重新登陆该网站时它是 有效的。也就是说:第一次有服务器端写入客户端的系统中。以后每次 访问该站点时,客户端都是先发送Cookie到服务器端,由服务器进行分 析,分析完成以后产生HTML代码再返回给客户端。比方说:现在很多高 校图书馆的主页上都允许你自定义你的WEB站点--我的图书馆。实际上 是根据你自己的喜好设置一些参数选项。站点在你的客户机上存储一个 Cookie,并在每次访问该站点时检索这个Cookie。站点从Cookie中的 参数中就会知道你是谁,你曾经访问过本站以及根据你设定的参数进行 界面以及其他选项的更改。 前面我们已经讨论过,可以用Response对象将Cookie写入客户机, 同时,Request对象的Cookie集合也允许用户从客户机上检索Cookie的 值。 Cookie集合的用法为: Request.Cookies(Cookie)[(Key)|.Attribute]
124

5.3.2 Cookies集合的操作---写入与读取
我们一般用Response对象的Cookies来写入Cookies Cookie可以用两种方式来写入,单值cookie实际上是一个一般的类ASP集 合。我们说,在ASP中,集合的每个成员可能自身也是一个集合,包含这种信 息的cookie通常被称为多值Cookie。创建一个单值的Cookie较为简单,如下 所示:Response. Cookies("FieldsName")=变量或字符串;创建一个多值的 cookie,可以使用如下命令:Response.Cookies("FieldsName")("SubItem-Name")="Sub-Item-Value"。Cookies的Response.Cookies程序段 必须放在〈Html〉标记之前,且不可以有其它的Html代码。另外,我们还必须 在Cookies中使用Expires设定有效期,Cookies才能真正地写入客户端的硬盘 中,否则只是临时的。 具体用法为:Response. Cookies("FieldsName")=变量或字符串 如:Response.Cookies("stuname")="LiMing" 读取Cookies的基本语法为:Request.Cookies("CookieName") 可以将Request值当作一个变量看待,执行下面的代码,将取回名字为 stuname的cookie值,并存入变量MyCookie: MyCookie=Request.Cookies("stuname") 执行下面的代码,将判断名字为stuname的cookie值是否为“Yes”: If Request.Cookies("stuname")="Yes" then
125

For Each objItem In Request.Cookies If Request.Cookies(objItem).HasKey Then For Each objItemKey in Request.Cookies(objItem) Response.Write objItem & " (" & objItemKey & ") =" & Request.Cookies(objItem)(objItemKey) &"" Next Else ASP的属性有四种:Domain,Expires,HasKey以及Path。" = "& Response.Write objItem & Request.Cookies(objItem) & "" 首先,我们来看看命名Cookie时要用到的两个属性:Domain和Path属性。同其 End If 他变量的命名一样,合理的命名cookie,有利于在程序中方便的使用它。你可以使用下 Next

5.3.3 Cookies集合的属性

面的2个Cookie属性对Cookie变量进行命名: 域属性(Domain):域属性表明Cookie由哪个WEB网站产生或者读取,默认情 况下,Cookie的域属性设置为产生它的网站,但你也可以根据需要改变它。 相关代码如下:Response.Cookies("stuname").Domain = "www.njut.edu.cn" 路径属性(Path):路径属性可以实现更多的安全要求,通过设置WEB网站上的 精确路径,我们能够限制Cookie的使用范围。例如: Response.Cookies("stuname").Path = "/lib/sub/path" 有效期属性(Expires):通常情况下,当用户的浏览器被关闭时,Cookie就不 存在了。但是在很多种情况下,我们希望能更长时间地在客户端的计算机上保存Cookie。 这时候,我们要用到Cookie的Expires属性。 通过下面的代码,我们可以设置Cookie的使用到期时间为2008年7月1日: Response.Cookies("CookieName").Expires=#July 01, 2008# 或者,将设定cookie的过期时间为“Cookie的创建时间+365日”: Response.Cookies("CookieName")=Date+365 HasKey属性:如果Cookies集合是如前面所说的多值Cookies时,我们可以使用 该属性来遍历完整的Cookies集合。 下面通过一段代码来说明HasKey的用法。
126

5.3.4 Cookies集合的应用
下面我们通过两个具体的例子来说明Cookies的用法。我们假定你需要做一 个网站,在网站中你想做一个调查,每个用户初次访问时都需要填写好注册信息, 当日后再访问时,就不需要再填写了。利用Cookie,就可以非常圆满地解决这个 问题。
<% Sname=Request.Cookies("stuname") If Sname ="" then Response.Cookies("stuname")="x" Response.Cookies("stuname").Expires=#July 01, 2008# Response.Redirect "stu.asp" Else '其它的ASP代码 End if %>

我们来分析一下这段代码: 首先,我们读取了名字为stuname 的Cookie的值。然后,判断该值是否存 在具体的数值,如果不存在,就创建该Cookie值,设置它以后转到stu.asp页面。 当用户再次访问它时,因为已经存在了Cookie值,所以,就不会再转到 stu.asp 页面,而是继续执行以后的ASP代码了。 再来看另外一个例子。这个例子是利用使用Cookies使当用户第一次访问该 站点时显示欢迎信息。
127

5.3.4 Cookies集合的应用(实例)
【例5-6】
程序名:exam5-6.asp <% RequestName = Request.Form("Name") RequestMs= Request.Form("MySelf") If RequestName <>"" or RequestLeaveMeAlone <>"" then Response.Cookies("VisitorName") = RequestName Response.Cookies("VisitorName").Expires = #July 01, 2008# Response.Cookies("MySiteMySelf") = RequestMs Response.Cookies("MySiteMySelf").Expires = #July 01, 2008# End if VisitorName = request.cookies("VisitorName") LeaveMeAlone = request.cookies("MySiteMySelf") If VisitorName ="" and Myself ="" then End if If VisitorName < > "" then Response.write VisitorName & " WELCOME TO THIS WEBSITE!" End if '其它的ASP代码 %>

其运行结果如图5-6-1、图5-6-2所示。

程序名:exam5-6.htm <html> <body bgcolor="#ccffff" text="black" link="navy" vlink="purple"> <div align="Center"> <form action="exam5-6.asp" method="POST"> <input type="text" name="name"><br><br> <input type="hidden" name="MySelf" value="x"> <input type="submit" value="Submit"> </form></div> </body></html>

说明:首先设置页面,检查表单信 息,如果存在,则创建Cookie集合, 并设置有效期时间。再读取Cookie 集合,如果Cookie在访问者的计算 机上不存在,就创建一个表单,询 问相关信息。如果已经存在,并且 用户名字存在,就显示给访问者一 个欢迎界面,然后执行其余的代码。

128

5.4.1 Session对象简介
Session对象和我们后一节要说的Application对象一样,体现了其 他三种内置对象所没有的特性---事件。 众所周知,HTTP是一种非状态的协议,也就是说Web服务器将每个 网页请求都看做是独立的,因此服务器不保留以前请求的任何信息,即使 它们只早于当前请求几秒钟。这种缺陷给编写应用程序造成了很大的困难。 ASP为管理会话信息问题提供了独特的解决方案。使用ASP的Session对 象和服务器生成的特定用户ID,可以创建更合理的ASP应用程序,以便标 识每次访问的用户并收集用户信息,应用程序随后就可以利用这些信息来 跟踪用户的各种选择。 我们可以使用Session对象存储单个用户会话所需的一些信息。当用 户通过应用程序的页面向服务器发送请求时,如果该用户还没有进行会话, 则自动创建一个Session对象,如果会话已经过期了,服务器将终止该会 话。 Session对象经常被用在电子商务的网站中,用于创建虚拟的购物篮。 只要你登陆到了该网站,无论什么时候,只要你点击了购买商品的按钮, 产品就会进入购物篮,当用户离开时,实际上就已经进行了他所选的所有 商品的订购工作,这些购物信息就是被保存在Session对象中的。
129

5.4.1 Session对象简介(续上)
需要注意的是:会话状态仅在支持cookie的浏览器中保留,如果客户 关闭了Cookie选项,Session也就不能发挥作用了。 Session对象的功能看起来和Cookie有些相似,但实际意义上存在着 很大的区别。我们知道,Cookie中的数据是存放在客户端的浏览器中,而 Session中的数据则存放在WEB服务器上面。当用户第一次登陆到网站时, ASP会检查HTTP协议的头信息,看是否存在有ASPSESSIONID的字段信 息发过来,如果存在,则WEB服务器就启动新的会话,为该用户创建一个 全局变量,并将该值返回给客户端。ASP就是利用这种方法来访问存储在 客户端上的用户独特的信息的。当然,在你不需要使用Session时,你也 可以告诉IIS不用对Session进行追踪,只要在ASP的最前面加上 <%@ENABLESESSIONSTATE=False%>即可。 Session对象的语法为:Session.Collection|Property|Method 其中:Collection 为Session的集合 Property 为Session的属性 Method 为Session的方法。
130

5.4.2 利用Session存储信息
利用Session对象存储用户信息,只需要简单的调用Session对象 就可以了。下面我们以一个简单的例子来说明其用法。 【例5-7】 我们假定用户请求了另外一个页面,代码如下:
程序名:exam5-7.asp <html> <head> <title> This is a Example </title> </head> <body> <% Session("WelCome")="Welcome to MyWeb!!!" Response.write(Session("WelCome")) %> </body> 其运行结果如图5-7所示。 </html> 程序名:exam5-7-1.asp <html> <head> <title>Another Example</title> </head> <body> <% Session("WelCome")="Welcome to MyWeb!!! " %> </body> </html>

当用户浏览此页面时,同样的又显示一次。 但在此页面上会话变量并没有被赋值。因为在前 面的页面中变量已经被赋值了。

131

5.4.3 利用Session存储数组信息
Session对象可以提供动态关联数组,在数组中存储信息。在 Session对象中存储单纯变量和对象变量。要在Session对象中存储变 量,需指定Session对象中已命名条目的值。可以利用Contents集合 来存储数组信息。Contents集合可以包括所有未使用<object>标记 而为该会话建立的项目。也可以用于遍历集合并检索出会话中所有项目 的列表。 下面的例子说明了其用法。
<% Session("name")="Tom" Session("Sex")="male" Session("year")="34" For I=1 to Session.Contents.Count Response.Write("<br>"&Session.Contents(I)) Next Session.Abandon %>
132

5.4.4 Session对象的属性和方法
1、SessionID
SessionID属性返回用户的会话标识。在创建会话时,服务器会为每一个会话 生成一个单独的标识符号。会话标识以长整形数据类型返回。大多数情况下 SessionID可以用于WEB页面注册的统计。 Timeout属性以分钟为单位为Session对象指定超时时限。如果用户在该超时 时限之内不刷新或重新请求网页,则该会话将终止。这段时间的默认值是20分钟。 可以通过在 Internet服务管理器中设置“应用程序选项”属性页中的“会话超时” 属性改变应用程序的默认超时限制设置。用户可以根据应用程序的要求来设置此 值。例如,如果您希望浏览您的Web应用程序的用户在每一页仅停留几分钟,就 应该缩短会话的默认超时值。过长的会话超时值将导致打开的会话过多而耗尽 WEB服务器的内存资源。对于一个特定的会话,如果您想设置一个小于默认超时 值的超时值,可以设置Session对象的Timeout属性。例如,下面这段代码将超 时值设置为10分钟。 <% Session.Timeout = 10%> 当你希望会话在长期内进行的话,你也可以设置一个大于默认设置的超时值。 Session对象只有一个方法:Abandon,该方法删除所有存储在 Session对象中的对象并释放这些对象的源。如果用户未明确地调用Abandon方 法,一旦会话超时,服务器将删除这些对象。当服务器处理完当前页时,下面的 代码将释放会话状态。 <% Session.Abandon %>
133

2、TimeOut

5.5.1 Application对象简介
我们可以这么理解Application对象:当你创建了一组ASP页面的 话,你就相当于创建了一个Application对象。因此,一个Application 对象就是你所开发的一组页面和ASP文件。在此,我们不仅可以使用 Application 对象,在给定的应用程序的所有用户之间实现信息共享, 并在服务器运行期间持久的保存数据。而且,Application 对象还有控 制访问应用层数据的方法和可用于在应用程序启动和停止时触发过程的 事件。 Application对象具有很多其他ASP内置对象所没有的特点,首先, 数据信息可以在Application内部进行共享,因此,一个Application对 象可以覆盖多个用户。其次,单独的Application对象可以隔离出在自 己的领域内运行,这样的话,如果有个别的Application遭到人为的破 坏的话,不会影响到其他的用户使用;同时,你也可以停止一个 Application而不影响其他应用。 下面我们来看看Application对象所具有的属性、方法和事件。
134

5.5.1 Application对象简介(续上)
虽然 Application 对象没有内置的属性,但我们可以使用以下句法设 置用户自己定义的属性。 Application("属性")= 值 下面代码声明并建立 Application 对象的属性。

一旦我们分配了 Application 对象的属性,它就会一直存在,直至关 闭 WEB 服务器服务使得Application停止。由于存储在 Application 对象 中的数值可以被应用程序的所有用户读取,所以Application对象的属性特 别适合在应用程序的用户之间互相传递信息。 Application对象有两个方法,是用来处理多个用户对存储在 Application中的数据进行写入的问题。 Lock方法:禁止其他用户修改Application对象的属性。 Lock方法阻止其他用户修改存储在Application对象中的变量,以确 保在同一时刻仅有一个客户可修改和存取Application变量。在应用程序中, 我们通常将两种方法一起使用。如果用户没有明确调用Unlock方法,则服 务器将在.asp文件结束或超时后即解除对Application对象锁定。
135

<%Application("MyVar") = "Welcome" Set Application("MyObj") = Server.CreateObject("MyComponent")%>

5.5.1 Application对象简介(续上)
下面这段代码使用Application对象来记录页面访问次数的程序:
<% Dim NumberVisits NumberVisits=0 Application.LockApplication("NumberVisits") = Application("NumberVisits") + 1 Application.Unlock %> 欢迎您光临我们的网站,你是本网站的第<%= Application("NumberVisits") %>位访客!

Unlock方法:允许其他客户修改Application对象的属性。 在上面的例子中,Unlock方法解除对象的锁定,使得下一个客户端能 够增加NumVisits的值。如果用户没有在后面调用Unlock方法,则服务器 将在ASP文件结束后即可解除对Application对象的锁定。但在实际的程序 中,最好在Lock以后,使用Unlock方法,否则的话,在文件没有结束时, 其他用户就不能再操作Application的变量了。 Application有两个事件: Application_OnStart事件和Application_OnEnd事件。 Application_OnStart事件在首次创建新的会话(即 Session_OnStart事件)之前发生。当WEB服务器启动并允许对应用程序 所包含的文件进行请求时就触发Application_OnStart事件。
136

5.5.1 Application对象简介(续上)
不过,和Session_OnStart事件不同的是:Application只触发一次。 而且,学要注意的是:Application_OnStart事件的处理过程必须写在 Global.asa文件之中。 其用法为:<Script language=ScriptLanguage Runat=Server>
Sub Application_OnStart …… End Sub </Script>

Application_OnEnd事件只有在服务终止或Application对象被卸载 时才会被触发。如在IIS管理器中关闭了IIS服务,该事件就被触发了。 Application_OnEnd事件肯定发生在Session_OnEnd事件之后。同样, 也必须把该事件的处理过程写在Global.asa 文件之中。 其用法为:<Script language=ScriptLanguage Runat=Server>
Sub Application_OnEnd …… End Sub </Script>

我们在一般应用中,一般把与数据库的连接定义在这两个事件中。在 后面的章节中,我们还将具体讲述Global.asa文件的用法。
137

5.5.2 利用Application存储信息
利用Application对象存储信息,只需要将变量声明后赋值给它即可。 下面的例子可以说明其用法。 你也可以将一个对象存入Applicaition 【例5-8】
程序名:exam5-8.asp <html> <head> <title> This is a Example </title> </head> <body> <% Application("WelCome")="Welcome to MyWeb!!!" Response.write(Application("WelCome")) %> </body> </html>

对象集合中,与变量不同的是,你需要 使用Set方法。如: <%Set Application("MyObject")=Server.C reatObject("MyCom")%> 其运行结果如图5-8所示。

138

5.5.3 利用Application存储数组信息
如果我们想将一个数组存储在 Application 对象中,需要注意的是: 不要直接更改存储在数组中的元素。例 如,下列的脚本无法运行
<% Application("MyArray")(2) = "Hello"%> <% Dim MyArray() Redim MyArray(4) MyArray(0)="welcome" MyArray(1)="you" Application.Lock Application("StoredArray")=MyArray Application.Unlock Response.Redirect 5-.asp" LocalArray=Application("StoredArray") LocalArray(1)=" there" Response.Write LocalArray(0)&LocalArray(1) Application.Lock Application("StoredArray")=LocalArray Application.Unlock %>

这是由于Application对象是作为集 合被实现的。数组元素MyArray(2)并 未获得新的赋值。而此值将包含在 Application对象集合中,并将覆盖在此 位置存储的原来的任何信息。建议您在 将数组存储在Application对象中时,在 检索或改变数组中的对象前获取数组的 一个副本。在对数组操作时,您应再将 数组全部存储在Application对象中,这 样您所做的任何改动将被存储下来。下 面的代码对此进行演示。

139

5.5.4 Global.asa文件及应用
Global.asa文件是一个可选文件,程序编写者可以在该文件中指定事件脚 本,并声明具有会话和应用程序作用域的对象。该文件主要用来存储事件信息 和由应用程序全局使用的对象的。比如说:我们在前面一节中说到的,与数据 库的连接就放到这个文件中,以提高程序的效率。需要提醒大家注意的是:我 们必须把该文件存放到应用程序的根目录中,而且每个根目录中只能有一个这 样的文件。 在Global.asa文件中,脚本代码中必须使用<Script>标记封装,定义的 对象也必须有会话或应用程序作用域,否则,服务器会返回错误。我们可以用 任何支持脚本的语言编写其脚本。 Global.asa文件的标准格式为:
<Script Language="VbScript" Runat="Server"> Session_OnStart '用户首次运行ASP应用程序中的任何一个页面时运行 Session_OnEnd '当用户首次运行ASP应用程序中的任何一个页面时运行 Application_OnStart '当任何用户首次首次访问该应用程序的首页时运行 Application_OnEnd '当该站点的WEB服务器关闭时运行 </Script>

下面我们用一个例子来具体讲解一下用法。
140

5.5.4 Global.asa文件及应用(实例)
<Script Language="VbScript" Runat="Server"> Sub Application_OnStart VisitorCountFileName=Server.MapPath("/lib")+"\ VisitorCount.txt" Set FileObject = Server.CreateObject("Scripting.FileSystemObject") 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>

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

5.6.1

设置Web服务器响应时间的属性---ScriptTimeout

Server对象主要是用来提供对服务器上的方法和属性的访问的。

其具体用法为:
Server.Property|Method 因此,我们可以用ScriptTimeOut属性设置WEB服务器的响应时

间。如
<% Server.ScriptTimeout=50 %> 就指定服务器响应时间为50秒。需要提醒大家的是:在数据库方 面,使用AspScriptTimeOut属性可以为WEB服务器设置默认的响应 时间值。同时,Server.ScriptTimeout属性的值的大小不能小于在原 数据库中指定的值。比方说,假设NumSeconds的值为80,而在原数 据库中设置了默认值为100,则脚本程序仍然在100秒后超时。

142

5.6.2

创建ActiveX组件实例的方法---CreateObject

CreateObject方法是ASP内置组件中功能最为强大的方法。它被用 来创建已经注册到WEB服务器上的ActiveX组件。众所周知,ActiveX组 件能够帮助你实现许多重要的功能,如:数据库的连接、文件系统的访 问等等。 其具体用法为: Server.CreateObject(ProgID) 其中,ProgID指定了构件标识。构件可以是EXE程序,或者是DLL动 态链接库。这些程序必须在操作系统中注册后,COM才会在系统注册表 (Registry)中维护这些信息。 如果要创建有会话或应用程序作用域的对象,可以使用<Object> 标记并设置Session或Application的Scope属性,也可以在对话及应用 程序变量中存储该对象。下面的代码创建了一个对象:
<%Set Session("ad") = Server.CreateObject("MSWC.AdRotator")%>

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

5.6.3 虚拟路径的转换方法---MapPath
MapPath方法主要是把虚拟路径转换成物理路径。

其具体用法为:
Server.MapPath(Path) 其中Path为要转换的虚拟路径。

需要注意的是:如果Path以"/"或"\"开始,MapPath方
法返回路径时将Path看做完整的虚拟路径。否则,该方法 返回同一个ASP文件中已有路径的相对路径。但使用该方 法时应注意的是:它不检查返回的路径是否正确或在WEB 服务器上是否存在。而且,不支持相对目录的写法。

144

5.7 ASP内置对象的综合举例
通过上面几节的学习,我们已经能够用ASP的6个内置对象来编写一些功能 简单的应用程序。下面,我们通过一个综合的例子来说明其的一些具体的用法。 本例子主要实现了聊天室的功能。 【例5-9】
程序名:exam5-9.htm <%@ Language=VBScript %> <% Response.Buffer=true '建立输出缓存,用于显示不同页面。 On error resume next '程序即使出错也继续进行 If Request.ServerVariables("Request_Method")="GET" then '判断客户是以什么方式来请求WEB页面 '---------客户登陆界面----------%> <form method="POST" action="exam5-9.asp"> <p> <input type="text" name="nick" size="20" value="nick" style="background-color:rgb(192,192,192)"><br> </p> <input type="submit" value="进入聊天室" name="B1" style="color: rgb(255,255,0);font-size:9pt;backgroundcolor: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="exam5-9.asp " name=form1> <p> <%=Session("nick")%> 说话:<input type="text" name="talk" size="50"><br></p> <input type="submit" value="提交"name="B1"> <input type="reset" value="取消"name="B2"></p> </form> <A Href="exam5-9.asp">离开</a><br><br>

145

5.7 ASP内置对象的综合举例(续上)
通过这个实例,我们将前面所学的各种内置对象有机的结合在一起。其运 行结果如图5-9-1、图5-9-2所示。
程序名:exam5-9.asp <%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%>

146

第6章 ASP组件
? ? 6.1 ASP组件概述 6.2 文件存取组件
? ? ? ?
? ? ? ? ? ? ? ? ?

?

6.3 广告轮显组件

6.2.1 6.2.2 6.2.3 6.2.4

文件存取组件概述 利用FileSystemObject对象创建文件 利用TextStream对象读取和追加数据 利用文件创建一个简单的留言板

?

6.4 浏览器兼容组件

6.3.1 广告轮显组件概述 6.3.2 广告轮显组件的属性和方法 6.3.3 广告轮显组件的应用实例 6.4.1 浏览器兼容组件概述 6.4.2 浏览器兼容组件的属性 6.4.3 浏览器兼容组件的应用实例 6.5.1 文件超链接组件概述 6.5.2 文件超链接组件的方法 6.5.3 文件超链接组件的应用实例 6.7.1 如何使用免费组件 6.7.2 如何获取免费组件
147

?

6.5 文件超链接组件

? ?

6.6 计数器组件 6.7 免费组件
? ?

组件名称 File Access

说明 文件访问组件,提供文件的输入输出的访问

6.1 ASP组件概述 Ad Rotator 广告轮显组件,按指定的次序自动的轮流显示广告信息
我们知道,ActiveX组件实际上是一个包含执行一组任务代码的文件。比如 Content Linking 文件超链接组件,使用文件来管理超链接的信息 一个股票行情收报组件可以在你的WEB页面上实时的显示最新的股票代码,你只 Counters 计数器组件,创建、修改或检索独立的计数器 需要在组件提供商来获取该组件即可使用,而不需要自己去开发它。组件的优势 Page Counter 页计数器组件,记录并显示WEB页面被打开的次数 在于,用户可以使用任何一门支持支持COM(组件对象模型)的语言去开发组件, 而且,更方便的是:组件是可以重复使用的。但在编写组件的时候,应该注意 ActiveX组件不能包含图形用户接口的元素。类似于VB中的MSGBOX函数在 ActiveX组件中是不能运行的。 对于内置的ActiveX组件,我们一般使用Server.CreateObject方法来创建 它。例如:<%Set Whits=Server.CreateObject("MSWC.PageCounter")%> 我们也可以使用Html<Object>标签来创建它,但需要引起注意的是: RunAT属性必须设置成服务器的值,同时,还要还要为将在脚本语言中使用的变 量名提供ID属性值。使用注册名(ProgID)或注册号码(CLSID)可以识别该对象。 例如:<Object RunAT=Server Scope="Application" ID="WebCount"
ProgID="MSWC.Counter"></Object> Browser Capabilities 浏览器兼容组件,决定访问WEB站点的每个浏览器的各种信息

用这种方法建立组件对象,最好保存在Global.asa文件中,但使用Object 对象一定要放到任何事件的脚本之外,一旦在Global.asa文件中创建了该对象, 就可以在整个Application对象范围内使用该对象的所有属性和方法。 ActiveX内置组件的具体情况,如表6-1所示。
148

6.2.1 文件存取组件概述
ASP包括了文件处理的各个方面的方法、属性和集合。使用文件存取组件,几 乎可以对文件系统进行任何方式的操作。 File Access组件主要由FileSystemObject对象和TextStream对象组成,使 用FileSystemObject对象,可以建立、检索、删除目录及文件,而TextStream 对象则提供读写文件的功能。 其它的有关对象有: File对象:此对象的属性和方法用来处理单个的文件。例如:可用此对象搜索 该文件最后一次被修改的日期或者文件的路径。 Drive对象:此对象代表驱动器或者是映射的网络共享。可以用该对象取得一 些关于磁盘的信息,比如磁盘的可用空间或判断磁盘的文件系统是FAT还是NTFS。 Folder对象:此对象主要是用来处理文件夹。文件夹的一些基本操作都可以 使用该对象进行。 除了上述的几类对象以外,File Access组件还包括了三类集合:Files集合、 Folder集合以及Drive集合。实际上,文件存取组件有很多属性和方法,在这不 能一一的讲述,但我们可以通过FileSystemObject对象和TextStream对象来掌握它 们的大致用法。
149

6.2.2 利用FileSystemObject对象创建文件
FileSystemObject对象有两种最常用的用途,一种用来创建文件,另一种是 用来打开并读写文本文件。CreateTextFile方法获得你指定的文件名并创建该文 件,它返回一个TextStream对象,你可以用该对象在文件被创建后操作该文件。 CreateTextFile方法的用法如下:
Set objTextStream=FileSystemObject.CreateTextFile(Filename,[Overwrite],[Unicode])

其具体参数: Filename包含文件路径名的字符串,可以是文件的全路径名,包括驱动器名 和目录名,也可以是文件名。如果只包含文件名的话,文件将被创建在站点的根目 录下。 Overwrite可选参数。为布尔型。设置成False时可以防止 FileSystemObject对象在创建一个新文件时删除已存在的文件。如不赋值则系统 默认为true,具有相同文件名的已有文件会被强制删掉。 Unicode可选参数。为布尔型。指明是否以Unicode或 ASCII文件格式创建 文件。如果以Unicode文件格式创建文件,则该值为True;如果以ASCII文件格 式创建文件,则该值为False。如果省略此部分,则假定创建ASCII文件。
150

6.2.2

利用FileSystemObject对象创建文件(续上)

OpenTextFile方法的用法如下:
Set objTextStream=FileSystemObject.OpenTextFile(Filename,[IOmode],[Create],[Format])

其具体参数: Filename必选参数,用法等同于CreateTextFile的Filename。 IOmode可选参数。取值为下列两个常数之一 :ForReading 或 ForAppending。如果mode为 1,文件以只读方式打开,如果为 8,则文件以追 <html><head> <title> Create File </title> 加的方式打开。 </head> Create可选参数。指定如果你想打开的文件不存在是做什么操作。如果其值 <body> Create File……. 为True,当文件不存在时就自动创建一个空的文件。如果为False,就会在文件没 <% 找到时产生一个出错信息,其默认值是False,建议将其设为True,以避免在打开 Set Fobject=Server.CreatObjecty("Scripting.FileSystemObject") Set 文件时检查是否出错。 Tfile=Fobject.CreateTextFile("D:\IntetPub\wwwroot\new.txt") Tfile.WriteLine("Welcome to ASP World!!") Format可选参数。可以选择三种Tristate值分别指定文件的格式,-2、-1 Tfile.Close 和 0 分别对应于系统缺省、Unicode和ASCII。 %> </body> 下面我们以一个例子来说明其用法。 </html>
上面的源代码在D:\IntetPub\wwwroot目录下创建了一个名字为new.txt 的文本文件,具体写入文件的方法为WriteLine,最后,记住在最后要关闭此对 象并且释放所有占用的资源。
151

6.2.3 利用TextStream对象读取和追加数据

在打开或创建了文本文件后,就得到一个TextStream对象,该对象有一个光标, 就好象是在字处理程序中的光标一样,指出接下来要敲入的字符将出现的位置,它同 时也指出你要读取的字符的位置。不能通过CreatObject来创建一个TextStream对 象,得到TextStream对象的唯一方法是如前所述的用 FileSystemObject对象打开 一个存在的文本文件或者创建一个新的文件。 TextStream对象的属性和方法:
TextStream.AtEndOfLine:只读,为布尔型。当光标在当前行的末尾时,其值为true,反之则为false。 TextStream.AtEndOfStream:只读,为布尔型。如果光标在流的末尾时,其值为true,否则为false。 TextStream.Column:只读,整型。统计从行首到当前光标位置之间的字符数。 TextStream.Line: 只读,整型。指明光标所在行在整个文件中的行号。 TextStream.close(): 关闭流以及对应的文本文件。 TextStream.read(Num):指定从光标的当前位置开始从文本文件中读取一定数目的字符。 TextStream.readall(): 将整个流读入一个字符串中。 TextStream.readline(): 将一整行的字符读入一个字符串中。 TextStream.write(text): 将一个字符串写入流中。 TextStream.writeline(): 将一个文本串写入流中。 TextStream.skip(Num): 在流中,将光标的位置移动一定数目的字符串长度。 TextStream.skiplines(): 在流中,将光标移动一定数目的行数。 TextStream.writeblank: 将一定数目的空行写入流中。
152

6.2.4 利用文件创建一个简单的留言板
上面我们学习了文件存取组件的一些基本知识,现在,我们来利用文件存取组件 来做一个简单的留言板。 下面的这段程序正是利用ASP读写文本文件的特性,在一个WEB BBS程序中创 建自动记录每个用户发言记录的功能。
<%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(da te)&"\" '获取系统物理路径和时间,并以此作为log 文件存放的物理路径 if Not fs.FolderExists(temp) then fs.CreateFolder(temp) end if
'检测是否存在文件夹,否则自动创建 dim syslog dim tempname tempname=date syslog=temp&tempname&".log" '文件名为e:\bbs\log\月份\月日.log li=user&"&"&Now&"&"&Request.ServerVari ables("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文件写入结束--------%> 153

6.3.1 广告轮显组件概述
在商业化高度发展的今天,WEB上的广告信息随处可 见。我们在构建自己的WEB网站时,也可以利用广告轮显 组件建立一个符合广告领域标准功能的广告系统。它允许 在每次访问ASP页面时在页面上显示新的广告,而且提供 了很强大的功能。比方说:旋转显示在页面上的广告图像 的能力、跟踪特定广告显示的次数的能力以及跟踪客户端 在广告上单击次数的能力。广告轮显组件的工作是通过读 取计划文件来完成的,该文件包括与要显示的图象文件的 地点有关的信息以及每个图像的不同属性。

154

6.3.2 广告轮显组件的属性和方法
AdRotator组件有三个属性:
border(size) 参数size为一正整数,单位为像素,表示组件边框大小; clickable(boolean)参数boolean为一个Boolean值,表示是否提供超链接功能; targetframe(targe)参数target,指定链接指向的窗口或框架名称; <% Set ad = Server.CreateObject("MSWC.AdRotator") ad.Border = 0 ad.Clickable = true ad.TargetFrame = AdFrame %>

下面的代码显示了如何设置其属性:

AdRotator组件只有一个方法:GetAdvertisement(RotatorSchedulFile) RotatorSchedulFile参数指向一个文本文件,该文件由两部分组成,一部分是 组件显示时所需要的通用信息,另一部分是组件显示时的具体信息。 通用信息的参数有: Redirect 指明重新定向文件; Width 组件显示的宽度; Height 组件显示的高度; Border 组件显示的边框尺寸。
155

6.3.3 广告轮显组件的应用实例
现在,我们通过一个具体的例子,来说明广告轮显组件的用法: 第1--4行分别指定组件的重新定向文件、宽度(默认值440)、 高度(默认值60)、边框; 第5行的*仅作为分隔后面的数据,没有特殊意义; 第6--9行指定第一张图片的文件名、所要链接的页面、替代显 示的文字、出现频率; 第10行,为间隔行,仅为便于程序阅读而留,实际使用中可有 可无; 第11-14行,指定第二张图片的文件名、所要链接的页面、替 代显示的文字、出现频率; ...... 以后各行作用与前面的相同,需要增加更多的信息,只要在该文 本文件后面以相同的格式添加即可。 redirect adredirect.asp width 48 height 46 border 2 * em01.gif 001.htm 图片01 1 em02.gif 002.htm 图片02 1 em03.gif 003.htm 图片03 1
156

6.4.1 浏览器兼容组件概述
除了IE以外,我们知道还有许多的浏览器被人们所使用,但并不是每一种浏 览器的支持现今所有的Internet技术。利用浏览器兼容组件,你可以检查浏览器 的兼容性,使你的网页针对不同的浏览器显示不同的页面。 浏览器兼容组件创建一个浏览器类型(BrowserType)对象用于向你的脚本 描述客户端浏览器能力。 一旦一个浏览器连接到Web服务器,浏览器会自动将一串用户代理HTTP报 头(User Agent HTTP Header)传送到服务器。该报头为一ASCII字符串,用 于识别该浏览器及其版本号。浏览器类型(BrowserType)对象将该报头与 Browsercap.ini文件中的条目进行比较。如果找到匹配的条目,浏览器类型 (BrowserType)对象假设该浏览器具备Browsercap.ini文件中所描述的属性。 如果对象没有在Browsercap.ini文件中找到与报头匹配的条目,浏览器类型 (BrowserType)对象假设该浏览器具备默认浏览器的属性。如果没有匹配条目 并且Browsercap.ini文件没有定义默认浏览器的各项设置,则浏览器类型 (BrowserType)对象将该浏览器的各项属性值赋为“Unkown”。 通过升级Browsercap.ini文件,你可以方便的把浏览器属性或者对新浏览器 的描述加入到这个组件。但需要注意的是,要正确使用该组件,必须保证该文件 是最新的。
157

6.4.2 浏览器兼容组件的属性
默认的可以检测到的浏览器的属性有: ACTIVEXCONTROLS: BROWSER: VERSION: FRAMES: 当前浏览器是否支持ActiveX控件。 浏览器类型,如IE或NetScape。 浏览器的当前版本号。 当前浏览器是否支持帧显示。

TABLES:
COOKIES: VBSCRIPT: JAVASCRIPT:

当前浏览器是否支持表格。
当前浏览器是否支持COOKIES。 当前浏览器是否支持客户端VBSCRIPT脚本。 当前浏览器是否支持客户端JAVASCRIPT脚本。

BETA:
PLATFORM: CDF:

当前浏览器是否为测试版。
检测当前用户使用的操作平台。 当前浏览器是否支持WEB发布的频道解释定义。

158

6.4.3 浏览器兼容组件的应用实例
下面,我们通过一个实际例子来向大家说明怎么通过浏览器兼容组件来获 取浏览器的一些基本信息。
<% Set bc = Server.CreateObject("MSWC.BrowserType") %> <table border=1> <tr><td>Browser</td><td> <%= bc.browser %> </td></TR> <tr><td>Version</td><td> <%= bc.version %> </td></TR> <tr><td>Frames</td><td> <% if (bc.frames = TRUE) then %> TRUE <% else %> FALSE <% end if %> </td></TR> <tr><td>Tables</td><td> <% if (bc.tables = TRUE) then %> TRUE <% else %> FALSE <% end if %> </td></TR> <tr><td>BackgroundSounds</td><td> <% if (bc.BackgroundSounds = TRUE) then %> TRUE <% else %> FALSE <% end if %> </td></TR> <tr><td>VBScript</td><td> <% if (bc.vbscript = TRUE) then %> TRUE <% else %> FALSE <% end if %> </td></TR> <tr><td>JScript</td><td> <% if (bc.javascript = TRUE) then %> TRUE <% else %> FALSE <% end if %> </td></TR> </table> 159

6.5.1 文件超链接组件概述
Content Linking组件对网站是非常有用的工具,它提供了内容页面,或者包含对同一 站点上其他页面的链接列表的页面。它自动把当前显示页面的URL与存储在服务器里的文本 文件的页面列表匹配起来,并且能允许用户通过页面列表按正反顺序进行浏览。也就是说, 即使访问者已经在内容页面中点击了一个链接,并且正在查看列表中的某一个页面。该组件 仍然会辨认出所访问的页面在列表中的位置。 由于所有的详细资料均存放在一个文本文件中,因此,维护网站以及页面上的链接仅仅 需要编辑这个文本文件。例如,我们可以通过在内容链接列表文件中重新排列页面的顺序, 来改变它们的显示顺序。 Content Linking组件创建管理URL列表的Nextlink对象,要使用Content Linking组件, 必须需要先创建Content Linking List文件。Content Linking组件正是通过读取这个文件 来获得处理我们希望链接的所有页面的信息。事实上该文件只是一个纯文本文件,其内容如 下:
page1.htm page2.htm page3.htm page4.htm page5.htm page6.htm one two three four five six

这个文本文件的每行有如下形式:url description comment 其中,URL是与页面相关的超链地址,description提供了能被超链使用的文本信息, comment则包含了不被Content Linking组件解释的注释信息,它的作用如同程序中的注 释。description和comment参数是可选的。
160

6.5.2 文件超链接组件的方法
我们知道,Content Linking组件有很多种方法,下面列出了Content

Linking组件所有可以使用的方法:
GetListCount(file) GetNextURL(file) 统计内容链接列表文件中链接的项目数。 获取内容链接列表文件中所列的下一页的URL。 获取内容链接列表文件中所列的上一页的说明行。 获取内容链接列表文件中当前页的索引。 获取内容链接列表文件中所列的第N页的说明。 获取内容链接列表文件中所列的上一页的URL。 获取内容链接列表文件中所列的下一页的说明。 获取内容链接列表文件中所列的第N页的说明。

GetPreviousDescription(file) GetListIndex(file) GetNthDescription(file,index) GetPreviousUR(file) GetNextDescription(file) GetNthURL(file,index)

161

6.5.3 文件超链接组件的应用实例
下面我们来看看如何具体使用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>

考虑到您的网站可能包含了很多的页面, 我们不可能在每一个页面中都编写实现导航 超链的ASP代码。因此,我们必须利用前面 所学到的服务器端包容SSI,这样就避免了 大量的重复作业,请看下例: < !--#include file="nextprev.inc"--> 只要将这端代码放在每个页面中即可。 nextprev.inc 文件的内容如下:
<% 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 %>

在以上代码中,我们先用GetListCount方法确定 在文件nextlink.txt中有多少条项目,然后利用循环语 句,并使用GetNthURL、GetNthDescription方法逐 一将存储在nextlink.txt文件中的内容读出并显示给客 户端浏览器。

162

6.6 计数器组件
Counter组件创建一个可创建、存储、增长和检索任何数量的独立 计数器的Counters对象。 计数器是一个包含整数的持续值。可以使用Counters对象的Get、 Increment、Set和Remove方法控制计数器。一旦您创建了计数器, 它将一直持续下去直到被删除为止。 计数器不会在一个事件比如访问一页时自动增加。您必须使用Set 和Increment方法人工的设置或增长计数器。 计数器不受作用域限制。一旦您创建了一个计数器,那么您的站点 上的任何页都可以检索和控制它的值。例如,若您在一个名为 Page1.asp的页上显示和增加一个叫做hits的计数器的值,而又在另一 个叫做Page2.asp的页上增加hits的值,则两页将增加同一计数器。若 您访问Page1.asp时,计数器的值增加到34,则访问Page2.asp会将 hits增加到35。下一次访问Page1.asp,hits将增加到36。 所有计数器都存储在一个单独的名为counters.txt的文本文件中, 它同counters.dll文件存储在同一目录下。
163

6.6 计数器组件(续上)
counters.dll Counters组件。
counters.txt该文件在一个站点上存储所有独立的计数器。 counters.txt是一个UTF8编码文件。您可以在计数器名称中使用任何 Unicode字符。 语法如下: 将下列内容加入到global.asa文件中在您的服务器上可一次性创 建Counters对象:
<Object RunAT=Server Scope=Application ID=Counter ProgID="MSWC.Counters">

在您的站点上仅创建一个Counters对象。这一单个Counters对象 可以创建任意数量的独立计数器。 注意对于Windows?98上的Personal Web Server,已在默认的 虚拟目录下的global.asa文件中指定了一个Counters组件。可以通过 调用Counters.Get、Counters.Increment、Counters.Remove和 Counters.Set使用组件创建的Counters对象,就好象它是内建的一样。 您不可以创建Counters对象的其他实例。
164

6.6 计数器组件(续上)
方法: Get 返回计数器的值。 Increment 计数器的值加一。 Remove 从counters.txt文件中删除计数器。 Set 将计数器的值设为一个特定的整数。 示例如下: 通过将ID属性设置为Counter,在global.asa文件中创建Counters对象 的实例:
<OBJECT RUNAT=Server SCOPE=Application ID=Counter PROGID="MSWC.Counters"> </OBJECT>

然后就可以在某一页上使用Counters对象创建全部所需的计数器:
There have been <%=Counter.Increment(?defaultPageHits?)%>to this site.

然后在另一页上就可以使用下列方法增加计数器的值:
You are visitor number <%=Counter.Increment('LinksPageHits')%>to this page.

注意,该组件可从包含IIS Resource Kit的CD中得到。
165

6.6 计数器组件(续上)
1、Get方法

Get方法根据计数器的名称返回此计数器的当前值。若此计数器不存 在,则该方法创建它并将其置为0。 语法如下: Counters.Get(CounterName) 参数如下: CounterName 包含计数器名称的字符串。 示例如下: 用<%=Counters.Get(CounterName)%>可显示计数器的值。 用<%countervar=Counters.Get(CounterName)%>将计数器 的值赋给一个变量。 下列脚本显示关于所喜爱的颜色的民意测验的投票记分。

<% If ColorNumber="1" Then Counters.Increment("greencounter") Else If ColorNumber="2" Then Counters.Increment("bluecounter") Else If ColorNumber="0"Then Counters.Increment("redcounter") End If End If End If %> <p>Current vote tally: <p>red: <%=Counters.Get("redcounter")%> <p>green: <%=Counters.Get("greencounter")%> <p>blue: <%=Counters.Get("bluecounter")%>

166

6.6 计数器组件(续上)
2、Increment方法
Increment方法根据计数器的名称,将该计数器的值加1,并返回计数器的新 值。若计数器不存在,此方法将创建该计数器并将其值设为1。 语法如下: Counters.Increment(CounterName) 参数如下: CounterName 包含计数器值的字符串。 示例如下: 使用<%Counters.Increment(CounterName)%>可增加计数器的值。 使用<%=Counters.Increment(CounterName)%>可增加和显示计数器 的值。 为了获取计数器的值,可使用Counters.Get。要将计数器的值设为一个特殊 值,请使用Counters.Set。 下列代码实现联机页访问计数器。
<P>There have been <%=Counters.Increment("hits")%>visits to this Web page.</P>

上面的示例中,每次客户端向服务器发出页请求时,都使用 Counters.Increment将计数器的值加1。
167

6.6 计数器组件(续上)
3、Remove方法
Remove方法根据计数器的名称,从Counters对象和counters.txt文件中删 除计数器。 语法如下:Counters.Remove(CounterName) 参数如下:CounterName 包含计数器名称的字符串。 示例如下:下列代码从 counters.txt 文件中删除计数器hitscounter。 <%Counters.Remove(hitscounter)%>

4、Set方法
Set方法根据计数器的名称和一个整数参数,将计数器设置为该整数值,并返 回此新值。若该计数器不存在,则Counters.Set创建计数器并将其值设为这一整 数。要获取计数器的值,可使用Counters.Get。要使计数器的值加一,可使用 Counters.Increment。 语法如下:Counters.Set(CounterName,int) 参数如下:CounterName 包含计数器名称的字符串。 Int CounterName的新的整数值。 示例如下:下列代码将访问计数器pageHits重置为0。 <%Counters.Set(pageHits,0)%>
168

6.7.1 如何使用免费组件
1、文件上传组件ASPSmartUpload(免费)
先下载该组件:
http://www.ASPsmart.com/liblocal/download/EN/ASPSmartUpload.zip

文件大小约100K。下载解包后,共有三十多个文件,分别位于不同目录下, 你可以参照其中的说明文件自己研究,这里仅举一个完整的例子说明如何使用第 三方组件。 找到ASPSmartUpload.dll和ASPSmartUploadUtil.dll这两个文件,在Web 服务器的命令提示符下分别用regsvr32.exe ASPsmartupload.dll和 regsvr32.exe ASPsmartuploadutil.dll命令行来注册该组件(如果你是第一次 使用Regsvr32.exe,可先将这两个DLL文件拷到Web服务器的 “Winnt/System32”或“Windows/System”目录下),若注册成功,弹出的 窗口中会有”succeeded”字样(注意:使用第三方组件前必须先注册,有的第三 方组件采用安装方式,能自动注册,而更多的象这样,需要自己手工注册)。注 册成功后,接下来就可以写代码使用组件。 关于该组件更多、更详细的用法、功能(如限制上传文件的类型、尺寸,上传 至数据库,下载文件或数据库字段等等),你可自己去看样例或研究帮助。如果 觉得看英文太累,也可下载一个全国产的File Upload组件,里面有中文的帮助和 样例,下载地址:
http://www.chinaASP.com/program/fileup.zip。
169

6.7.1 如何使用免费组件(续上)
3、图形组件:Dundas Pie Chart(饼状图)
先听听组件提供者是怎么说的:“闪光的性能,足以让人晕厥的高质量的图形, 强大、高速、无比的灵活性”,看看结果之一:
3DPieCSC.EXE: http://www.dundas.com/downloads/freeproducts/files/3DPieCSC.EXE FPDocInst.exe: http://www.dundas.com/downloads/freeproducts/files/FPDocInst.exe

3DPieCSC.EXE中包括该组件,后者是说明文档,都是安装文件,我将它安 装在服务器的“C:\Inetpub\3dPieCSC”目录下,该组件自带两个复杂无比的样 例程序以展示它炫丽无比的性能,较难搞明白。这里举一个简单实用的大众化例 子:wuf36.htm,通过标签调用ASP文件: wuf37.ASP,用来生成图形(与上面同理,请勿在代码中使用中文)。 老实说,这个免费的东西还是不错的,就是它提供的例程太复杂了,让人不能 一触即会。现在你可能要来一个举一反三,融会贯通,想怎样得到柱状图,的确 是有这样的组件:ShotGraph,但是完全不需要搞这么复杂吗,你仅需准备一个 柱状的图片(不会做!看到别人网页上有,另存一个不就搞定),利用HTML标 记Weight、Height按比例拉伸和压缩就行了(<src=bar.gif width = height = 10>)。
170

6.7.1 如何使用免费组件(续上)
4、Email组件
ASPSmartMail:
http://www. ASPsmart.com/liblocal/download/EN/ASPSmartMail.zip 注意千万不要在代码中使用中文,不然你怎么也发不出一封信。 W3 Jmail: http://download.dimac.net/jmail/jmail.exe。

171

6.7.2 如何获取免费组件
上面简单的讲了一下免费组件的使用方法,那么,我

们怎么获得这些功能强大的组件呢?主要的方法就是:通
过网络下载!从上面一节中讲到的几个例子我们可以看到: 主要是到一些主要的的ASP技术网站上去下载,下载完以 后,只要注册进去就可以使用了。

172

第7章
? ?

ASP的数据库存取组件及ADO技术

? 7.1 数据库存取组件概述 ? 7.2 数据库的建立及ODBC数据源的设置 ? 7.3 结构化查询语言SQL
? ? ? ? ? ? 7.3.1 7.3.2 7.3.3 7.3.4 7.3.5 7.3.6 7.2.1 数据库的建立方法 7.2.2 数据源DSN的设置方法

? 7.4 ADO概述 ? 7.5 用来和数据库建立连接的Connection对象
? ? ? ? 7.5.1 7.5.2 7.5.3 7.5.4 建立Connection对象 Connection对象的属性和方法 利用Connection对象存取数据库 事务处理
173

查询语句Select 插入语句Insert Into 更新语句Update 删除语句Delete 创建表语句Create table 删除表语句Drop table

第7章
? ? ? ? ? ? ? ? ? ? ? ? ?

ASP的数据库存取组件及ADO技术(续上)
建立Recordset对象 Recordset对象的属性和方法 利用Recordset对象查询记录 分页显示数据 利用Recordset对象更新数据库 Fields集合和Field对象 建立Command对象 Command对象的属性和方法 利用Command对象存取数据库 非参数查询和参数查询 Parameters集合和Parameter对象

? 7.6 用来返回一个数据库记录集的Recordset对象
7.6.1 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5

? 7.7 用来改善查询的Command对象

? 7.8 Errors集合和Error对象
7.8.1 Errors集合的属性和方法 7.8.2 Error对象的属性
174

7.1 数据库存取组件概述
不断革新的Internet、不断演进的新技术,加上不断变化的开发模式,就 是现今信息技术人员所处的窘境。数据的存取方式一直是应用程序开发模式的 一个重要论点,在以往的环境中,选择最有效率的数据库服务器一直是最重要 的考虑,并且所有的数据存取模块也都会受限于该数据库系统的存取方式。最 具象征性的,就是Client/Server应用程序,典型的两层式模型(Two-tier Model)。 然而,随着Internet的广泛使用,同时与使用者的互动性也日益增加,显 而易见的,第三层(或是中间层,Middle tier)的需求就更为明显了。通常, 中间层都会是一个逻辑接口层,而数据存取组件也都是属于中间层。 随后问世的,就是所谓的Windows DNA架构─我们现在将其称为 .NET Server系统。Microsoft定义了统一的数据存取模型,这种数据存取模式将重 点放在数据本身的内容,而不是数据的格式和储存的媒体,这个模型我们称其 为Universal Data Access(UDA),而这个模型则是透过OLE DB的架构来 实作。 Microsoft设计了ADO的机制以供程序开发人员以简单方式来存取OLE DB,透过Visual Basic(VB)或是Active Server Page(ASP)等COM组 件就可以通过ADO来存取数据。ADO经过了数年的革新,进步到了ADO 2.6 的版本,2.6版新增了许多的功能,其中最重要的就是对于XML的支持。
175

7.2.1 数据库的建立方法
利用SQL Server的企业管理器,可以方便的建立数据库。 下面介绍如何在SQL Server的企业管理器中创建数据库,以建立 STUDENT数据库为例。 运行企业管理器,展开SQL Server组,会看到一个SQL Server服 务器,一般的名字为(local)(Windows NT),展开,出现图7-1所示。 右击数据库,在出现的菜单中,点击“新建数据库(B)…”子菜单, 弹出数据库属性对话框,如图7-2所示 在名称栏输入student,其它属性不变,按确定就可以创建数据库。

176

7.2.2 数据源DSN的设置方法
在创建数据库脚本之前,必须提供一条使ADO定位、标识和与数 据库通讯的途径。数据库驱动程序使用Data Source Name (DSN)定 位和标识特定的ODBC兼容数据库,将信息从Web应用程序传递给数据 库。 典型情况下,DSN包含数据库配置、用户安全性和定位信息,且 可以获取Windows NT注册表项中或文本文件的表格。 通过ODBC,您可以选择希望创建的DSN的类型: (1)用户DSN; (2)系统DSN; (3)文件DSN。 用户和系统DSN存储在Windows NT注册表中。系统DSN允许所 有的用户登录到特定的服务器上去访问数据库,而用户DSN使用适当 的安全身份证明限制数据库到特定用户的连接。文件DSN用于从文本 文件中获取表格,提供了对多用户的访问,并且通过复制DSN文件, 可以轻易地从一个服务器转移到另一个服务器。
177

7.2.2 数据源DSN的设置方法(续上)
通过在Windows的“开始”菜单打开“控制面板”,进入管理工具,您可 以创建基于DSN的文件。 双击“数据源(ODBC)”图标,弹出ODBC数据源管理器对话框; 选择“系统DSN”属性页,单击“添加…”,弹出创建新数据源对话框; 在创建新数据源对话框中,选择数据库驱动程序SQL SERVER,然后单击 “完成”。弹出创建到SQL SERVER的新数据源对话框,如图7-3: 在图7-3的名称栏输入student,描述栏输入学生库,服务器栏选择 (local),点击下一步,弹出对话框7-4,选择登录设置:

178

7.2.2 数据源DSN的设置方法(续上)
点击下一步,弹出对话框如图7-5所示。 选中“更改默认的数据库”,选择student,单击下 一步,出现对话框如图7-6所示。 单击完成,数据源就配置好了,接下来出现连接测试 对话框,如图7-7所示。 可以,单击“测试数据源(T)…”按钮,测试配置是否 正确。如果连接成功,按确定,配置结束。

179

7.3 结构化查询语言SQL
结构化查询语言(Structured Query Language,SQL),是一种 关系数据库的标准语言,它包括查询、定义、操作和控制4个部分,是 一种功能集权、应用广泛的数据库语言。 当前,几乎所有的关系数据库软件都支持SQL,软件厂商都对 SQL的基本命令集进行了扩充。SQL使用灵活、学习方便、语义直观。 1986年美国国家标准协会公布第一个SQL标准(SQL86),目前最新的 标准是于1999年制定的SQL3。 SQL的特点主要有: SQL语言是一种关系数据库语言,提供数据的定义、查询、更 新和控制等功能。功能强大、可以完成多种数据库操作 SQL语言不是一个应用程序开发语言,它只提供对数据库的操 作功能,可作为交互式语言独立使用,也可作为子语言嵌入宿主语 言中使用,成为应用开发语言的一部分。 有利于各种数据库之间交换数据;有利于程序的移植;有益于 实现程序和数据建的独立性;有利于实施标准化。 书写简单、易学易用。
180

7.3 结构化查询语言SQL(续上)
SQL语言通常分为如下四类: (1)数据定义语言(DDL) 创建、修改或删除数据库中的各种对象,包括表、视图、索引等,如表7-1所示。
操作对象
表 操作方式 创建 CREATE TABLE 修改 ALTER TABLE 删除 DROP TABLE

视图
索引

CREATE VIEW
CREATE INDEX

ALTER VIEW

DROP VIEW
DROP INDEX

触发器
存储过程

CREATE TRIGGER
CREATE PROCEDURE

ALTER TRIGGER
ALTER PROCEDURE

DROP TRIGGER
DROP PROCEDURE

(2)查询语言(QL) 按照指定的组合、条件表达式或排序检索已存在的数据库中的数据,但并不改变 数据库中的数据。 语句为:SELECT…FROM…WHERE

181

7.3 结构化查询语言SQL(续上)
(3)数据操纵语言(DML) 对已经存在的数据库进行记录的插入、删除、修改等操作。 主要语句有: INSERT UPDATE DELETE (4)数据控制语言(DCL) 用来授予或收回访问数据库的某种特权;控制数据操纵事务的发生 时间及效果;对数据库进行监视。 主要语句有: GRANT REVOKE BEGIN TRANSACTION、 COMMIT TRANSACTION ROLLBACK TRANSACTION
182

7.3.1 查询语句Select
格式:
下面对SELECT命令进行一些说明:

SELECT [ ALL | DISTINCT ] [ TOP n [ PERCENT ] [ WITH TIES ] ] <目标列表达式>[,<目标列表达式>,…] FROM <基本表名或视图名>[,<基本表名或视图名>,…] [WHERE <条件表达式>] [GROUP BY <列名1>[,<列名2>,…][HAVING <条件表达式>]] [ORDER BY <列名3>[,<列名4>,…] [ASC|DESC]]

命令的含义是从FROM字句指定的基本表或视图中,根据WHERE字句的条件表达式 查找出满足条件的记录,按照SELECT字句指定的目标列表达式,选出元组中的属性值 形成结果集。 如果有GROUP BY子句,则将结果按照其后指定的列名的值进行分组,该属性列值 相等的元组为一个组; 如果GROUP BY子句带有短语HAVING,则只有满足短语指定田间的分组才会输出。 如果有ORDER BY子句,则结果表要按照其后指定的列的值来进行升序(ASC)或降 序(DESC)排列。 目标列表达式可以是“列名1,列名2,…”的形式;如果FROM字句指定了多个表,则 列名应是“表名.列名”的形式; 目标列表达式也可以是“列名1+列名2”、“列名1-列名2”、“列名1*列名2”、 “列名1/列名2”等形式; 目标列表达式还可以使用SQL提供的库函数形成表达式,常用的函数如下:
COUNT(*):统计记录条数 SUM(列名):累计数值型列的综合 MAX(列名):计算列的最大值 COUNT(列名): 统计一个列值个数 AVG(列名): 对某一数值型列求均值 MIN(列名): 计算列的最小值
183

7.3.2 插入语句Insert Into
向表中插入数据命令是通过向具体的记录插入常量数据

得到的。插入记录的简单语句格式为如下:
INSERT INTO <表名> [(<列名1>,<列名2>,<列名 3>,…)] VALUES(<值1>,<值2>,<值3>, …) 【例7-12】向学生表中插入一条记录。
insert into 学生表 values('20020113','王妍','女','1985-07-12','机械',92)

184

7.3.3 更新语句Update
更新数据的语句格式一般如下:

UPDATE <表名> SET <列名1>=<表达式1>[,<列名2>=<表
达式2>,…] WHERE <条件> 【例7-13】将学生于明的成绩改为78。 UPDATE 学生表 SET 成绩=78 WHERE 姓名=于明

185

7.3.4 删除语句Delete
删除命令比较简单,删除是对记录操作,不能删除记

录的部分属性。一次可以删除一条或若干条,甚至将整个
表的所有记录删除,只保留表的结构定义。 其基本命令格式如下: DELETE FROM <表名> WHERE <条件> 【例7-14】删除学生表中学号为'20022321'的学生。 DELETE FROM 学生表 WHERE 学号 = '20022321'

186

7.3.5 创建表语句Create table
创建表的命令格式如下: CREATE TABLE <表名>(<列名1> <列1类型> [,<列名2> <列3类型>][,<列名3> <列3类型>] … ) 【例7-15】创建学生表。 CREATE TABLE [学生表] ( [学号] char(10), [姓名] varchar(50), [性别] char(2), [出生日期] datetime, [学院] varchar(50), [成绩] [int] )
187

7.3.6 删除表语句Drop table
删除表格命令将从数据库中彻底删除表的定义和表中的所有记录,

所以在使用前仔细考虑,删除表格的命令格式如下:
DROP TABLE <TABLE NAME>

188

7.4 ADO概述
ADO(ActiveX Data Objects)是由微软公司推出的以ActiveX技术为基础的数据存取方法。 ADO的主要特点是使用更加容易,访问速度更快,而对磁盘和存储容量的要求小;ADO支持建立 各种客户/服务器模式与基于Web的应用程序;具有远程数据服务RDS(Remote Data Service) 的特性,通过RDS能够在一次往返中将服务器端的数据传送到客户端的应用程序或WEB页面中, 并在客户端对数据进行处理后,立即更新服务器端的数据。 采用ADO所基于的OLEDB技术,可以对电子邮件、文本文件、数据表格等各类数据通过统一的 接口API(Application Programming Interface)接口进行存取,是远程数据存取的一个主要发展 方向。 对于异种数据库的访问,首先需要一个简单而统一的应用程序接口(API),应用程序通过它访问 和修改各种各样的数据。典型的数据源是支持ODBC(Open Database Connectivivity)标准的关 系型数据库,通过一系列SQL命令进行数据操作。问题是数据源可能是一个简单的文本文件,也可 能是来自不同种类甚至特别定义的数据库的一个集合。而且,访问和修改数据的方法不可能预先确 定。 解决这个问题的方法就是OLEDB,这是一个系统级的数据库编程接口,它提供了一系列有关数据 库管理系统服务的统一的COM(Component Object Model)接口。通过OLEDB可以存取异构的 关联和非关联信息,包括电子邮件、文件系统、文本、图形、图形化数据以及客户定制对象。 ADO就是连结OLEDB与应用程序的数据操作接口。ADO定义一个设计原型,其中概括了一系 列进行数据存取和更新所必须的行为说明。设计原型表示了一个对象模型,包括实现原型所对应的 对象集,定义进行数据操作的对象方法,表示数据或对象方法行为控制的属性等。与对象相关的事 件说明了将要发生或已经发生的数据操作过程。 在利用Ado开发数据库过程中,会用到大量的ADOVB常量,微软提供了常量文件ADOVB.INC, 只要在ASP文件的开发包含该文件就可以使用已定义的常量。
189

7.5.1 建立Connection对象
在使用对象之前首先必须创建它。创建一个connection对象和真 正打开connection是两个不同的概念。我们可以这样来理解,创建一 个connection对象相当于定义了一个可以用于与数据源的变量,但是, 这时候,还没有真正的数据源建立连接。只有在打开connection以后, 在真正的与数据源建立了连接,才可以对数据源进行查询、添加、删除 操作。 创建connection对象主要有两种方法: 方法一:调用Server对象的CreateObject方法 Set objcn = Server.CreateObject("adodb.connection") 方法二:利用<object>标记,来创建connection对象 <object RUNAT=Server ID=objcn PROGID="adodb.connection"> </object> RUNAT=server,表示在服务器端创建对象,如果没有该属性, 则在客户端执行,所以,在用这种方法创建对象时,不能忽略该属性。
190

7.5.2 Connection对象的属性和方法
1、Connection对象的属性 Connection对象的属性控制高层的数据处理,如ADO如何 与数据源提供者相连接以及事务如何被执行等。
? ? ? ? ? ? ? ? Attributes属性 CommandTimeout属性 ConnectionString属性 ConnectionTimeout属性 DefaultDatabase属性 Mode属性 Provider属性 Version属性 Open方法 Close方法 Execute方法 BeginTrans方法 CommitTrans方法 RollbackTran方法

2、Connection对象的方法
? ? ? ? ? ?

191

7.5.3

利用Connection对象存取数据库

【例7-16】往学生表中加入一个学生,其基本信息:
学号:20020113 姓名:丁晓 性别:女 出生日期: 1985-11-14 学院:机械 成绩:88 <% on error resume next dim objcn dim sql set objcn = Server.CreateObject("ADODB.CONNECTION") objcn.open "dsn=student;uid=sa;pwd=;" sql="insert into 学生表(学号,姓名,性别,出生日期,学院,成绩) values(?20020113?,?丁晓’,?女’,?1985-11-14?,?机械’, 88) " objcn.execut sql objcn.close set objcn = nothing %>

利用SQL语句向数据库中插入数据,可以看到写SQL语句虽然比较烦 琐,但是很灵活,执行速度快。

192

7.5.3

利用Connection对象存取数据库(续上)

【例7-17】显示学生表中所有学生的基本信息。
<%on error resume next dim objcn dim objrs dim sql set objcn = Server.CreateObject("ADODB.CONNECTION") objcn.open "dsn=student;uid=sa;pwd=;" sql = "select学号,姓名,性别, 出生日期,学院,成绩 from 学生表" set objrs = objcn.execut(sql) response.write "<table><tr><td colspan=6>学生表</td></tr>" response.write "<table><tr><td>学号</td><td>姓名</td><td>性别</td>" response.write "<td>出生日期</td><td>学院</td><td>成绩</td></tr>" do while not objrs.eof response.write "<tr>" response.write "<td>" & objrs("学号") & "</td>" response.write "<td>" & objrs("姓名") & "</td>" response.write "<td>" & objrs("性别") & "</td>" response.write "<td>" & objrs("出生日期") & "</td>" response.write "<td>" & objrs("学院") & "</td>" response.write "<td>" & objrs("成绩") & "</td></tr>" loop objrs.close objcn.close set objrs = nothing set objcn = nothing%>

在上面的例子中用到了recordset对象,这个对象将在下一节介绍。
193

7.5.4 事务处理
事务是一个最小的工作单元,不论成功与否都作为一个整体进行工作。不会有部分完成 的事务。由于事务是由几个任务组成的,因此如果一个事务作为一个整体是成功的,则事务 中的每个任务都必须成功。如果事务中有一部分失败,则整修事务失败。 当事务失败时,系统返回到事务开始前的状态。这个取消所有变化的过程称为“回 滚”(rollback)。例如,如果一个事务成功更新了两个表,在更新第三个表时失败,则系统 将两次更新恢复原状,并返回到原始的状态。 为声明一个网页是事务性的,使用下列指令: <% TRANSACTION = value %> 对TRANSACTION指令可能的设置有:
Disabled 告诉COM+不希望在事务中涉及组件。 Requires_New 即使已存在一个事务,也启动一个新的事务。 Required 如果不存在事务就启动一个新的,如果存在就参与到其中。 Supported 不启动一个事务,但是如果事务已经存在就参与它。 Not_Supported 即使存在事务,也不参与事务。

这些值与使用组件服务浏览器为每个组件设置的Transaction Support属性的作用相同。 TRANSACTION指令必须处在ASP页面脚本的第一行,通常由LANGUAGE指令包含。 如果这之前在页面中有任何内容,将产生脚本错误。如同组件中的事务一样,如果到达代码 的最后一行,还没有提交或终止,则COM+假定提交,并把变化写入磁盘。另外,由页面调 用的每个对象能够使用同一ASP页面的ObjectContext对象参与事务,通常就是这么做的。
194

7.5.4 事务处理
当编写一个事务性ASP脚本时,你可能想直接影响脚本的事务的结果。像为事 务编写的组件一样,ASP页也能利用ObjectContext对象。自从发表了ASP 2.0 以后,就可以利用这个对象,它为开发者需要的所有事务处理例程提供功能。服务 器组件参与事务时访问的就是这个对象,它包含SetAbort和SetComplete方法。 下列代码显示了在一个事务性Web页中如何实例化两个COM对象和一个事务, 并在这两个对象上调用一个方法。 注意,页面顶部的事务设置表明请求一个事务。正是该设置使该页面像COM 组件一样参与同一事务。事实上,只要COM组件的Transaction Support属性为 Required或Supported,它们就变成由ASP页启动的事务的一部分。
<%@Language=VBSCRIPT

TRANSACTION=Required%>
<HTML> <% dim objA dim objB

set objA = server.CreateObject("student.classA")
set objB = server.CreateObject("student.classB")

If Not objA.Go = 0 then ObjectContext.SetAbort elseif not objB.Go = 0 then ObjectContext.SetAbort else ObjectContext.SetComplete end if set objA = Nothing set objB = Nothing %> </HTML>
195

7.6

用来返回一个数据库记录集的Recordset对象

【例7-18】显示学生表的字段名。
<%dim objrs dim sql dim i set objrs = server.CreateObject("adodb.recordset") sql = "select 学号,姓名,性别,出生日期,学院,成绩 from 学生表" objrs.open sql, "dsn=student;uid=sa;pwd=;" response.write "<table border=1><tr><td align=center colspan=6>学生表 </td></tr><tr>" for i=0 to objrs.fields.count-1 response.write "<td>" & objrs.fields(i).name & "</td>" next response.write"</tr>" do while not objrs.eof response.write "<tr>" for i=0 to objrs.fields.count-1 response.write "<td>" & objrs.fields(i).value & "</td>" next response.write "</tr>" objrs.movenext loop response.write "</table>"%>

该例子,使用fields来计算recordset有几列,并且读取列名和每列的值,显示在 HTML页面上。运行结果如图7-19所示:
196

7.6.1 建立Recordset对象
建立Recordset对象的方法主要有三种方法: 方法一:通过调用connection.execute返回recordset <% set objrs = objcn.execute( sql) %> 方法二:使用server.CreateObject来创建 <% set objrs = server.createobject("adodb.recordset")%> 方法三:使用object标记 <object RUNAT=Server ID=objrs PROGID="adodb.recordset"> …… </object>
197

7.6.2 Recordset对象的属性和方法
1、Recordset对象的属性
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ActiveConnection属性 Source属性 CursorType属性 LockType属性 Filter属性 CacheSize属性 MaxRecords属性 BOF和EOF属性 RecordCount属性 BookMark属性 AbsolutePosition属性 PageSize属性 AbsolutePage属性 PageCount属性 EditMode属性 Status属性

198

7.6.2 Recordset对象的属性和方法
2、Recordset对象的方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? Open方法 Close方法 Clone方法 MoveFirst、MoveLast、MoveNext、MovePrevious方法 Move方法 GetRows方法 NextRecordSet方法 Requery方法 Resync方法 AddNew方法 Delete方法 Update方法 CancelUpdate方法 Supports方法
199

7.6.3 利用Recordset对象查询记录
尽管Connection对象简化了连接数据库和查询任务,但 Connection对象仍有许多不足。确切地说,检索和显示数据库信息的 Connection对象不能用于创建脚本;您必须确切知道要对数据库作出 的更改,然后才能使用查询实现更改。 对于检索数据、检查结果、更改数据库,ADO 提供了Recordset 对象。正如它的名称所暗示的那样,Recordset对象有许多您可以使用 的特性,根据您的查询限制,检索并且显示一组数据库行,即“记录”。 Recordset对象保持查询返回的记录的位置,允许您一次一项逐步扫描 结果。 根据Recordset对象的指针类型属性设置,您可以滚动和更新记录。 数据库指针可以让您在一组记录中定位到特定的项。指针还用于检索和 检查记录,然后在这些记录的基础上执行操作。Recordset对象有一些 属性,可用于精确地控制指针的行为,提高您检查和更新结果的能力。 例如,您可以使用CursorType和CursorLocation属性设置指针的类 型,将结果返回给客户端应用程序(结果通常保留在数据库服务器上) 并显示其他用户对数据库的最后一次更改。
200

7.6.4 分页显示数据
目前的电子公告板程序,为了提高页面的显示速度,一般不会将所 有的帖子全部在一页中罗列出来,而是将其分成多页显示,每页显示一 定数目的帖子数, 那么如何实现将数据库的查询结果分页显示呢?主要有两种方法: (1)将数据库中所有符合查询条件的记录一次性的都读入 recordset中,存放在内存中,然后通过ADO Recordset对象所提供 的几个专门支持分页处理的属性:PageSize(页大小)、PageCount (页数目)以及AbsolutePage(绝对页)来管理分页处理。 (2)根据用户的要求,每次分别从符合查询条件的记录中将规定 数目的记录数读取出来并显示。 两者的主要差别在于前者是一次性将所有记录都读入内存然后再根 据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指 示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达 到分页显示的功能。 这里,我们主要介绍第一种方法。
201

7.6.4 分页显示数据(实例)
【例7-19】分页显示学生表。
sub showpage( ) 'on error resume next dim pagesize dim pagestart dim pageno dim pagetotal dim i dim j pagesize = 20 pageno = cint(request("pageno")) if pageno=0 then pageno=1 dim objcn dim objrs set objcn = server.CreateObject("adodb.connection") set objrs = server.CreateObject("adodb.recordset") objcn.open "dsn=student;uid=sa;pwd=;" sql = "select 学号,姓名,性别,出生日期,学院,成绩 from 学生表" objrs.open sql, objcn, 1, 1 pagestart = pagesize * (pageno-1) +1 pagetotal = objrs.recordcount / pagesize if( pagetotal < objrs.recordcount ) then pagetotal = pagetotal+1 end if objrs.move pagestart response.write "<table border=1><tr><td align=center colspan=6>学生表</td></tr><tr>" for i=0 to objrs.fields.count-1 response.write "<td>" & objrs.fields(i).name & "</td>" next response.write"</tr>" j=1 do while (not objrs.eof) and (j<=pagesize) response.write "<tr>" for i=0 to objrs.fields.count-1 response.write "<td>" & objrs.fields(i).value & "</td>" next response.write "</tr>" objrs.movenext j=j+1 loop response.write "</table>" if( pageno > 1 ) then response.write "<a href=""list.asp?pageno=" & pageno-1 & """>上一页</a> " else response.write "上一页 " end if if( pageno < pagetotal ) then response.write "<a href=""list.asp?pageno=" & pageno+1 & """>下一页</a> " else response.write "下一页 " end if objrs.close objcn.close set objrs = nothing set objcn = nothing end sub %>

202

7.6.5 利用Recordset对象更新数据库
1、添加记录
要在记录集中添加记录,使用AddNew方法。有两种使用AddNew的方法。第一种 没有任何参数,仅仅调用AddNew,在记录集的最后添加一个空记录。在调用Update 方法保存所做的更改之前,可以随意地修改字段中的数据:
With objrs .open ?学生表’,objcn,adoOpenDynamic,adLockOptimistic,adCmdTableDirect .AddNew .Fields("学号") = '20030119' .Fields("姓名") = '王丹' .Fields("性别") = '女' .Fields("出生日期") = '1987-4-11' .Fields("学院") = '电子' .Fields("成绩") = 89 .Update end with

这添加了一条新纪录,设置六个强制型的字段值。 另一种方法是使用AddNew方法的可选参数,这是两个数组,一个是字段名,另一 个是字段的值。
With objrs .open '学生表',objcn,adoOpenDynamic,adLockOptimistic,adCmdTableDirect .AddNew Array('学号','姓名','性别','出生日期','学院','成绩'), _ Array('20030119','王丹','女','1987-4-11','电子','89') end with
203

7.6.5 利用Recordset对象更新数据库
2、编辑记录
编辑记录与添加记录的方法相似,不同之处在于不需要调用AddNew方法: sql = "select 学号,姓名,性别,出生日期,学院,成绩 from 学生表" & _ " where 学号='20030119'" With objrs .open sql,objcn,adoOpenDynamic,adLockOptimistic,adCmdText .Fields("出生日期") = '1987-5-11' .Update end with

3、删除记录
删除记录需调用Delete方法。删除哪一条记录取决于可选的参数,可以是下面 AffectEnum常数中的一个: adAffectCurrent: 删除当前记录,缺省操作。 adAffectGroup: 删除匹配当前过滤条件的所有记录。 adAffectAll: 删除记录集中的全部记录。 AdAfffectAllChapters: 删除所有段(chapter)中的记录。 最简单的调用形式是:objrs.delete 这将删除当前记录。如果有一个过滤条件,并想删除所有匹配该条件的记录,那么仅 需加上适当的常数:objrs.delete adAffectGroup
204

7.6.6 Fields集合和Field对象
在创建一个RecordSet实例后,里面总是包含者一些列,而其中 每一列就对应着一个字段,因此Fields集合就对应着创建的RecordSet 中的每一个字段,就可以利用这个集合的一些属性来方便实际的编程。

1、Fields集合的属性
Count属性 返回RecordSet中的字段的个数,列出Recordset中的所有字段 的名字: for i=0 to objrs.fields.count-1 response.write objrs.fields(i).name & " " next Item属性 根据名称或序号返回Fields集合的特定成员field。

205

7.6.6 Fields集合和Field对象(续上)
2、Field集合的属性
ActualSize属性:使用ActualSize属性可返回Field对象值的实际长度。 Attributes属性:Attributes属性为只读,其值可能为以下任意一个或多 个FieldAttributeEnum值的和,如表7-14所示。 DefineSize属性:返回反映某个字段定义大小(按字节数)的长整型值。 Name属性:指示字段的名称。 NumericScale属性:设置或返回字节值,指示数字值所精确到的小数点 位数。 OriginalValue属性:使用OriginalValue属性可返回当前记录中某字段的 原始字段值。 Precision属性:使用Precision属性可确定表示数字Field对象值的最大位 数。 UnderLyingValue属性:指示数据库中Field对象的当前值。 Value属性:Field对象的缺省属性,用来返回字段值
206

7.6.6 Fields集合和Field对象(续上)
3、Field集合的方法
AppendChunk方法
语法:object.AppendChunk Data 将数据追加到大型文本、二进制数据 Field 对象 GetChunk方法 语法:variable = field.GetChunk(Size) 返回大型文本或二进制数据Field对象的全部或部分内容 。

207

7.7.1 建立Command对象
要独立于先前已定义的Connection对象创建Command对象, 首先将Command对象的 ActiveConnection属性设置为有效的连 接字符串。ADO仍将创建Connection对象,但它不会将该对象赋 给对象变量。但是,如果正在将多个Command对象与同一个连接 关联,则必须显式创建并打开Connection对象,这样即可将 Connection对象赋给对象变量。如果没有将Command对象的 ActiveConnection属性设置为该对象变量,则即使使用相同的连接 字符串,ADO也将为每个Command对象创建新的Connection对 象。
<% dim objcn dim objcmd set objcn = server.CreateObject("adodb.connection") objcn.open "dsn=stduent;uid=sa;pwd=;" set objcmd = server.CreateObject("adodb.command") objcmd.activeconnection = objcn %>
208

7.7.2 Command对象的属性和方法
activeConnection属性:指示command对象的连接信息。这个属性 设置或返回包含了定义连接或Connection对象的字符串。默认情况下为 Null对象引用。 commandText属性:包含要根据提供者发送的命令的文本,一般为 SQL语句、存储过程或者是一个表名。 commandTimeout属性:指示在终止尝试和产生错误之前执行命令期 间需等待的时间,默认值为 30秒。 commandType属性:指示Command对象的类型,使用 CommandType属性可优化CommandText属性的计算,如7-15所示。 prepared属性:指示执行前是否保存命令的编译版本,

1、Command对象的属性

2、Command对象的方法
createParameter方法 direction方法 size方法 value方法

209

7.7.3 利用Command对象存取数据库
Command对象特定地为处理各种类型的命令而设计,特别是那些 需要参数的命令。与Connection对象相似,Command对象可以运行返 回记录集和不返回记录集两种类型的命令。实际上,如果命令不含有参 数,那么它并不关心是使用Connection对象,还是Command对象,还 是Recordset对象。 对于一个返回记录集的命令,可使用Execute方法。然而,与 Connection对象不同,必须使用CommandText属性,而不能在 Execute方法中使用命令文本。
Set objCmd = Server.CreateObject("Adodb.command") objCmd.CommandText = '学生表' set objrs = objCmd.execute

这是告诉Command对象去执行一个简单的、返回一个只读记录集 的命令的最简便方法。

210

7.7.4 非参数查询和参数查询
在数据查询中,有时候要调用存储过程,这个时

候,参数就显得尤为重要。需要用到command的
createParameter方法来创建Prameter对象。

211

7.7.5

Parameters集合和Parameter对象

1、Parameters的属性

count属性:指示parameters集合中parameter对象的个数 item属性:根据名称或序号返回集合的特定成员,它有一个索引,可以是所 有参数在Parameters集合中的参数值,也可以是参数的名字。

2、Parameters的方法

append方法 语法:Parameters.append parameterObject 功能:往Parameters集合中增加parameter对象 delete方法 语法:Parameters.Delete Index 功能:从Parameters集合中删除对象。 Index字符串,代表将要删除对象名称,或者对象在集合中的顺序位置(索 引)。 refresh方法 语法:Parameters.Refresh 在某些对象的Properties集合上使用Refresh方法可使用提供者提供的动态属 性填写集合,这些属性只将功能性信息提供给ADO支持的内置属性之外 的提供者。
212

7.7.5

Parameters集合和Parameter对象(续上)

3、Parameter的属性

4、Parameter的方法

attributes属性:Attributes属性为读/写,并且其值可能为以下任意一个或 多个ParameterAttributesEnum值的和,如表7-16所示。 direction属性:指示parameter所标明的是输入参数、输出参数还是既是输 出又是输入参数,或该参数是否为存储过程返回的值,表7-17所示。 name属性:指示对象的名称 precision属性:指示在Parameter对象中数字值或数字Field对象的精度 size属性:表示Parameter对象的最大大小(按字节或字符)。 type属性:指示Parameter对象的数据类型,系统定义的类型如表7-18所示 value属性:指示赋给Parameter对象的值。 appendchunk方法 语法:object.AppendChunk Data 功能:将数据追加到大型文本、二进制数据Parameter对象。 如果Parameter对象Attributes属性中的adFldLong位被设置为真,则可以对该 参数使用AppendChunk方法。Parameter对象上的第一个AppendChunk调用将数 据写入参数,覆盖任何现有数据,随后Parameter对象上的AppendChunk调用可 添加到现有的参数数据中。传送空值的AppendChunk调用则放弃所有参数数据。
213

7.8.1 Errors集合的属性和方法
包含所有的在对数据提供者操作过程中失败产生的Error对象

1、Errors集合的属性
count属性 指示Errors集合中错误对象的个数

Item属性
指示Errors集合中的每个具体的错误对象

2、Errors集合的方法
clear方法
用来清楚Errors集合中的所有成员,一旦在连接中加入了Error对象, 就可以创建错误处理例程,以便更高效地处理产生错误的原因。

214

7.8.2 Error对象的属性
? description属性:包含与错误相关的文本信息。

? number属性:包含错误常量的长整型整数值
? source属性:标识产生错误的对象。在向数据源发出请求之后, 如果 Errors 集合中有多个Error对象,则将会用到该属性 ? SQLState属性:指示给定Error对象的SQL状态。 ? nativeError属性:指示给定Error对象的、特定提供者的错误代 码。 ? helpFile和helpContext属性:指示与Error对象关联的帮助文件

和主题。如果在HelpFile属性中指定了帮助文件,则
HelpContext属性被用于自动显示它所标识的帮助主题。如果没 有得到相关主题,则HelpContext属性返回零,并且HelpFile属 性返回零长度字符串("")
215

第8章 ASP动态网页设计开发实例---通用企业网站模板程序
? 8.1 通用企业网站模板程序的功能分析

? 8.2 建立数据库
? 8.3 连接数据库 ? 8.4 通用企业网站模板程序的系统设计
? 8.4.1 系统数据信息的实现
? 8.4.2 主页的子栏目的显示以及新闻、产品、技术文档等信 息的实现 ? 8.4.3 用户调查的实现 ? 8.4.4 访客留言簿的实现 ? 8.4.5 管理页面程序的实现

216

8.1 通用企业网站模板程序的功能分析
开发网络程序时,并不是越复杂越好,要根据要求进行合理的设计,过分 复杂的设计不仅会浪费大量的精力和时间,而且也会使访问者眼花缭乱、不知 所措。鉴于这一考虑,通用企业网站模板程序的设计原则就是简单实用、美观 大方。 通过该系统的首页和管理页面,大致实现的功能如下:
(1)可以在首页远程调用指定的条数新闻 (2)可以随意增删修改网站子栏目及其超链接 (3)可以增删专题新闻、热点新闻、行业动态、技术文档以及产品图文信 息等 (4)可以智能模糊搜索相关信息内容 (5)可以保存显示用户调查结果 (6)在线更改管理员密码 (7)在线更改网站版面风格,如企业徽标LOGO,广告BANNER条等 (8)在线更改落款以及联系方式和版权信息 (9)可以显示相关新闻,可以指定。

此外,还增加了一个通用的访客留言簿,通过该留言簿可以给来访客户发 表信息,同时也可以给系统管理员删除垃圾信息。
217

8.2 建立数据库
首先利用微软的ACCESS 2000,建立数据库文件tlzx.mdb,如

图8-1所示。
接着,在此基础上建立相关的数据表,其中: ? dtitle表 图8-2所示。 ? system表 保存网站本身的一些系统信息如网站标题、 企业徽表LOGO、版面风格等,如图8-3所示。 ? guest表 保存企业留言簿信息,如图8-4所示。 保存网站子栏目名及超链接地址路径,如

? admin表保存系统管理员及其口令,如图8-5所示。
? news表 如图8-6所示。 ? topic 表保存专题栏目名,如图8-7所示。
218

保存企业相关的新闻信息及产品资料等,

8.3 连接数据库
由于本系统是一通用企业网站模板程序,故企业的名称、网页的标题以及 版权信息等数据都要从数据库读取,因而连接数据库就成了所有页面都必须要 设置的工作,其次新闻信息、产品信息、技术文档等的读取和添加,都要先连 接系统数据库文件tlzx.mdb。 由于手工建立DSN数据源的方法比较烦琐,故而本系统采用了不用DSN直 接建立数据源的方法。具体实现如下:
Dim conn,cnpath Set conn = Server.CreateObject("ADODB.Connection") cpath=Server.MapPath("data/tlxx.mdb") conn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & cnpath

说明: 前两句:利用Server对象的CreateObject方法,建立一个数据库存取组 件的Connection对象实例conn。 第三句:利用Server对象的MapPath方法将数据库文件的相对路径转换成 绝对路径。 第四句:执行conn对象的Open方法来打开数据库。其中,第一项表示将 打开的数据库类型是ACCESS数据库,第二项表示打开的数据库的物理路径, 此处的前部分内容的拼写不能错,否则将产生链接失败。
219

8.4.1 系统数据信息的实现
为了便于企业网站的相关系统信息内容,如页面标题、企业徽标、主页广告 条以及版权和联系方法等,几乎在所有的页面都采用系统数据库中的system数 据表来显示,然后在管理页面中由系统管理员对其进行修改。部分程序如下: <% Dim rs9,sql9 Set rs9 = Server.CreateObject("ADODB.Recordset") sql9 ="SELECT * From system Order By id DESC" RS9.open sql9,Conn,3,3 %> 说明: 前两句:利用Server对象的CreateObject方法,建立一个数据库存取组件 的Recordset对象实例rs9。 第三句:利用SQL查询字符串sql9以降序方式查询system数据表。 第四句:执行rs9对象的Open方法来打开记录集,这样在后面就可以使用该 查询结果。

1、页面标题、企业徽标以及广告条的实现 2、版权及联系方法的实现
220

8.4.2

主页子栏目的显示以及新闻、产品、技术文档等信息的实现

? 子栏目的动态显示

? 热点新闻、行业动态、技术文档、产品新贵及专题
新闻等信息的动态显示 ? 本站新闻智能搜索及公告栏的显示

221

8.4.3 用户调查的实现
网上用户调查,就是让用户投票,然后统计当前投票结果。图8-23

就是主页上的用户调查界面,当选择一个选项点击“投票”后将提交给
yhdc_tj.asp页面,该页面收到用户提交的信息后进行计数加1,并存 到文本文件data/ result_*.txt中,最终转到yhdc.asp页面显示其统 计结果,如图8-24所示。

222

8.4.4 访客留言簿的实现
本留言簿首页fkly.asp(如图8-25所示)尽管很长,但结构简单,

上面是一个添加留言表单,下面是显示留言部分。填写留言完毕,按确
定后将传送到fkly_add.asp去处理,处理完毕后再引导回首页。

223

8.4.5 管理页面程序的实现
管理页面程序由于只有系统管理员才具有管理权限,故必须先登陆 (如图2-30所示)。 当系统管理员输入用户名和密码后,进行验证。通过后,将进入管 理页面如图2-31所示。

224

8.4.5 管理页面程序的实现(续上)
1、系统更改
图2-32是管理页面中的系统更改界面system.asp,在这些信息 的边上都有辅助说明,同时有些内容(如公告栏等)允许使用HTML 标记以达到某些特殊效果(如换行、加粗体等)。当修改了其相关信 息后,可以按“提交”按钮提交给systemsave.asp。然后利用SQL 的update语句进行更新系统信息。

225

8.4.5 管理页面程序的实现(续上)
2、密码更改
图2-33是管理页面中的密码更改界面passmenu.asp,通过提交 相关信息给password.asp页面处理,可以改变系统管理员的用户名 和密码,其实现技术基本同系统更改部分。

226

8.4.5 管理页面程序的实现(续上)
3、添加新闻
图2-34是管理页面中的添加新闻信息界面newsadd.asp,通过提 交相关信息给newssave.asp页面处理,可以添加新闻信息到库中, 同时也把其进行了信息归类和专题归类,这样在主页中就可以显示在 相关栏目中(如属于“行业动态”类别的,则就在“行业动态”部分 显示)。其实现技术基本同系统更改部分,只是在打开记录集后先增 加了一条空记录(实现语句为:rs.addnew),然后相关信息赋给它, 再对其进行更新。

227

8.4.5 管理页面程序的实现(续上)
4、删除新闻
图2-35是管理页面中的删除新闻信息界面newskill.asp,通过提交信息 id号给yankill.asp页面处理,可以删除库中的该id号新闻信息。在该页面中, 一方面在右边显示了当前最新添加的新闻信息标题,通过其可以查看到id号, 同时也采用了分页显示方法,该技术见前面的“更多信息”页面(如 newsmore.asp)部分;另一方面还提供了一个“搜索”按钮(提交给 keyword.asp),可以输入新闻信息内容中的关键词来得到相关信息的id号, 并显示在右边,供删除时决定该删除否,其搜索技术见前面“新闻智能搜索” 部分。

228

8.4.5 管理页面程序的实现(续上)
5、添删专题
图2-36是管理页面中的添删专题栏目界面zhuantiadd.asp,通过提交专 题id号给yantopickill.asp页面处理,可以删除库中的topic表里对应id号的专题 栏目。执行该功能时,请系统管理员要小心,因为一旦删除后就无法恢复,同时 库中相对应的所有新闻信息的关联将丢失。一般来说,此项功能只应用于某企业 网站刚开始建立时使用添加功能录入相关专题,一旦添加好其专题栏目,就请不 要在更改了。其相关技术见前面的数据库中表记录的添加和删除。

229

8.4.5 管理页面程序的实现(续上)
6、导航分类
图2-37是管理页面中的导航分类界面dhfl.asp,通过提交导航栏目id号给 dhflkill.asp页面处理,可以删除库中的dtitle表里对应id号的导航栏目。同样, 执行该功能时,请系统管理员也要小心,一旦删除该导航栏目后就无法显示了, 但可以再次将导航名称和链接地址路径添加进去,唯一不同就是表中导航id号不 再是原来的了,而是新的id号。通过导航栏目的添加功能,可以随意的扩充网站 子栏目。其相关技术也同前面的数据库中表记录的添加和删除。

230


更多相关文档:

动态网站制作教程

动态网站制作教程 在你看这教程前,我想你已经网上看过很多类似教程,那些教程肯定会告诉你怎么学习各种动态编程知识,比 如什么 asp,php,asp.net 等等,如果你想做...

从零开始动态网站制作实例入门教程

从零开始:动态网站制作实例入门教程 从零开始 动态网站制作实例入门教程本期将完成动态网站的初步工作—— 第一个动态站点:用 DreamWeaver MX 建动态站 第一个数据...

动态网页设计

基于Dreamweaver8 的动态网页设计【摘要】 伴随着社会的发展和教育的现代化, ...参考文献: [1] 张胜.Dreamweaver8+ASP 动态网站建设基础与实践教程.电子工业...

ASP动态网页制作教程课程笔记

ASP动态网页制作教程课程笔记_电脑基础知识_IT/计算机_专业资料。www.52zxw.com——我爱自学网原创出品 ASP 动态网页制作课程笔记 1-1、ASP 课程安排和简介一、...

动态网站制作初步教程

21 asp.net 动态网站制作初步教程一、下载软件并安装 1、安装 SQL2008 2、安装 Visual Studio 2010 和.net FrameWork 4.0 3、安装 Adobe CS6 中的 DW、PS、...

.NET动态网页设计报告

.NET动态网页设计报告_互联网_IT/计算机_专业资料。ASP.NET动态网页设计报告ASP.NET3.5 网站开发实例教程 实验报告 题目: 学院: 专业: 学号: 姓名: 联系方式: ...

基于HTML语言的动态网页制作

ASP 动态网页设计程序设计与制作实训教程[M]. 机械工业出版社,2006. [2] 吴素芹等. ASP 动态网页制作教程[M]. 人民邮电出版社,2008. [3] 张翔.网页制作与...

ASP动态网页设计教程

ASP动态网页设计教程_互联网_IT/计算机_专业资料。最实用的动态vb网页设计 ASP 动态网页设计内容概述本章将阐述动态网页编程的基础知识,详细讲解如何利用 ASP 技术...

动态网页设计教学大纲

动态网页制作教程》. 刘梅彦.第一版..\清华大学出版社.2010-10 九、课程考核与成绩评定方法 考核类型:考查 计分办法:平时成绩×30%﹢考试成绩×70%=总成绩...
更多相关标签:
asp动态网页设计教程 | 动态网页设计 | 动态网页设计模板 | 公司网页制作费用 | 动态网页制作教程 | 动态网页教程 | 网页制作教程 | 动态网页制作 |
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com