网站的ASP实现技术
ASP(Active Sever Page)是一个开放式的无需进行编译的应用程序环境,提供了CGI程序和脚本的灵活性,同时不会使性能显著下降。与CGI不同的是,ASP是在服务器的进程内运行,是多线程的。它将IDC的简单性和ISAPI的灵活性综合在一起,同时又比CGI和Perl脚本编写系统具有优势。它把HTML的简单性、脚本程序编写以及ActiveX服务器组件等常见工具组合在一起,用以创建动态的、功能强大的网站。
1 ASP网络编程基础
ASP概述
1. ASP程序的运行方式
与一般的程序不同,ASP程序无须进行编译,其程序的控制部分是用VBScript、JavaScript等脚本语言来设计的,当运行ASP程序时,脚本程序将一整套命令发送给脚本解释器(即脚本引擎),由脚本解释器进行翻译并将其转换成服务器所能执行的命令。简单地说,ASP就是运行于Web服务器上的动态网页,网页由嵌入服务器的ASP解释程序解释后,生成相对简单的页面返回给浏览器。任何简单的浏览器都可以浏览这些生成的页面,而动态网页并不直接返回给浏览器。因而广大Web设计者不必为客户浏览器是否支持而担心,即使在同一个“*.asp”文件中使用不同的脚本语言,也无须为此担忧,因为所有的一切都将在服务器端进行,客户浏览器得到的只是一个程序运行的结果,而设计者也只需在“*.asp”文件中声明使用不同的脚本语言即可。
1 ASP网络编程基础
2. ASP文件及使用
ASP文件以“.asp”结尾,是一个文本文件,可以用任何文字编辑器来进行设计,如Visual InterDev 、Notepad等等。
一般说来,ASP文件是由HTML标识和VBScript或者JavaScript程序代码混杂在一起构成的,是一个标准的网页。例如:
<%@Language="VBScript"%>
<HTML>
<HEAD>
<TITLE>ASP文档</TITLE>
</HEAD>
1 ASP网络编程基础
<BODY BGOOLOR="#FFFFFF">
<p>体验一下这种感觉<p>
<% for i=3 to 5 %>
<Font SIZE=<%=I %>>
是不是有点激动?<br>
<% next %>
</BODY>
</HTML>
程序中的两个括号和百分号不能缺少,这是ASP程序的起始标志。
1 ASP网络编程基础
3. ASP的执行和发布
要让别人看到上述例子的运行效果,只需发布这个已编好的ASP文件,把上面的文件存储为“”,然后把它放到相应的Web服务器目录下即可,也可以直接把它放在默认的根目录wwwroot下。如果计算机名为auto,则可以在IE地址里输入如下网址来运行这个程序:http://auto/。
也可以用“
服务器收到这个请求后,会用语言解释器解释源程序,然后把它转化为一般的HTML代码发送给浏览器端。用浏览器查看到的程序代码如下:
1 ASP网络编程基础
<HTML>
<HEAD>
<TITLE>ASP文档</TITLE>
</HEAD>
<BODY BGOOLOR="#FFFFFF">
<p>体验一下这种感觉<p>
<Font SIZE=3>是不是有点激动?<br>
<Font SIZE=4>是不是有点激动?<br>
<Font SIZE=5>是不是有点激动?<br>
</BODY>
</HTML>
1 ASP网络编程基础
4. ASP内置对象
在面向对象的程序设计中,对象就是指由作为完整实体的操作和数据组成的变量。在对象中,用户使用对象的服务是通过由一组方法或相关函数的接口来访问对象的数据的,客户端可以调用这些方法执行某种操作。
ActiveX组件是建立基于ASP的Web应用程序的关键,它提供了在脚本中执行任务的对象。组件是包含执行某项或一组任务的代码,它可以执行公共任务,所以程序员就不用自己去编写执行这些任务的代码,只要知道如何访问组件提供的对象就行了。
1 ASP网络编程基础
ASP共有以下六个内置对象:
(1)Request对象:用于访问任何基于HTTP请求传递的所有信息,包括从HTML表单用POST或GET方法传递参数、Cookie和用户认证。
(2)Response对象:用来控制发送给用户的信息,包括直接发送信息给浏览器、重定向浏览器到另一个URL和设置Cookie的值。
(3)Server对象:用来实现对服务器上的方法和属性的访问。
(4)Application对象:用来实现在给定应用程序的所有用户之间共享信息,并在服务器运行期间—直保存数据。
1 ASP网络编程基础
(5)Session对象:用来实现存储特定用户会话所需的信息。
(6)Object Context对象:用于在页面内进行事务处理。
在后面的章节中,将对这些对象详细的介绍。
1 ASP网络编程基础
5. ASP服务器组件
应用ASP服务器组件(ActiveX Serve Components)可以使用户很方便地使用设计好的程序制作动态网页。ASP有以下内置服务器组件:
(1)文件存取组件(File Access Component):用于读写服务器文件的功能。
(2)访客计数器组件(Page Counter Component):用于记录访客次数。
(3)广告翻转器组件(Content Rotator Component):用于交替显示图像和文字,并且可以通过图形连接到另一个URL。
1 ASP网络编程基础
(4)浏览器描述组件(Browser Capabilities Component):用于检查所使用的浏览器,根据其特性而决定传送给浏览器的内容。
(5)内容连接组件(Content Linking Component):通过应用程序的ASP文件,提供逻辑导览工具,而不需要文件中的URL参考。
(6)数据库存取组件(Data Object Component):用于动态地存取数据库以及其他的表单结构,也可用于从网页中显示内容,建立查询以及完成其他的数据库工作。
(7)电子邮件组件(Email Component):用于给使用者发送E-mail。
1 ASP网络编程基础
6. 开发工具和开发平台
ASP的开发平台应首选Windows NT Server(Windows 2000 Server)上的IIS;其次可选择Windows NT Workstation(Windows 2000 Professional)或Windows 95/98的 Personal Web Server(PWS)。
PWS是为个人发布网页开发的,目的是要建立一个小容量的公司内部网。它只能提供基本的WWW服务,管理简单的Web界面,当然还支持ADO访问数据库。需要注意的是,因为这是一个小容量的Web服务器,Microsoft限制为最多只能有10个并发用户。Windows NT Workstation的PWS比Windows 95/98的PWS要强大一些,另外附加了FTP服务、ISM界面、身份验证、从本地和网络驱动器发布等功能。
1 ASP网络编程基础
以IIS作为开发平台,ASP具有强大的功能。在建立现代的、高度复杂的Web站点时,IIS可以提供功能相当强大的帮助,除了PWS提供的功能外还提供以下功能:
(1)Index Server(索引服务器):对站点内容进行全文本索引和搜索。
(2)Site Server Express:用于分析内容和站点的用途。
(3)SMTP服务:用于发送电子邮件。
(4)NNTP服务:用于容纳个人信息。
1 ASP网络编程基础
(5)Certificate Server(证书服务器):用于发出可用于保护Web站点的证书。
有了开发平台,还需要开发工具来编写ASP应用程序。虽然,ASP可以用任何文本编辑器进行编辑,但显然只用记事本等简单的编辑器编写ASP是极不方便的。下面介绍三种优秀的ASP开发工具:
(1)Microsoft FrontPage:以HTML页面为基础,不但可以对站点进行可视化编辑,还可以管理整个网站平台。
(2)Macromedia Dreamweaver:和Microsoft FrontPage类似,但能够更好地支持不同浏览器。
(3)Microsoft Visual InterDev:是一个功能非常强大的WWW设计编辑工具。
创建ASP应用程序
1 . 什么是应用程序
基于ASP的应用程序是ASP页和ActiveX组件的集合。ASP应用程序具有以下特性:
(1)数据可以在应用程序内部共享,因此可以覆盖多个用户。
(2)一个应用程序包含事件可以触发某些应用程序脚本。
(3)一个对象的例子可以被整个应用程序共享。
(4)个别应用程序可以用Internet Service Manager来设置而获得不同属性。
创建ASP应用程序
(5)单独的应用程序可以被隔离出来,在自己的计算机内存中运行,这就是说,如果某个用户的应用程序遭到破坏,不会影响其他用户。
(6)可以停止一个应用程序(将其所有组件从内存中驱除),而不会影响到其他应用程序。
创建ASP应用程序
Windows NT Option Pack提供了在Web服务器上的ASP应用程序管理服务。例如,Internet服务管理器(Internet Service Manager)为应用程序开发人员提供了一个使用简便的管理工具来设置应用程序的属性。另外,ASP提供了允许用户的应用程序存储全局数据的脚本功能。
创建ASP应用程序
2. 应用程序与“”文件
“”是—个可选文件,在这个文件中,可以定义事件脚本和使用Session和Application对象。 “”文件的内容不能向用户显示,但是它存储的信息可应用于整个应用程序。这个文件必须命名为“”,并且存储在应用程序的启动点的目录下面,一个应用程序只能有一个“”文件。“”文件只能包含以下内容:
Application事件
Session事件
<OBJECT>的声明
类库的声明
“”与应用程序紧密相联,将在后面的Session和Application对象中介绍“”在ASP应用程序中的使用。
创建ASP程序
下面创建一个ASP程序,在这个程序中,用户输入自己的名字,然后在浏览器上就会显示该用户名字,并向用户问好。
这个小程序包括两个页面,一个是供用户填写和提交的页面,用HTML编写;另一个是显示用户名字并问好的页面,用ASP编写。
供用户填写和提交的HTNL文件源代码如下:
创建ASP程序
<HTML>
<HEAD>
<TITLE>Hello</TITLE>
<BODY BGCOLOR="#FFFFFF">
<Form action= method=GET>
<input type=text name=yourname><br>
<input type=submit value=submit>
</Form>
</BODY>
</HTML>
创建ASP程序
在文本框中填入Grandia这个名字后,按“Submit(提交)”按钮,程序自动转向“文件”,该程序源代码如下所示。
<HTML>
<HEAD>
<TITLE>Hello</TITLE>
<BODY BGCOLOR="#FFFFFF">
<%yname=("yourname")
"Hello,"&yname&"<br>"%>
<a href="">重填</a>
</BODY>
</HTML>
ASP对象
在面向对象的程序设计中,对象是典型的具有方法、属性或者集合的东西。其中方法决定了可以用该对象所做的事情。属性可以被读取出来用以了解对象状态或者设置对象状态,集合是由很多不同的和对象有关系的键和值的配对组成的。
这里以实例进行说明,该实例程序的源代码如下所示。
ASP对象
<HTML>
<%
Set MyDict=("")
"清华大学",""
"水木清华BBS",""
%>
ASP对象
<H1>我的字典中有<%=%>个记录。</HI>
<br>
<L11>其中第一个记录是<%=(“清华大学 ")%></H1>
</HTML>
ASP对象
当运行这个脚本程序的时候,Dictionary对象的一个实例将会生成,然后,两个键以及相对应的值被添加到Dictionary对象中,最后,显示出这个Dictionary对象的两个属性。
例子中的第一条脚本语句是利用ASP建立一个新的ActiveX对象实例的常用方法,其中“”用以建立一个对象实例。在这个例子中,变量MyDict指向一个Dictionary对象实例。
当一个对象实例建立之后,就可以调用它的方法。例如,利用Dictionary对象的add方法就可以在这个Dictionary中添加新的记录,用add方法配对添加键“清华大学”和相应的值“”。
ASP对象
ASP提供了可在脚本中使用的内置对象。内置对象不同于正常的对象。在利用内置对象的脚本时,不需要首先创建它的一个实例。在整个网站应用中内置对象的所有方法、属性集合都是自动可访问的。
本节主要介绍 Response、Request、Server、Session和Application对象。
ASP对象
1. Response对象
(1) Response功能概述
Reponse对象主要是用来向浏览器输出信息的,其功能类似于其他编程语言的输出函数,所不同的是,一般编程语言是在本地机运行,把结果输出到本地的输出设备(如CRT、打印机等)上,而ASP是在服务器端运行,Response把运行结果输出到客户端的浏览器上。下面是—个有关Response的小程序源代码:
<%@Language=VBScript%>
<HTML>
<head><title>的基本用法 </title></head>
ASP对象
<body>
<%
"<p>你好!"
T=now()
"<p>现在是:" & t & "<br>"
Chtl="谢谢!"
Cht2="欢迎光临!"
Chtl & Cht2
%>
</body>
</HTML>
ASP对象
Response还有一个重要的作用是重新定向网址。在运行ASP程序时,当遇到“”语句时,页面将自动指向“”后面的URL。这样程序员就可以根据客户的不同响应,为不同的客户指定不同的页面或根据不同的情况指定不同的页面。
ASP对象
(2)Response对象的属性
①Buffer属性:指示是否进行缓冲页输出。如果Buffer属性为Tree,则Response的内容要写入缓冲区,当脚本处理完或者调用了Flush或End方法后再发给客户。任何对Buffer属性进行修改的语句必须在主页和ASP脚本输出前面,如果试图在HTML或者脚本输出后面修改Buffer属性,那么程序就会出错。
Buffer属性的设置方法为:
=True
=False
在保证网页不出错的情况下,一般将Buffer属性设置为False,这时客户端浏览器可以同时处理接受到的部分网页,减少客户端的等待时间,特别是在运行大网页时。
ASP对象
②ContentType属性:指定服务器响应的HTTP内容类型。如果未指定ContentType属性,则为默认值text/HTML。
ContentType属性的设置方法为:
="text/HTML"
text/HTML表示HTML格式的文本文件,一般是“文件类型/文件格式”。例如:“image/gif”指的是GIF格式的图像文件。
ASP对象
③Charset属性:将字符集名称附加到Response对象中Content-type标题的后面。对于不包含“”属性的ASP页,Content-type标题将为:content-type:text/HTML。
Charset属性的设置方法为:
<% ="gb2312" %>
如果进行下列Charset属性设置后:
<% ="gb2312" %>
那么就会在“Content-type”标题后附加charset=gb2312,其格式如下:
content—type:text/HTML;charset:gb2312
ASP对象
④Expires属性:指定在浏览器上缓冲存储的页距过期还有多少时间。这里的时间是以分为单位的。
Expires属性的设置方法为:
=0
如果设置为=5,则页面每五分钟自动读取一次,即缓冲存储的页面五分钟后过期。若终止值设为0,则间隔时间设为0,这样客户端用户每次都可以从服务器而不是浏览器上得到最新的网页。
ASP对象
如果用户在某个页面过期之前又回到此页,就会显示缓冲区中的页面。如果设置为=0,则可使缓存的页面立即过期。这是一个较实用的属性,特别适用于要求信息即时传递的网页。当客户通过ASP的登陆页面进入Web站点后,应该利用该属性使登陆页面立即过期,以确保安全。
ASP对象
⑤ExpiresAbsolute属性:指定网页的过期时间,但与Expires属性不同是,该属性指定缓存于浏览器中的页面的到期时间能确切到具体日期和时间。在到期之前,若用户返回到该页,该缓存中的页面就显示。如果末指定时间,该主页在当天午夜到期。如果未指定日期,则该主页在脚本运行当天的指定时间到期。
ExpiresAbsolute属性的设置方法为:
=#Nov 19,2000 8:30:30#
ASP对象
(3)Response对象的方法
①Write方法:是Response方法中最常用的方法。该方法不仅可以将HTML语句写入网页,而且可以将VBScript脚本语句写入网页、控件和对象。
语法: "<Input type=radio>"
②Redirect方法:也是Response的常用方法。使用Redirect方法使浏览器立即重定向到程序指定的URL。
语法: URL
ASP对象
③WriteBinary方法:用来向客户端输出二进制数,一般是非文字资料, 如图像文件和声音文件等。Variable是一个变量,其值是将要输出的文件。
语法: Variable
④End方法:用来结束服务器对脚本的运行并将结果返回给浏览器。当“”属性为Tree时,End方法还可以将缓冲区内容发送到客户端浏览器。
语法:
⑤Clear方法:用来清除缓冲区。只有当Buffer属性设置为Tree时,即缓冲区有内容时,才能运行Clear方法。否则将导致运行错误。
语法:
ASP对象
⑥Flush方法:用来将缓冲内容立即发送给客户。在使用这一方法时,同样需要将Response的Buffer属性设置为Tree,否则将出错。
语法:
⑦AppendToLog方法:用来把指定信息放到IIS的登录文件中,信息长度最多为80个字符。
语法: "information"
ASP对象
对象
(1)Request 对象概述
Request对象与Response对象恰恰相反,前者是从客户端浏览器提取数据,而后者立用来向客户端浏览器输出信息。Request对象把客户信息保存在几个集合中,供ASP应用使用。通用的访问方法为:
("Membername")
当不指定集合名时,以QueryString、FormCookie和ServerVariable的顺序搜索所有集合,当发现第—个匹配的变量时,就认定它是要引用的成员。
ASP对象
当然,为了提高效率,最好显式指定要匹配的是那个集合中的成员。例如:
("Username")
其中:Form是一集合,Username是一变量。Request将在Form中搜索一个叫Username的变量。
(2)从浏览器传递信息到服务器的方法
从浏览器传递信息到服务器有GET和POST等二种方法。GET方法传递过来的信息保存在QueryString集合,POST方法传递过来的信息保存在Form集合。考虑到安全性的问题,一般用POST方式传递数据。
ASP对象
①使用QueryString得到CET方法的数据
当HTML表单使用GET方法向ASP文件传递数据时,数据被保存在集合QueryString中。
QueryString集合获取作为跟在请求的URL的问号后面的文本传递给Web服务器的值。通过使用HTTPGET方法或手工将表单的值添加到URL,表单的值可以被附加在请求的URL之后,因此,以下三种方式可以获得相同的效果:
l 直接在浏览器地址栏中输入链接。例如:
ASP对象
l 在HTML中使用超链接。例如:
<a href="
l 使用Form表单。例如:
<Form action= method=GET>
<input type=text name=id value=grandia>
<input type=password name=pwd value=000>
</Form>
ASP对象
在运行以上三种方式时,浏览器都将在地址栏中显示:
id=grandia&pwd=000
这时,用户的id和password便暴露无遗,显然,这种做法是不安全的。
语法: (Variable)[(Index)|.Count]
“(参数)”的值是出现在QUERY_STRING中所有参数的值的数组。通过调用“(Parameter).Count”可以确定参数有多少个值。
GET方法虽然不太安全,但传递信息较为方便,所以经常用在对安全性要求不高的场合。另外,GET方法不能传递太长的信息。
ASP对象
②使用Form集合得到POST方法的数据
Form集合通过使用POST方法的表单检索邮送到HTTP请求正文中的表单元素的值。
当使用HTTP GET方法去向Web服务器传递长而复杂的表单值时,将可能丢失信息。大多数的Web服务器倾向于严格控制URL查询字符串的长度,以便达到用GET方法传送的冗长的表单值被截断。如果需要从表单发送大量信息到Web服务器,就必须使用HTTP POST方法。此法用于在HTTP请求正文中发送表单数据,而且发送的字符的个数可以无限多。也可以使用ASP Request对象的Form集合检索用POST方法发送的值。
语法: (Element)[(Index)|.Count]
ASP对象
参数:
①Element:合要检索的表单元素的名称。
②Index:可选参数,使用该参数可以访问某参数中多个值中的一个。
③Count:合中元素的个数。.
"(Element)"的值是请求正文中所有Element值的数组。通过调用"(Element).Count"来确定参数中值的个数。如果参数未关联多个值,则计数为1。如果找不到参数,计数为0。要引用有多个值的表单元素中的单个值,就必须指定Index的值。 Index参数可以是从 l 到“(Element).Count”中的任意数字。
ASP对象
(3)得到服务器变量
在浏览器中浏览网页时,使用的传输协议是HTTP,在HTTP的标题文件中会记录一些客户端的信息,如客户的IP地址等等,有时服务器端需要根据不同的客户端信息作出不同的反应,这时候就需要用ServerVariables集合获取所需信息。
语法:(务器环境变量)
可以使用以下脚本程序打印出所有的服务器环境变量。
ASP对象
<TABLE>
<TR><TD><B>Serve Variable,e</B></TD>
<TD><B>Value</B></TD></TR>
<% For Each name in %>
<TR><TD> <%=name %> </TD>
<TD> <%=(name)%></TD></TR>
<%Next%>
</TABLE>
ASP对象
(4)得到客户端Cookie
Cookie不仅足Response的一个集合,也是Request的一个集合。前面,已经对Cookie作了一些介绍,并给出了写入Cookie的方法。这一节将学习如何取得在HTTP请求中发送的Cookie值。这项功能经常在要求认证客户密码、电子公告板以及聊天室等ASP程序中使用。
语法:Request. Cookies(cookie)[(key)|.attribute]
ASP对象
参数:
①Cookie:指定要检索其值的Cookie。
②Key:可选参数,用于从Cookie字典中检索子关键字的值。
③Attribute:指定Cookie自身的有关信息。如HasKeys为只读, 则指定Cookie是否包含关键字。
例如,如果用户的HTTP请求设置了univ=Tsinghua,则下列语句将获取值Tsinghua:
<%=("univ")%>
ASP对象
相似地,要从带索引的Cookie中获取关键字值,可使用关键字名。例如,如果用户发出下列的HTTP请求:
unJv=Tsinghua&Tsinghua=Space
下列脚本程序将返回值Space:
<%=Request. Cookies ("univ")("Tsinghua")%>
如果客户端浏览器发送了两个同名的Cookie,那么“”将返回其中路径结构较深的一个。例如,如果有两个同名的Cookie,但其中一个的路径属性为/www/,而另一个为/www/home/,客户端浏览器同时将两个Cookie发送到/www/home/目录中,那么“Request. Cookie” 将只返回第二个Cookie。
ASP对象
以下程序是一个常用的Cookie的例子:
<%
nickname=("Nick")
("Nick")=Nickname
“欢迎” &("Nick")&"光临!"
%>
ASP对象
下面为HTML程序:
<HTML>
<head>
<title>cookie</title>
</head>
<body>
<form method="POST" action="8-asp">
<p><input type="text" name="Nick">
ASP对象
<input type="submit" value="提交" name="B1">
<input type="reset" value="重置" name="B2"></p>
</form>
</body>
</HTML>
ASP对象
下面简单对程序进行说明:
第2行:将Form表单中的变量Nick提取并赋给Nickname。
第3行:用Response对象将用户名写入Cookie之中。
第4行:提取Cookie中的Nick的值,并在浏览器上显示。
程序运行后,将出现一个输入框,在框内填写名字grandia后,按“提交”按钮, grandia被嵌入“欢迎”和“光临”中,并显示在页面上。
上例所述方法是一个在基于Web的BBS或CHAT的ASP程序中常用的手法,它将用户在起始页面上填入的姓名保存在Cookie中,这样后面的程序就可以很容易地调用该用户的Nick了。
ASP对象
注意:利用Cookie技术传递诸如密码这样的信息时要特别小心,因为一般说来,这种信息是未经加密的,当然,如果你的网站有安全接口层技术,也可以进行加密传输,但是在浏览器端该信息还是被存放在了文本文件中。
(5) 限制用户访问Web页面
网站内的应用程序一般都要做分级处理,有的内容可让所有用户看到,有的内容却只能给管理员看到和修改,这关系到网站的安全性问题。使用ASP的“Request. ServerVabables”属性可以方便地做到这一点。
有很多服务器变量是和授权操作相关的,下面介绍几个常用的服务器变量。
ASP对象
①对于接受用户信息来确认是否授权进入该主页有四个很有用的变量。对这四个变量简述如下:AUTH_TYPE指示了用户进入主页的授权方式;AUTH_USER和LOGON_ USER包含的是Windows NT用户的用户名信息;最后,作为基本的认证手段,AUT_PASSWORD包含了用户注册的密码信息。
以下是运用AUTH_TYPE进行认证的简单例子。
ASP对象
<HTML>
<HEAD>
<TITLE>密码保护<TITLE>
</HEAD>
<BODY>
<%
IF ("AUTH_TYPE")="Basic" THEN
%>你是一般用户。
你的帐号是<%=("LOGON_USER")%>
ASP对象
<%ELSE %>
你是管理员。
你的帐号<%=("LOGON_USER")%>
<% END IF %>
</BODY>
</HTML>
运行以上程序时会根据用户所用的认证模式显示相应字段。AUTH _TYPE有两个主要的变量:Basic变量针对于基本认证默认;NTLM变量对应于NT Challenge和Response模式(权限高)。
ASP对象
②REMOTE_HOST可以取得远端用户的IP地址,可以用它来限制某些特定IP用户对页面的访问。
③HTTP_REFERER可以用来限制非注册用户对页面的访问。使用HTTP REFERER时,可以将一组欲保护的应用程序放在同一个虚拟目录下,然后设置一个登录页作为注册入口,注册成功后可以进入目录下的其他应用程序。
ASP对象
3. Server对象
Server对象提供对服务器上的方法和属性的访问,其中大多数方法和属性是作为实用程序的功能服务的。使用Server对象就可以在服务器上启动ActiveX对象例程,并使用Active Server服务提供像HTML和URL编码这杆的函数。
语法: | Method
参数:
①Property:Server的属性
②Method:Server的方法
ASP对象
(1)Server对象的属性
Server对象使用ScriptTimeout属性设置脚本运行的过期时间,即脚本运行超时值,在脚本运行超过这一时间之后即作超时处理。如下代码指定服务器处理脚本在100秒后超时:
<%=100%>
其中,等号后面的值是以秒为单位的(Response的Expires属性是以分为单位的)。
这里需要注意的是,通过使用元数据库中的AspScript Timeout属性可以为Web服务或Web服务器设置缺省的ScriptTimeout值。ScriptTimeout属性不能设置为小于在元数据库中指定的值。例如,如果NumSeconds设置为60,而元数据库设置包含了默认值90秒,则脚本在90秒后超时。
ASP对象
(2)Server对象的方法
Server对象一共有四种方法,分别是:HTMLEncode方法、URLEncode方法、MapPath方法和CreateObject方法。
① HTMLEncode方法
HTMLEncode方法允许对特定的字符串进行HTML编码。
语法: (String)
参数:只有一个参数,即String——要被转换的字符串。
ASP对象
虽然HTML可以显示大部分写入ASP文件中的文本,但是当文本中包含HTML标识中所使用的字符时,就会遇到问题。这是因为,当浏览器遇到这样的字符串时,会试图进行解释。例如下面的这段文本:
这是对HTMLEncode方法的测试。<br>这里应该不会另起一行。
原来并不想让显示的文本换行,〈br〉只是想要显示的文本的一部分,但由于<br>同时又是一个HTML的换行符,所以浏览器将文本换行了。
为了避免此类问题,就需要使用Server对象的HTMLEncode方法,采用对应的不由浏览器解释的HTML Character Code替代HTML标记字符。所以,用下面的代码才能显示正确的HTML Encode字符串,从而在浏览器中按需要输出文本。
ASP对象
<%
("这是对HTML Encode方法的测试。<br>这里应该不会另起一行。")
%>
②URLEncode方法
就像HTMLEncode方法使客户可以将字符串翻译成可接受的HTML格式一样,URLEncode方法可以根据URL规则对字符串进行正确编码,当字符串数据以URL的形式传递到服务器时,在字符串中不允许出现空格,也不允许出现特殊字符,此时,必须用URL编码,并使用“”方法。
ASP对象
语法:(String)
参数:只有一个参数,即String——要被转换的字符串。
例如:
<%
((""))
%>
上述语句运行后显示:
http%3A%2F%2Fwww%2Etsinghua%2Eedu%2Ecn
这时,所有的字符串都被转换为服务器可接受的字符格式了。
ASP对象
③MapPath方法
MapPath方法能把一相对或虚拟路径映射成物理路径。
语法:Server. MapPath(Path)
参数:只有一个参数,即Path——要被转换的相对或虚拟路径。
若Path以一个正斜杠(/)或反斜杠(\)开始,则MapPath方法返回路径时将Path视为完整的虚拟路径。若Path不是以斜杠开始,则MapPath方法返回同“.asp”文件中已有路径相对的路径。
ASP对象
下列示例中,文本文件“”和包含下列脚本的“”文件都位于目录C:\Inetpub\wwwroot\asp下,C:\Inetpub\wwwroot目录被设置为服务器的宿主目录。使用服务器变量PATH_INFO映射当前文件的物理路径。例如:
<%=( ("PATH_INFO"))%>
输出为:
c:\inetpub\wwwroot\asp\
由于下列示例中的路径参数不是以斜杠字符开始的,所以它们被相对映射到当前目录,此处是目录C:\Inetpub\wwwroot\asp。例如:
ASP对象
<%= ("")%>
<%=("asp/")%>
输出为:
c:\inetpub\wwwroot\asp\
c:\inetpub\wwwroot\asp\asp\
注意:MapPath方法不支持相对目录的写法,即不能使用“.”或“..”。另外,MapPath方法不检查返回的路径是否正确或在服务器上是否存在。
ASP对象
④CreoteObject方法
CreateObject是ASP中最为实用,也是功能最为强大的方法。它用于创建已经注册到服务器上的ActiveX组件实例。这是一个非常重要的特性,因为通过使用ActiveX组件能够很容易地扩展ActiveX的能力,正是因为使用了ActiveX组件,一些至关重要的功能才能得以实现,如数据库连接、文件访问、广告显示和其他VBScript不能提供或不能简单地依靠单独使用ActiveX所能完成的功能。ActiveX组件的使用才使得ASP具有了强大的生命力。
语法: (ProglD)
参数:只有一个参数,即ProgID——指定要创建的对象的类型。
ASP对象
ProglD的格式如下:
[Vendor.]component[.Version]。
默认情况下,由Create Object方法创建的对象具有页作用域。这就是说,在当前ASP页处理完成之后,服务器将自动破坏这些对象。要创建有会话或应用程序作用域的对象,可以使用<Object>标识并设置Session或Application的Scope属性,也可以在对话及应用程序变量中存储该对象。
ASP对象
例如,在如下所示的脚本程序中,当Session对象被破坏,即当对话超时或Abandon方法被调用时,存储在会话变量中的对象也将被破坏。
<%
Set Session("ad")=("")
%>
可以通过将变量设置为Nothing或新的值来破坏对象,如下例所示。第一行释放ad对象,第二行用字串代替ad对象。
ASP对象
<% Session("ad")=Nothing %>
<% Session("ad")="Other Valum" %>
不能创建与内置对象同名的对象实例。例如下列脚本程序运行后将返回错误。
<%
Set Response=("Response")
%>
ASP对象
4. Session对象
Session对象用来存储单个用户会话所需的信息。
(1) Session对象
当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
ASP对象
Session对象可以用来储存访问者的一些喜好,如访问者是喜好绿色背景还是蓝色?访问者是否欣赏分屏方式?访问者是否宁可浏览纯文本的站点?Session对象还可以用来创建虚拟购物篮。无论在什么时候在网站中选择了一种产品,那么该产品就会进入购物篮,当准备离开网站时,就可以立即进行对以上所有选择产品的订购。这些购物信息可以被保存在Session对象中。最后,Session对象还可以用来跟踪访问者的习惯。但要注意的是Session仅在支持Cookies的浏览器中保留。
ASP对象
Session对象的创建和使用可弥补HTTP协议的局限,请注意HTTP协议的工作方式是:一用户发出请求,服务器端作出响应,这种用户端和服务器端之间的联系是离散的,在HTTP协议中没有什么方法能够允许服务端来跟踪用户请求。在服务端完成响应用户请求后,服务器端不能持续与该浏览器保持连接。从网站的观点来看,每一个新的请求都是单独存在的,因此,HTTP协议被认为是“Stateless”协议,当用户在多个主页间转换时,根本无法确认用户的身份。Session 对象的引用弥补了这个缺陷。利用Session对象可以在一个用户在多个主页间切换时也能保存用户的信息,这样很多以前根本无法完成的事情变得很容易了。
ASP对象
请注意,现在还有很多浏览器不支持Cookies,详细讲解见后面的相关部分。
使用Session对象前,必须确认浏览器的Cookies功能已启用(默认设置)。如果以前更改过默认设置,Cookies功能可以通过浏览器的设置来开启。以IE为例,打开IE的“Internet选项”,然后点“高级”,设置Cookies为“总是接受Cookies”。如果浏览器不支持Cookies,但又想起用Session功能,可以安装一个ISAPI过滤器“Cookie Munger”,不过整个网站的性能将受到影响。
ASP对象
Session并不等于Cookie,Session与Cookie还是有很大区别。Session的数据存储在服务器上,而Cookie的数据存储在客户端的浏览器里。通过向客户程序发送唯—的Cookie可以管理服务器上的Session对象。当用户第一次请求ASP应用程序中的某个页面时,ASP要检查HTTP头信息,查看在报文中是否有名为ASPSESSIONID的Cookie发送过来,如果有,则服务器会启动新的会话,并为该会话生成一个全局唯一的值,在把这个值作为新的ASPSESSIONID Cookie的值发送给客户端,正是使用了这种Cookie,可以访问存储在服务3S上的属于客户程序的信息。
语法:|Proper|Method
ASP对象
参数:
①Collection:Session的集合
②Property:Session的属性
③Method:Session的方法
Session和Cookie一样,有优点也有缺点。在Session对象缺点突出时,可以告诉ⅡS页面不需要使用任何Session变量,只需在ASP页面的最上方加上下面的语句:
<%@ENABLESESSIONSTAIE=False%>
加上该语句时,ⅡS将知道此页不用作Session追踪,从而减少了使用Session带来的性能损失。
ASP对象
ASP会话很容易使用,可以用ASP Session对象控制会话。要存储在整个用户会话作用的数据,只需将该数据保存在Session对象的一个集里。例如:
<HTML>
<HEAD>
<TITLE>Session Example</TITLE>
</HEAD>
<BODY>
ASP对象
<%
Session("Greetine")="Welcome!"
(Session("Greetine"))
%>
</BODY>
</HTML>
ASP在浏览器上显示时,问候语“Welcome”会显示出来。该脚本程序首行将文本“Welcome!”赋给一个名为Greeting的会话变量,下一行将问候语输出到显示屏。
ASP对象
这似乎没有什么特别之处,因为可以用普通的VBScript如t变量实现上面的功能。但是,假设同一个用户请求了另一个页面,如假设用户请求了下面的页面。
<HTML>
<HEAD>
<TITLE>Another Page</TITLE>
</HEAD>
<BODY>
<%=Session("Greetine")%>
</BODY>
</HTML>
ASP对象
用户浏览此页面时,同样的问候语“Welcome!”又会显示一次。但在此页面上会话变量没有被赋值,变量Greeting保留其在前面页面中的赋值。在普通脚本中就做不到这一点。普通变量只存在于一个单独的页面里,而会话变量可以一直保持到用户离开网站。
特别要注意,会话变量只同某个特定用户有关。在一个用户会话中赋给的会话变量值不影响其他用户会话中的变量值。换句话说,与应用程序变量不同,保存在会话变量中的数据不被用户共享。例如,假定ASP中出现了下面的脚本程序:
ASP对象
<%
Randomize
If INT(2*RND)=1 THEN
Session("FavoriteColor")="Blu"
ELSE
Session("FavoriteColor")="Red”
END IF
%>
ASP对象
此脚本程序随机地将值“Blue”或“Red”赋给会话变量“Favorite Color”。该变量在不同用户下可能有不同的值。变量“Favorite Color‘’的值与某个特定用户会话有关。
因为会话变量值不被多用户共享,所以与应用程序变量不同,没有对会话变量上锁的问题,Session对象不含有Lock和Unlock方法。因为两个访问同一个会话变量的用户不会产生冲突。
ASP对象
(2)Contents集合
Contents集合包括所有未使用<OBJECT>标识而为该会话建立的项目。此集合可用于确定指定会话项的值或遍历集合,并检索出会话中所有项的列表。
语法:(Key)
参数:只有一个参数,即Key——要获取的属性的名称。
如前面对集合的讨论中所述,仍然可以利用Count属性来检查集合的数量, 同样也可以利用“FOR…NEXT”循环来显示Contents的所有内容。例如以下程序就是用了Contents集合。
ASP对象
<%
Session("name")="董珂"
Session("gender")= "男"
%>
这里Session对象的Contents集合一共有<%=%>项:
<br>
<%
FOR I=1 to
("<br>"&(I))
NEXT
%>
ASP对象
下面对本实例程序进行简单说明。
第2~3行:创建了两个Session变量name和gender,并赋值。
第5行:“Session. Contents. Count”表示集合中元素的个数。
第8~10行:利用“FOR…NEXT”循环显示集合中元素的值。
第11行:释放Session,在下面将对此作详细介绍。
ASP将每一个用户的Session进行不同的身份认证。例如上面的name和gender,当同样的用户进行注册或者多次调用这些主页后,就会显示同样的字段。例如针对前面的这个例子(该例子对应于注册表的例子):
ASP对象
<%
Session("Myname")=("name")
Session("Mygender")=("gender")
%>
在后面可以用以下脚本程序显示。例如:
<HTML>
<HEAD><TITLE>用户名</TITLE></HEAD>
<BODY>
您的注册名称是:<%= %> <br>
性别:<%= %>
</BODY>
</HTML>
ASP对象
假设董珂进行了注册,那么显示结果为:
您的注册名称是:董珂
性别:男
这样,可以看出,不同的用户首先进入注册页面,获得的 “(“Usemmae”)”被赋予Session(“My name”)信息,在这以后,只要用户没有离开这个网站,这个信息就一直为他个人保留,在上面脚本程序运行时就会将相关信息显示出来。这种显示结果根据不同注册用户是不一样的,同时和“”明显不同的是,这个界面在用户离开站点之前任何时候调用都会正确显示。
ASP对象
ASP给每个用户会话分配了唯一的识别标志。用户会话首次被创建时,其ID就产生了,并一直随用户在网站上保留着。例如:
<HTML>
<HEAD>
<TITLE>Session 1D</TITLE>
</HEAD>
<BODY>
Your session ID is:<%= %>
</BODY>
</HTML>
ASP对象
这里的ASP只是输出Session ID的属性值。不同用户获得同—个页面时会显示不同的ID,但同一个用户即使多次获得此页面,每次也将显示同样的ID。
Session ID属性的用途之一是跟踪访问者的活动情况。例如,可以在网站日志中记录用户访问的页面。
下面是生成日志的脚本程序,该程序放在每一个ASP程序的最前面就可以了。
ASP对象
<%
Who=
Current Page=("SCRIPT_NAME")
Who& ":"&CurrentPage
%>
这个脚本程序利用了Response对象的AppendToLog方法在服务器端的日志文件中添加这些记录。该例中,在日志中添加的是用户名以及脚本名称。请注意,由于使用的是SCRIPT_NAME变量,这个脚本名称就包含了路径。
ASP对象
注意:Response对象的AppendToLog方法限定的字段添加最大值为80,由于逗号在日志文件中被用来进行域的分隔,因此在字段中不能使用逗号。
Internet Information Server日志文件是记载访问站点记录的纯文本文件,可以用任何文本编辑器来读写,默认情况下,该文件位于Winnet/system32/LogFiles路径下。
ASP对象
(3)过期时间和Session对象释放
Session对象在服务器上保留是有时间限制的,缺省值为20分钟。对于有些网络站点,20分钟显然有些短,例如,对于高水平选手进行的网络围棋,很多步子是需要一定时间来考虑的。那么如果20分钟释放了Session,这个棋手就可能被服务器端轰出局。有些网络站点则相反,资源有限而访问量又很大,没有什么需要耗费时间的信息传递,那么白白浪费资源是很可惜的,而且也会使其他访问者的访问速度受到影响。
可以通过设置Session对象的TimeOut属性来改变超时时间,这个时间是以分为单位的。
ASP对象
语法:Session. TimeOut[=Time]
参数:只有一个参数,即Time ——Session的过期时间,以分为单位,缺省值为20。
例如:
<%
=10
%>
另外,也可以利用Internet Service Manaser来进行这种控制。在“应用程序配置”对话框中,点击ASP表并且限定session的限制时间。
Abandon方法是Session对象的唯一方法,通过该方法可以在Session到期之前,删除存放在Session中的所有对象并释放其占用的服务器资源。
ASP对象
语法:Session. Abandon
前面已经用到了Abandon方法,大家可以回过去思考以下问题,为什么在那里要用Abandon方法?如果没有使用Abandon方法,试着改变name和gender的值,再刷新页面,会出现什么结果?
例如:
<%
Session("name")="grandia"
Session("name")
%>
该程序在运行后,仍能在浏览器上显示“grandia”。
ASP对象
也可以利用Abandon方法来释放一个Session。这里再引入一个SessionlD属性,它将自动分别为每一个Sessioin分配不同的编号。例如:
<HTML>
<HEAD>
<TITLE>Abandon Session</TITLE>
</HEAD>
<BODY>
<BR>这个用户自动编号为<%=SessionID %>
<% %>
ASP对象
<BR>这个用户自动编号为<%=SessionID %>
</BODY>
</HTML>
以上程序的运行结果为:
This user is 542660692
This user is 542660693
ASP对象
要说明的是,对于一个Session来说,无论用户怎样进行主页间的切换,都会只有一个SessionID,但是由于这里面使用了“”,那么就使得这个主页开辟了一个Session后随即释放,然后又开辟了一个,对于服务器端来说,是两个不同的Session,其中前面的已经关闭,后面的仍然保持。
(4) Session对象的事件
和其他对象不同的是,Session对象中只有两种事件。一种是Session_OnStart事件,当一个Session开始时被触发;另一种是Session_OnEnd事件,当一个Session结束时被触发。在一个脚本中可以和其中一个并且只能和其中一个事件关联。
ASP对象
①Session_OnStart事件
在事件触发时以下这些脚本程序被运行。这些脚本程序位于特定的文件()中。“”位于网站应用程序的根目录,包括一些通用程序段和网站应用。 “”文件有如下结构:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Applioation_OnStart
END SUB
</SCRIPT>
ASP对象
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Appl iCation_OnEnd
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnEnd
END SUB
</SCRIPT>
ASP对象
“”包括四个脚本程序,其中有一个是根据Session_OnStart触发的,还有一个是根据Session_OnEnd触发的(后面回介绍剩下的另外两个脚本程序)。
请注意“”使用了微软的HTML拓展<SCRIPT>标识语法来限制脚本,也就是说,必须用<SCRIPT>标识来引用这两个事件而不能用<%和%>,符号引用。例子中“”使用的是VBScript,但是也可以使用其他脚本语言。
在“”文件中不能有任何输出语句,无论是HTML语法还是“()”方法都是不行的,“”文件是不能用于显示的。
ASP对象
只需要在“”中添加一些希望运行的脚本程序,那么只要Session对象一创建,这些脚本程序就会自动运行。例如:
<SCRIPT LANGUAGE=VBScipt RUNAT=Server>
SUB Session_OnStart
Session("name")="Unknow"
Session("password")="Unknow"
END SUB
</SCRIPT>
这个脚本程序将“Unkonw”值赋给了name和password变量。
ASP对象
Session_Onstart脚本程序可以用于实现多种目的。例如,如果希望访问者必须浏览某一主页,下面的例子就在用户进程开始时进行了这种引导,这里面使用了“”方法。
<Script Language=VBScript RUNAT=Server>
SUB SessiOn_OnStart
MyHomepage="/"
RequcstPage=("SCRIPT_NAME")
ASP对象
IF NOT (STRCOMP(MyHomePage,RequestPage,vbTextCompare)=0) THEN
MyHomePage
END IF
END SUB
</SCRIPT>
在这个脚本程序中,将用户请求和主页路径进行比较,如果比较结果不相同,用户就被自动引导到该主页。
ASP对象
②Session_OnEnd事件
Session_OnEnd事件将在会话被放弃或超时发生,用法类似于Session_OnStart事件。例如:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnEnd
…
END SUB
</SCRIPT>
注意:在Session_OnEnd事件中不能使用MapPath方法。
ASP对象
5. Application对象
一个网站可以有不止一个Application对象。可以根据针对于个别任务的一些ASP文件创建个别的Application对象。例如,创建一个Application对象来适用于全部公用用户,而再次创建另外一个Application对象仅限制在网络管理员的范围。还可以在位于同一台服务器的不同网站创建不同的Application对象。例如,在—台服务器上为John的在线书市和Mike的在线花店分别创建一个Application对象。
ASP对象
一个Application对象的根目录由Internet Service Manager来设定,设定后该目录以及其子目录均属于这个Application对象,不过,如果对某一个子目录也进行了设定,将被认为是另一个Application对象,换句话说,没有两个Application对象可以重叠交错。
当用户首先安装了ASP后,只有几个默认的Application对象。例如,在用户安装了ASP后,自动为该用户的默认网站创建了一个Application对象。不过,用户可以根据自己的要求创建随意多个Application。
ASP对象
下面是设定一个ASP Application对象的方法:
①从Microsoft Internet Information Server程序组中执行Internet Service Manager
②在树型导航栏中点击默认站点名称(如果没有进行过改变,名称应当是Default Web Site)
③选择一个存在的路径(即需要创建的Application路径)。
④点击属性图标或者右击该目录名称然后选择属性项
⑤在属性表中,选择主目录或者虚拟目录项
⑥在Application Setting区中,点Create按钮。
ASP对象
现在成功地创建了一个新的Application对象。创建后,就可以在Application设置区域中进行属性设置,例如限定是否使用Session和进行Buffer输出等等。
一个Application变量包含的数据可以在整个Application对象中被所有用户享用。Application对象有多种类型,包括队列和对象。和Session不同的是,Application变量不需要Cookies。网站不需要利用Application变量来跟踪用户进程。可以适应任何浏览器。Application变量也可以被多个用户共享,从一个用户接受到的Application变量可以传递给另外的用户。
ASP对象
(1)Application对象的设置和变量读取
Application对象的设置和变量读取过程和Session对象没什么区别。例如:
<%
Application ("Greeting")="HelIo"
%>
通过下条语句,即可读取Application对象中的变量。
<%=Application("Greeting")%>
运行后将在屏幕上显示变量的值。
一个应用程序变量被赋值后,该值可以在应用程序的所有页面上显示。例如,尽管变量Greeting没有在下面的页画中赋值,该页面也会显示Greeting:
ASP对象
<HTML>
<HEAD>
<TITLE>Another Page</TITLE>
</HEAD>
<BODY>
<%=Application("Greeting")%>
</BODY>
</HTML>
如果要将一个对象存入Application对象集合中,要使用Set方式:
<%
ASP对象
Set Application("MyObj")=("MyComponent")
%>
可以按下面的方法引用这个对象的属性和方法:
<%
Application("MyObj").MyObjMethod
%>
ASP对象
由于Application变量对于多用户是共享的,因此与Session变量有着本质的区别。同时Application变量不会因为某一个甚至全部用户离开网站就消失,一旦建立了Application变量,那么它就会一直存在到网站关闭或者这个Application对象被卸载。由于存储在Application对象中的数值可以被应用程序的所有用户读取,所以Application对象特别适合在应用程序的用户之间传递信息。
由于Application变量创建时不会自己消亡,因此就需要特别小心地使用,Application变量的创建是需要占用内存的,用户要斟酌使用以免降低服务器对其他工作的响应速度。
ASP对象
怎样移走创建的应用程序变量呢?使用无法做到这一点。应用程序变量一直保存在内存中,直到服务器被关闭、“”文件被改变或应用程序被卸载。包含在Windows 2000中的ASP新版本包含了一些移走应用程序变量的新方法。
为了更好地了解多用户共享这个概念,给出如下脚本程序示例:
<%
Randomize
If INT(2*RND)=1 THEN
Application("Favorite Color")="Blue"
Else
Application("Favorite Color")="Red"
END IF
%>
ASP对象
此脚本程序运行后随机地将值Blue或Red赋给名为Favorite Color的应用程序变量。假定两个用户用此脚本程序获取一个页面,则变量值对两个用户是相同的。第二个用户获取该页面时,该变量值是已赋给它的值。
很容易理解的是,如果将Application换成Session,那么对于每一个单独用户来说,其值很可能是不一样的,但是对于Application,不管有多少个用户调用该脚本程序,该变量对所有用户都是一样的,即使后来的访问者调用时的颜色与前面的访问者调用时的不一样,那么由于这种共享变量的存在,自然对于其他人来说就相当于进行了变量值的改变。不过,细心的读者也许会发现这里面有这样的问题:如果多个用户同时调用,那么岂不是要乱了。例如,假设正在用应用程序变量记录一个横幅广告的被访问次数,该广告每次被访问时都会运行如下一个脚本程序:
ASP对象
<%
NumClioks=Application("BannerCIioks")
NumClicks=NumClicks+l
Application("BannerCIicks")=NumClicks
%>
此脚本程序简单地对储存在应用程序变量Banner Clicks中的数目增1。假定两个用户同时点取了—个广告,会为两个用户同时运行同一个脚本程序,这样,BannerClicks中的值就会出错,两个用户会将该变量增加到同一个值。
所幸Application对象有两种方法可对上述情况有所帮助。下面提到的Lock和Unlock方法用来暂时阻止其他用户改变应用程序变量。
ASP对象
(2)Application对象的方法
Application对象有两个方法:Lock方法和Unlock方法,它们都用于处理多个用户对存储在Application对象中的数据进行写入的问题。这两种方法通常是一起使用的。
Lock方法阻止其他客户修改存储在Application对象中的变量,以确保在同—时刻仅有一个客户可修改和存取Application变量。
假如—个用户正在使用一个Application变量来记录一个广告条的点击次数,如果两个用户正在同时点击,那么产生冲突怎么办? 例如:
ASP对象
<%
Num Clicks=Application ("Banner CIicks")
Num Clicks=Num Clicks+l
Application("Banner Clicks")=NumCIicks
%>
在以上程序中加入Lock、Unlock方法即可解决这样的问题。例如:
<%
ASP对象
NumClicks=Application("BannerCI icks")
NumClicks=NumCI icks+l
Application("BannerCIleks")=NumClicks
%>
当运行“”后, 只有当前用户可以修改Application(“Banner Clicks”)变量, 从而阻止其他用户的介入。 运行“Application. UnLock”后,即可解除锁定。如果用户没有明确地调用Unlock方法,则服务器将在“.asp”文件结束或超时后解除对Application对象的锁定。
ASP对象
Unlock方法与Lock方法相反,允许其他客户修改Application对象的属性。在上面的例子中,Unlock方法可解除对象的锁定,使得下一个客户端能够增加Num Visits的值。一定要注意的是,一旦调用了Lock方法,一定不要忘了再调用Unlock方法,否则没有人可以再操作这个Application变量。
Lock方法不是永远不允许其他用户进行Application变量的修改,而只是使修改过程连续有序,防止产生冲突。
ASP对象
(3) Application对象的事件
Application对象有如下两个事件,分别为Application_OnStart事件和Application_OnEnd事件。
在Session对象中,已学习了Session对象的两个事件:Session_OnStart和Session _OnEnd。它们可以触发“”中的两个脚本程序,而“”文件中的另两个脚本程序是由Application_OnStart事件和Application_OnEnd事件触发的。
ASP对象
①Application_OnStart事件
第一个请求Application对象的页面被调用时触发Application_OnStart事件。一个Application对象的OnStart事件是在Session_OnStart事件之前被触发的。不过,Application不会像Session对象的事件那样在一个新用户请求后就触发,Application对象的事件只触发一次,就是第一个用户的第一次请求。Application事件的处理过程必须写在“”文件之中。
ASP对象
Application_OnStart事件的语法如下所示:
<SCRIPT LANGUAGE=Script Language RUNAT=Server>
Sub Application_OnStart
…
End Sub
</SCRIPT>
其中的Script Language可以是VBScript或者JavaScript。
ASP对象
②Application_OnEnd事件
Application_OnEnd事件只有在服务器被关闭或者该Application应用程序被卸载时才会触发。例如,如果在Internet Service Manager中关闭了网络服务,那么Application_OnEnd事件就会触发,如果针对单独某一日的使用Application对象,这个事件可以通过Application对象在利用Unload按钮卸载时进行触发。一个Application_OnEnd事件肯定发生在Session_OnEnd事件之后。
Application OnEnd事件的语法如下所示:
<SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server>
Sub Application_OnEnd
ASP对象
…
End Sub
</SCRIPT>
Application_OnStart和Application_OnEnd事件都是用于触发一个也是唯一一个脚本程序。而且这些事件都在一个文件即“”文件中。
对Application事件和Session事件有一样限制,不能使用HTML标志,不能进行任何输出,不能将语句写成子程序的形式或者其他形式。
ASP对象
Application_OnStart事件一般用来初始化Application的变量。例如以下程序用Application_OnStart事件和Session_OnStart事件来进行访问人数的统计:
<Script Language=VBScript RUNAT=Server>
SUB Application_OnStart
Application("TotalUsers")=0
END SUB
</SCRIPT>
ASP对象
<SCRIPT Language=VBScript RUNAT=Server>
SUB Session_OnStart
Application("TotalUsers")=Application("TotalUsers")+1
END SUB
</SCRIPT>
ASP对象
在Application_OnStart事件中只有一个语句,即将TotalUsers变量置0,只有当网站应用程序开始运行后这个脚本程序才能运行。Session_OnStart事件用于在每一个用户到达后都将TotalUsers加1,同时使用Lock方法防止冲突。
不能在Application对象中存储ASP内置对象。若将一个数组存储在Applicaton对象中,不能直接更改存储在数组中的元素。
ASP对象
3 . Application对象的应用
Application对象拥有与应用程序所有相关的集合、方法以及事件。一个Application对象包含的数据可以在整个应用程序中被所有用户享用。Application对象可以为任何类型,包括队列和对象。Application对象被普通应用在以下方面:
(1)一个Application对象可以用来在每个主页上显示瞬态信息。例如,用户可以利用Application对象来对于每一主页进行当日新闻的更新。
(2)Application对象可以用来记录广告条被点击的时间和次数。
ASP对象
(3)Application对象可以从数据库中读取数据。例如,可以从网站的数据库中接受销售品目录,然后利用Application对象显示在多个主页上。
(4)一个Application对象可以用来统计目前上站人数(详见后面的小节)。
(5)一个Application对象可以用于网站上不同用户间的通信,这样就可以创建多用户游戏以及多用户聊天室。
2 ASP内置组件及使用
ASP内置服务器组件概述
当用户使用ASP编写服务器端应用程序时,必须依靠Activex组件来增强Web应用程序的功能,如需要进行数据库的连接,对数据库进行在线操作,或者 对web服务器-上的文件系统进行操作,亦或需要一个web广告交换程序,所有这一切地实现都必须通过调用ASP内置的Activex组件或自己按需要编写的组件来完成。
ASP包含很多内置的ActiveX服务器组件。
一般使用“Server. CreateObject”方法来创建对象。例如:
<%
Set Ads=("")
%>
2 ASP内置组件及使用
其中,“”是广告翻转器的注册名(PROGID)。
使用HTML<OBJECT>标签同样可以创建对象,但必须为RUNAT属性提供服务器值,同时也要为将在脚本语言中使用的变量名提供ID属性组。使用注册名(PROGID)或注册号码(CLSID)可以识别该对象。下面的例子是使用注册名(PROGID)创建AdRotator对象的实例。
<OBJECT RUNAT=Server ID=Ads PROGID=""></OBJECT>
广告翻转器组件
1. 用Page Counter组件统计访问次数
在Internet上自由冲浪时,会发现很多网站的主页均包含一个命中计数器。该计数器一般出现在主页底部,用来显示网站被访问的次数。Microsoft提供了一个可以轻松创建命中计数器的组件:Page Counter组件。Page Counter组件统计并显示Web页被请求的次数,以一定的时间间隔。将捕获的数字写入到文本文件中,这样在服务器关闭后数据也不会丢失。
注意:早期版本的ASP和IIS均不提供该组件,可以在
广告翻转器组件
Page Counter组件比较简单,除了对页面点击次数进行统计之外没有其它用处。该组件有三个功能:
①Hits(Path):返回限定页面的点击次数,如果没有提供参数,则默认为当前页。
②Reset(path):将该页面点击次数重置为0。
③PageHit():更新当前页面被打开的次数。
和下一节介绍的Counter组件不同的是,在使用Page Counter组件前必须创建一个实例,不需要在“”文件中进行什么变动,只需要在要进行调用的页面上创建该实例,然后就可以使用了。
广告翻转器组件
下面这个例子为在进行调用的页面上创建的实例。
<HTML>
<HEAD>
<TITLE>页面计数器示例</TITLE>
</HEAD>
<BODY>
<%
Set Whirs=("")
()
%>
广告翻转器组件
此页面被访问了<%=%>次
</Body>
</HTML>
这种调用过程极为简单,显示该页被打开的次数。请注意这里面的Hits方法没有调用参数,因为是当前页的计数值。
广告翻转器组件
2.用Counters组件跟踪页面视图
Counters组件主要用来统计一个页面被请求的次数,当然也可以用来统计其他事项,例如统计站点访问次数,统计广告点击次数,甚至统计用NetScape 访问的用户人数这样详细的信息。所以,Counters组件相对于Page Counter组件要复杂一些。
可以只创建该组件的一个实例,不过在创建实例后,可以创建任意多个个人计数器。一个Counters组件就可以包含很多有不同名称的个人计数器。
注意:Microsoft 官方不支持Counters组件,该组件也不包含在Windows NT Optionpack中。Microsoft经常在其主页上公布此组件以备下载,下载网址为:
广告翻转器组件
如果只需要创建一个Counters组件,那么可以在“Global. asa”文件中进行创建,下面是在“”中进行这个对象创建的脚本程序:
<OBJECT RUNAT=Server SCOPE="Application" ID="WebOount"
PROGID="">
</OBJECT>
这里用Microsoft扩展的HTML的<OBJECT>标签来创建一个名为WebCount的、应用程序范围的Counters组件实例。
广告翻转器组件
Counters组件有下面四个功能:
①Get(Counter Name):用于返回当前的计数器值,如果计数器不存在,则进行创建并且赋值为0。
②Increment(Counter Name):对计数器进行加1操作,如果计数器不存在,则进行创建并且赋初值为1。
③Remove(CounterName):消除指定的计数器。
④Set(Counter Name,integer):该方法有两个参数,第一个是计数器的名称,第二个是一个整数,可以将当前计数器的值设定为该整数值,同样对于不存在的计数器也可以进行创建和赋值。
广告翻转器组件
Counters对象在“”中创建之后,就可以在ASP中添加或减少独立的计数器,在一个页面中可以增加或减少独立的计数器,甚至将—个计数器移置到另一个页面上去。下面就是一个使用计数器组件对特定页面进行访问次数统计的示例:
<HTML>
<HEAD>
<TITLE>试试计数器</TITLE>
</HEAD>
广告翻转器组件
<BODY>
此页面已经被点击 <%=("PageOnt")%>次
</BODY>
</HTML>
第一次调用该页面时,PageCnt计数器就被创建,然后赋值为1,以后每次点击后都会自动加1。如果服务器突然关闭,创建的计数器将会保存到"”文件中。当服务器再度开启时,该计数器又可以继续运行。
广告翻转器组件
正像前面提到的,Counters组件可以用来跟踪选择的数值。例如,可以用该组件跟踪并显示防问者用Netscape或Microsoft浏览器访问页面的次数。下面的例子是用Counters组件跟踪页面视图,程序源代码如下所示:
<%
theBrowser=UOASE(("HTTP_USER_AGENT"))
if instr(theBrowser,"MstE")>0 THEN
("Microsoft")
else
("Netscape")
end if
广告翻转器组件
%>
<HTML>
<HEAD>
<TITLE>Some Page</TITLE>
</HEAD>
<BODY>
<p><b>Microsoft Visitors:</b><%=("Microsoft")%>
<p><b>Netscape Visitors:</b><%=("Netscape")%>
</BODY>
</HTML>
广告翻转器组件
3. 广告显示
现在Web广告几乎充斥了整个网络,利用ASP AD Rotator组件可以在自己的网站上建立一个符合广告领域标准功能的广告系统,每次访问ASP页面时在页面上显示新的广告,并且提供了很强的功能,如旋转显示在页面上广告图像的功能、跟踪特定广告显示次数的功能以及跟踪客户端在广告上单击次数的功能。AD Rotator组件的工作是通过读取AD Rotator计划文件来完成的,该文件包括与要显示的图像文件的地点有关的信息以及每个图像的不同属性,下面就是一个标准的AD Rotator计划文件(文件名为)。
广告翻转器组件
Redirect
WIDTH 440
HEIGHT 60
BORDER 1
*
网易
广告翻转器组件
2
http://. com/
新浪网
3
一
Sponsored by Flyteworks
广告翻转器组件
对以上程序作简单说明如下:
第1行:Redirect行指出广告将成为其热链接的URL,注意这里不是为广告本身指定的URL,而是将调用的中间页面的URL,这样就可以通过这个中间页面跟踪单击广告的次数。该RedirectURL将与包含两个参数的查询字符串一起调用:特定广告主页的URL和图像文件的URL。
第2~3行:以像素为单位指定网页上广告的宽度和高度,默认值是440和60个像素。
第4行:以像素为单位指定广告四周超链接的边框宽度,默认值是1个像素。如果将该参数设置为0,则将没有边框。
广告翻转器组件
星号下面的行以每四行为一个单位描述广告的细节。此例中描述三个广告,每个广告的描述包含图像文件的URL、广告主页的URL(如果广告客户没有主页,请在该行写上一个连字符“-”)、图像的替代文字以及指定该页与其他页交替显示频率的数值。要确定广告显示的频率,可以将计划文件中所有广告的权值相加,在该例中总数是8,那么“新浪”的广告权值为3,这意味着Ad Rotator组件每调用8次,它则显示3次。
图像是重定向页面的热链接,在查询字符串中设置了两个值,“url='以及"image=''。重定向文件通常包含用来解析由Ad Rotator 对象发送的查询字符串的脚本程序并将用户重定向到与用户所单击的广告所相关的URL。例如:
广告翻转器组件
<%
(("url"))
(("urI"))
%>
Ad Rotator组件的PROGID属性是。其完整的代码如下:
<% Set ad=("") %>
<%=("")%>
Ad Rotator组件支持的唯一方法是GetAdvertisement,该方法只有一个参数:Ad Rotator计划文件的名称。注意:指向文件的路径是当前虚拟目录的相对路径,物理路径是不允许的。
广告翻转器组件
Ad Rotator组件有以下三个属性。调用GetAdvertisement()方法前,可以设置这些属性以控制广告显示方法。
①Border属性:改变Rotator Schedule文件中规定的BORDER参数。可以用该属性表明一条横幅广告对于某个特定页面的大小(以像素计)。
②Clickable属性:规定横幅广告是否有超链接功能。其值可以为TRUE或FALSE。
③TargetFrame属性:表明横幅链接应载入的框架名。
广告翻转器组件
例如:
<HTML>
<HEAD>
<TITLE>Home Page</TITLE>
</HEAD>
<BODY>
<CENTERXHI>Welcome to our web site!</HI></0ENTER>
<HR>
广告翻转器组件
<%
Set MyAd=(" Rotator")
="TARGET=""AdFrame"""
%>
<CENTER><%=("")%></CENTER>
</BODY>
</HTML>
浏览器能力组件
众所周知,并不是所有浏览器都支持现今所有的Internet技术。某些浏览器支持如ActiveX控件、影像流、动态HTML、Flash以及脚本程序等一些特性,而另一些浏览器却不支持。
利用浏览器能力组件可以检查浏览器的能力,使网页可对不同的浏览器显示不同的页面(如对不支持Frame的浏览器显示不含Frame的网页)。
浏览器能力组件
浏览器能力(Browser Capabilities))组件能够创建一个Browser Type对象,该对象提供带有客户端网络浏览器功能说明的用户脚本程序。若该对象在“”文件中找不到与该标题匹配的项,那么将使用默认的浏览器属性。若该对象既未找到匹配项,且“”文件中也未指定默认的浏览器设置,则它将每个属性设为字符串"UNKNOWN"。在默认情况下,“”文件被存放在WINDOWS\SYSTEM \NERSRV(如果95/98+PWS4)或NT\SYSTEM32\1NERSRV(如果是NT)目录中。
浏览器能力组件
需注意的是,要正确使用该组件,必须保证“”文件是最新的,可以到http://
在默认配置下,可以检测到的浏览器特性如下:
●Browser:浏览器类型。
●Version:浏览器当前版本。
●Maiorver:浏览器的主版本(小数点以前的)。
浏览器能力组件
●Minorver:浏览器的辅版本(小数点以后的)。
●Frames:浏览器是否支持框架方式。
●Tables:浏览器是否支持表格。
●Cookies:浏览器是否支持Cookies。
●Backgroundsounds:浏览器是否支持<bgsound>标识。
●VBScript:浏览器是否支持客户端VBScripts脚本程序。
●JavaScripts:浏览器是否支持客户端JavaScripts脚本程序。
●JavaApplets:浏览器是否支持JavaApplets。
浏览器能力组件
●ActiveXControls:浏览器是否支持客户端ActiveX控件。
●Beta:浏览器是否还是测试版。
●Platform:检测目前用户所用的操作平台。
●Winl6:检测用户是在用16位的视窗(Win31)系列还是32为的视窗系列(Win95、Win98、WimNT)。
浏览器能力组件
下面是一个检测浏览器能力的示例,程序源代码如下所示:
<HTML>
<HEAD>
<TITLE>浏览器能力检测示例</TITLE>
</HEAD>
<BODY>
<% Set MyBrow=(””) %>
浏览器能力组件
你的浏览器有如下特性:<br>
浏览器类型:<%= %></br></br>
是否支持分屏:<%=MyBrow. Frames %></br></br>
Cookies:<%= %></br></br>
操作平台:<%= %></br></br>
VBScript:<%= %></br></br>
</BODY>
</HTML>
浏览器能力组件
理解Browser Capabilities组件的实际工作方法是很重要的。该织件通过使用HTTP请求页眉和包含浏览器信息的特殊文本查看浏览器的特性。
在浏览器作出请求时,请求中包含丁一个USER-AGENT页眉。此页眉包含了关于正在使用的浏览器的类型及版本号的信息。可以通过Request对象中的ServerVariables集直接取得此页眉。例如:
<%=(”HTTP_USER_AGENT”)%>
浏览器能力组件
当在Windows NT上使用Netscape Navigator 时,USER-AGENT页眉值如下:
Mozilla/(WinNT:1)
这是在浏览器和服务器间传输的唯一信息。Browser Capabilities组件取决于此页眉中的信息,该组件并不直接搜索浏览器的特性。
Browser Capabilities组件取得USER-AGENT页眉的值,然后将其在一个特殊的名为“”的文件中与一个浏览器定义相匹配。“”文件位于服务器上,一般在名为Winnt/System32/inetsrv的目录下。安装ASP时,将会自动安装上此文件。
浏览器能力组件
“”文件不过是一个普通的文本文件。它包含了一个浏览器及其特性的清单。例如,下面是NetscapeNavigator 版的“”文件中的浏览器定义。
[Netscape ]
browser=Netscape
VeFSton=
Majorver=2.
minorver=0
frames=TRUE
tables=TRUE
浏览器能力组件
cookies=TRUE
backgroundsounds=FALSE
VBScript=FALSE
javascript=TRUE
javaapplets=TRUE
beta=False
Winl6=False
浏览器能力组件
当Browser Capabilities组件报道Netscape Navigator 的相关特性时使用这个定义,可以直接改变此文本文件。例如,与现实相反,可以将Backgroundsounds从FALSE改为TRUE,从而规定了Netscape Navigator 可以使用<BGSOUND>标签。
还有几种浏览器特性是应该可以在Browser Capabilities组件中查找到的,实际上却不然。若能用该组件查看某浏览器是否可以使用Secure Sockets Layer或Cascading Style Sheets,将会是非常有用的。但因为“”文件中没有这些信息,无法用Browser Capabilities组件搜索这些性能,自己可以把这些信息加入“”文件中。例如,可以将下面两行语句加入Netscape Navigator 的定义入口中。
浏览器能力组件
SSL=TRUE
CSS=FALSE
加入这两行例句后,Browser组件就可以报道Netscape Navigator 的这些特性了。组件一旦发现浏览器是Netscape Navigator (使用USER-AGENT页眉),就认为浏览器有这些特性。例如,当下面的脚本程序被包含在由Netscape Navigator 取得的页面中时,返回TRUE。
<%= K>
浏览器能力组件
“”文件中的许多浏览器定义和以下语句相似:
[MoziIIa/(win95)]
parent=Netscape
platform=Win95
当浏览器定义含有参数的Parent时,该定义会继承其父类的所有特性。前面的定义继承了NetscapeNavigator 浏览器的全部特性。例如,即使该定义没有规定Netscape的Windows95版是否可以用框架,但因为本版本Netscape Navigator的父亲可以用框架,所以Browser Capabilities组件会报道本版本也可以使用框架。
浏览器能力组件
有了Parent参数,就不必一遍遍输入相同的信息。可以做一个父定义,然后创建几个包含更多专门信息的子定义。若子定义中规定的浏览器特性与父定义中的相反,则要有优先权。
Browser Capabilities组件只能与“”文件有相同准确度。若有人使用了“”文件中没有的浏览器或浏览器版本,Browser Capabilities组件就不能准确报道其特性。当Browser Capabilities组件不能识别一个浏览器时,它将报道缺省的浏览器特性。以下例子是缺省的浏览器定义:
浏览器能力组件
[Default Browser Capability Settings]
browser=Default
Version=
Majorver=#0
Minorver=#0
Frames=Falsc
tables=True
cookies=False
backgroundsounds=FalSe
VBScript=False
浏览器能力组件
javascript=False
javaapplets=False
activexcontrols=False
AK=False
SK=False
0L=False
beta=False
Winl6=Fal 8e
Crawler=False
CDF=False
浏览器能力组件
若不使用“”文件中规定的缺省属性,可以直接改变它们。例如,设计人员可能不希望所有的浏览器都可以使用制表,要做到这一点,只需在缺省的浏览器定义中改变表格的属性。
数据库访问组件
在Web服务器上使用Web应用程序进行的最常见和最实用的任务就是访问服务器端的数据库。而ASP内置的数据库访问(Database Access)组件能够通过ActiveX Data Objects(ADO)访问存储在服务器端的数据库或其他表格化数据结构中的信息。 ADO是对当前微软所支持的数据库进行操作的最有效、最简单和最为直接的方法,是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到ASP页面上。使用ADO可以编写紧凑简明的脚本程序以便连接到和Open DataBase Connectivity(ODBC)兼容的数据库及OLE DB兼容的数据源,这样ASP程序员就可以访问任何与ODBC兼容的数据库,包括MSSQLServer、Access、Oracle等等。熟悉VB数据库编程的朋友会发现,ADO与RDO(Remote Data Object)有某种类似的地方,但ADO的访问速度更快,内存开销更小。
数据库访问组件
ADO访问数据库是本章讲解的重点内容之一,在后面将详细介绍如何使用ADO的方法和属性访问数据库。
文件存取组件
1. 文件访问组件简介
ASP能够实现直接在服务器上写文本文件,与CGI程序相比,ASP程序的可读性和可操作性都比较强。但是有的读者可能会想到,既然ASP同Web数据库的连接如此便捷,又何需再将客户信息写在文本文件中呢,ASP的这个写文件功能岂不是画蛇添足?的确,对于那些常见的留言簿、BBS等Web应用程序而言,无论是在程序的运行效率还是易用性上,都不可能再用写文本文件来替代数据库,但是在某些Web应用领域里写文本文件既是一种规范,也是一种相对数据库而言较为便捷的方法。因此,ASP中对文件的操作也是常用的。
ASP包含文件丰富的处理方法、属性和集。使用ASP脚本程序,几乎可以完全控制文件系统的每一个方面。处理文件时可使用文件访问(File Access)组件。
文件存取组件
(1)文件访问组件包含的对象
该组件包含下列对象:
①FileSystemObject对象:包含了处理文件系统的所有基本方法。例如,可用此对象中的方法来复制或删除文件和文件夹。
②TextStream对象:用来读写文本文件。
③File对象:其方法和属性可以处理单个文件。例如,用该对象搜索文件最后一次被修改的日期或文件路径。
④Folder对象:其方法和属性可用以处理文件夹。
⑤Drive对象:代表磁盘驱动器或网络共享。可以用该对象的属性取得信息,如磁盘可用空间或磁盘上正在使用的文件系统类型。
文件存取组件
(2)文件访问组件包含的集
文件访问组件也有以下三个集:
①Files集:在文件夹中代表一系列文件。
②Folder集:该集中的各项代表一个文件夹中的各子文件夹。
③Drive集:代表服务器上的驱动器或远程网络供销。
文件访问组件有接近100个属性和方法。下面介绍ASP脚本程序中最有使用价值的方法和属性。
文件存取组件
2. 文件的读和写
在一个文本文件中进行读写操作可以有很多用处。例如,利用文本文件记录访问者的活动、IP地址和浏览器类型等等,以供日后参考。还可以将每日的新消息记录到文本文件,然后可以在很多文件中读出来显示。
在文件夹中创建文件之前,必须得到对文件夹进行写操作的许可。要查看此记录是否允许对文件夹进行写操作,右击网络服务器计算机桌面上的文件夹名,选择属性(Properties),然后选择标有“安全(Security)”的选项卡。下一步, 单击标有“允许(Permission)”的按钮,查看IUSER_MachineName说明的允许项。IUSER MachineName说明,或包含此说明的一个组,必须有Write方法以写入一个新文件。
文件存取组件
(1)写入文本文件
写入文本文件时首先需要创建一个FileSystemObject对象;然后再利用该对象的CreateTextFile()方法创建一个TextStream对象;最后利用TextStream对象的WriteLine()方法来写入文件。
下面例子为写入文本文件的例程。
文件存取组件
<html>
<head>
<title>nrite File</title>
</head>
<body>
Wrlting file…
<%
Set Fobject= ("")
文件存取组件
Set Tfile= ("c:\Inetpu\wwwroot\")
("欢迎进入ASP的世界!")
%>
</body>
</html>
该例创建了一个名字为“”的文件,该文件位于 c:\Inetpub\wwwroot\目录下,WriteLine()方法被用来将某一句话写入该文件。最后,这个TextStream对象的事例关闭并且释放所有资源。
文件存取组件
如果需要将虚拟路径转化为物理路径(这样操作可使站点具有更强的可移植性),可以用“()”方法。例如:
PhysicalPath=(”Private/”)
假设虚拟路径中rivate对应于物理路径c:\Inetpub\wwwroot\private,那么这个物理路径的值将是c:\Inetpub\wwwroot\private\。
CreateTextFile()方法用来创建一个新的文本文件,当这个方法被调用时,返回一个TextStream对象,CreateTextFile()方法语法如下:
文件存取组件
语法:CreateTextFile(Filename[,Overwrite[,Unicode]])
参数:
①Filename:限定要创建的文件及路径,如果没有这个参数,将返回错误信息“File not found”。
②Overwrite:可选参数,默认为True,若存在同名的文件,依据这个参数判断是否进行覆盖操作。若此参数设为“False”,则党对已存在的文件调用CreateTextFile()时会出错。
③Unicode:可选参数,默认为False,指示该文件是否用ASC码形式进行创建和保存。如果此参数设为True,则以Unicode方式创建。
文件存取组件
(2)
在利用CreateTextFile()方法创建了文本文件后,就可以使用TextStream对象来对文件进行读写操作。写操作有如下的方法:
①Write(String):将一个字串写入文本文件。
②WriteLine(String):在文件中添加字串和一个分行符,这里的String可选参数,如果没有该参数,则添加一个分行符。
③WriteBlankLines(1ines):允许用户在文件中指定分行符的数目。
④Close:关闭一个打开的TextStream文件并释放其占用的资源。
文件存取组件
例如,要创建一个一行包含32个“HelloWorld!”的文本文件,可用如下脚本程序:
<%
Set MyFileObject= ("")
Set MyTextFile=("c:\mydir\")
For i=1 to 32
("Hello World!")
Next
%>
文件存取组件
(3)从文本文件读取数据
①步骤:
首先,创建一个FileSystemObject对象;然后,利用OpenTextFile()方法来创建一个TextStream对象;最后,就可以用TextStream对象的ReadLine方法来对文件进行读取操作。例如:
<%
Set FObjeot= ("")
Set TFile= ("c:\lnetpub\wwroot\")
文件存取组件
While not
()
Wend
%>
其中While…Wend循环的作用是将文件内容进行一行一行的循环读取操作,读取操作如果没有到达文件末尾,那么AtEndOfStream属性就会是False,直到该读取操作到达文件末尾时变为True。
文件存取组件
该脚本程序的作用是将文本文件“”文件中的所有内容读出来,并且将读出内容显示在浏览器上。如果被读文取的文件不存在,则会显示相应错误信息。
②读取文件时TextStream对象要用到的属性:
●AtEndOfLine:当光标在当前行的末尾时,其值为True,反之则为False。
●AtEndOfStream:当光标在流的末尾时,其值为True,否则为False。
●Column:只读的整数,统计从行首到当前光标位置之间的字符数。
●Line:只读的整数,指明光标所在行在整个文件中所处的行号。
文件存取组件
③读取文件时TextStream对象要用到的方法:
●Read(Number):指定从光标的当前位置开始从文本文件中读取一定数目的字符。
●ReadLine:将一整行的字符读入一个字符串中。
●ReadAll:将一整行的字符读入一个字符串中。
●Skip(Number):在一行字符中,将光标的位置移动一定数目的字符串长度。
●Close:关闭当前打开的文件并释放所占用的资源。
文件存取组件
④OpenTextFile方法的语法:
语法:OpenTextFile(Filename,[IOmode],[Create],[FormatD
参数:
●Filename:必须的变量,同CreateTextFile的Filename。
●Iomode:可选参数,取值为下列两个常数之一:ForReading或ForAppending,如果Mode为1,文件以只读方式打开,如果为8,则文件以追加方式打开。
●Create:可选参数,如果文件不存在是否进行创建,默认为False,如果希望进行创建,则设为True
●Format:可选参数,可以选择三个值分别指定文件的格式,-2、-l、和0分别对应于系统缺省、Unicode和ASCII。
文件存取组件
3.文件的处理
这一节介绍怎样进行文件的处理,包括:拷贝、移动、删除文件,以及怎样检测—个文件是否存在和接收一个文件的有关属性。
(1)拷贝、移动、删除文件
可以利用FileSystemObject对象的方法或者File对象的方法来对文件进行拷贝、移动以及删除工作。
下面是FileSystemObject对象对文件操作的一些方法:
文件存取组件
●CopyFile Source,Destination,[Overwrite]:将文件进行复制操作,可以使用统配符进行多个文件的复制。OverWrite参数将在目标文件已经存在的情况下进行覆盖操作。
●MoveFileSource,Destination:对文件进行移动操作,同样可以使用统配符来移动多个文件。如果目标文件已经存在,则会报错而不允许覆盖操作。
●DeleteFile FileSpecifier:删除指定文件,同样可以利用统配符来进行多个文件的删除。如果没有符合统配符的文件,将会报错而不允许删除操作。
除了使用FileSystemObject对象的方法来进行这种操作以外,还可以使用File对象。下面是File对象进行相关操作的同等方法:
文件存取组件
●Copy Newcopy [Overwrite]:给当前文件创建一个拷贝, 可选参数OverWrite为True时,如果存在同名的目标文件,则进行覆盖操作。
●MoveNewcopy:移动当前文件。
●Delete:删除当前文件。
文件存取组件
下面是拷贝,移动以及删除文件的一个实例:
<% '创建一个FileSystemObject的实例
Set Fobject= ("")
'创建一个要进行操作的文件
Set F=("c:\")
("Hello")
文件存取组件
"c:\" "c:\" '复制文件操作
"c:\”c:\" '移动文件操作
"c:\" '删除这些文件
"c:\"
%>
也可以不用FileSystemObject对象来复制、移动或删除文件,而使用File对象。File对象中有等效的方法。
文件存取组件
使用File对象前,必须先创建一个File对象实例,可以用FileSystemObject对象的GetFile()方法实现。下面是用File对象的方法对前一个脚本进行重写的:
<%
'创建一个Object实例
Set MyFileObject=("")
'新建一个文件
Set Myfile=("c:\")
("Hello")
文件存取组件
'建立文件对象
Set afile=("c:\")
'拷贝文件
"c:\"
'移动文件
"c:\"
'删除文件
%>
文件存取组件
(2)检测一个支件是否存在
如果需要了解一个特定的文件是否存在,需要使用FileSystemObject对象的FileExists()方法,只需要传递其物理地址就可以从返回值是True和False来判断其是否存在。
语法:FileExists(Filepec)
参数:Filepec——要检测文件的物理地址。
文件存取组件
以下例子说明了此方法的使用方法:
<HTML>
<HEAD>
<TITLE>FileExists Example</TITLE>
</HEAD>
<BODY>
<%
MySelf=("PATH_TRANSLATED")
文件存取组件
Set MyFileObject=("ScriptinglFileSystemObject")
If MyFileObject=FileExists(Myself) Then
("I exist!")
ELSE
("I do not exist.")
END IF
%>
</BODY>
</HTML>
文件存取组件
该ASP程序用来查看文件是否存在。服务器变量PATH_TRANSLATED用来返回当前文件的路径,FileExists用来方法查看文件是否存在。此例中该方法必须一直返回“True” (即该文件确认自己的存在并返回“True”)。
(3)接收一个文件的有关属性
当处理文件时,有些属性是需要了解的。下面是File对象的属性列表:
●Attributes:显示当前文件的系统属性。
●DateCreated:返回当前文件创建的时间和日期。
文件存取组件
●DateLastAccessed:返回当前文件上一次被使用的日期和时间。
●DateLastModified:返回当前文件上一次被修改的日期和时间。
●Drive:返回当前文件所在的驱动器。
●Name:返回当前文件的文件名。
●ParentFolder:返回值为当前文件所处的文件夹。
●Path:返回当前文件的全路径。
●Size:返回当前文件的字节数。
●Type:返回当前文件的类型。
像浏览器能力组件一样,可以根据这些属性对文件进行特殊操作。要使用这些属性,必须先创建一个File对象实例。
文件存取组件
4. 驱动器和文件夹的操作
(1)对驱动器的操作
有两种对象可用来取得服务器上的驱动器信息:FileSystemObject和Drive对象。例如,下面的ASP程序显示了服务器上的所有驱动器,包括驱动器的大小和可用空间。
<HTML>
<HEAD>
<TITLE>Drive List</TITLE>
</HEAD>
<BODY>
文件存取组件
<%
'创建一个FileSystemObject对象的实例
Set MyFileObject= "")
'循环
FOR EACH thing in
%>
<BR>Drive Letter:<%=%>
<BR>Drire Total Size:<%=%>
<BR>Drive Available Space:<%=%>
文件存取组件
<HR>
<%
NEXT
%>
</BODY>
</HTML>
当运行以上的脚本程序时,软驱中没有软盘或光驱中没有光盘就会出错。要避免此问题,可以用isReady属性查看驱动器中是否有媒体存在。
FileSystemObject对象的Drivers集合包括了服务器上所有可提供的驱动器信息,不过,这里指的是已经获得盘符的驱动器。
文件存取组件
下面是FileSystemObject对象的有关驱动器的方法:
●DriveExists(DriveSpecifier):如果存在该驱动器则返回Tree。
●GetDrive(DriveSpecifier):返回对应限定驱动器的Drive对象。
●GetDriveName(Path):返回包含该路径的驱动器名称。
另外,作为Driver对象也有以下属于自己的方法和属性来处理驱动器:
●AvailableSpace:返回当前驱动器的可用空间。
●DriverLetter:返回当前驱动器的盘符。
●DriveType:返回当前驱动器的类型,例如是CD-ROM或者是RemovableDrive。
文件存取组件
●SerialNumber:接收当前驱动器的序列号。
●ShareName:返回该驱动器的共享名称。
●TotalSize:返回该驱动器的总容量。
●VolumnName:返回代表驱动器的卷名字符串。
用户在使用这些集合和方法之前,必须首先创建一个Driver对象的事例。这时可以使用FileSystemObject对象的Getfile()方法来创建,下面示例的脚本程序将返回C盘的卷名。
文件存取组件
<%'创建一个FileSystemObject对象的事例
Set Fobject= ("")
'创建一个Drive对象的事例
Set MyDrive=("C:")
()
%>
文件存取组件
(2)对文件夹的操作
可以用FileSystemObject或Folder对象处理文件夹。下面示例的脚本程序显示了路径为c:\my folder的文件夹中的所有文件:
<HTML>
<HEAD>
<TITLE>Folder Contents</TITLE>
</HEAD>
<BODY>
<%
Set
文件存取组件
MyFileObject=("")
Set MyFolder: ("c:\myfolder")
FOR EACH thing in
("<P>"&thing)
NEXT
%>
</BODY>
</HTML>
文件存取组件
此例中,用FileSystemObject的GetFolder()方法创建了一个Folder对象,然后用FOR…NEXT循环在Files集中浏览。该页面显示了此集中的所有文件。
FileSystemObject对象包括了许多种集合和方法来处理文件夹,下面分别予以介绍:
●CopyFolderSource,Destination[Overwrite]:用来进行文件夹的复制,可以使用通配符来进行多目录的复制,Overwrite参数默认值为Tree。
●CreateFolderFolderSpecifier:创建一个指定的文件夹。
文件存取组件
●DeleteFolderFolderSpecifier:删除一个指定的文件夹。
●FolderExists(PolderSpecifier):如果该指定文件夹存在,返回True,否则返回False。
●GetFolder(FolderSpecifier):对指定的文件夹创建一个Folder对象。
●MoveFolderSource,Destinatioin:将指定目录进行移动。
要使用这些方法,必须先创建一个FileSystemObject对象实例。下面的例子用以创建一个文件夹,并对其进行移动和删除:
文件存取组件
<%
Set MyFileObject= ("")
"c:\newfolder"
"c:\newfolder","c:\oldfolder"
"c:\oldfolder"
%>
文件存取组件
也可以用FolderFolder对象的方法和属性对文件夹进行操作。下面介绍的Folder对象中相应的方法、属性:
●CopyFoldernewcopy [overwrite]:将当前文件夹复制到新的位置。
●DeleteFolder:删除当前文件夹。
●Files:返回所有该目录下文件的集合。
●Name:返回当前目录名称。
文件存取组件
使用这些方法之前,需要首先创建一个Folder对象的事例。
下面是一个典型应用的例子:
<%'创建一个FileSystemObject对象的事例
Set FObject=("")
'创建一个用来操作的文件夹
("C:\NewFolder")
"C:\NewFolder" "C:\NewFolder2"
文件存取组件
'移动该文件夹
"C:\ewFolder2" '删除该文件夹
%>
Content Linking组件
Content Linking组件可以很方便地使用一个文本文件来管理超链接、上—页、下一页等链接功能。几行ASP代码加上一个URL表的文本文件即可进行管理链接。若页面中的超链接有所变动,页面维护人员只需改变文本文件中URL表的内容即可,无须更改页面的源代码,从而能大大减少页面维护人员的工作量和出错率。实现此管理链接功能的源代码如下:
<%
Set Link=("")
Count= ("")
Content Linking组件
I=1
%>
今日通知:</br>
<ol>
<ul>
<%Do While (1<=Count) %>
<li><a href="<%=("Link txt",1) %>">
<%=("",1) %></a>
<%1=I+1 Loop %>
</ul>
</ol>
Content Linking组件
“’文本文件的内容如下:
1.今日影讯
2.更新手记
3.通知
在以上代码中,先用GetListCount方法确定在文件“”中有多少条项目,然后利用循环语句,并使用GetNthURL、GetNthDescription方法逐一将存储在“”文件中的内容读出并显示给客户端浏览器。
Content Linking组件
Content Linking组件有以下方法:
●GetListCount(fi1e):统计内容链接列表文件中链接的项目数。
●GetListCount(Content Linking List File):返回Content Linking List文件中的页面数目。
●GetListlndex(Content Linking List File):返回当前页面在Content Linking List文件中的位置。
●GetListlndex (Content Linking List File):返回当前页面在Content Linking List文件中的位置。
●GetNextURL(Content Linking List File):返回下一个页面在Content Linking List文件中的路径。
Content Linking组件
●GetNthURL(Content Linking List File,Number):返回Content Linking List文件中带特定索引的页面路径。
●GetPrevious Descfiption(Content Linking List File):返回Content Linking List文件中对前一个页面的描述。
●GetPreviousURL(Content Linking List File):返回Content Linking List文件中前一个页面的路径。
在创建了网站的总导航页面后,还可以在每一页中添加一个“上一页”、“下一页”的导航超链接,请看下面如何实现导航超链接的方法。
Content Linking组件
先将以下代码放在每个页面中:
<!--#include file=""-->
“”文件的内容如下:
<%
Set Link=("")
Count= ("")
Current=("")
If current>1 Then
%>
Content Linking组件
<a href="<%=("")%>">上一页</a>
<%
End If
If current<count Then
%>
<a href=<%=("")%>>下一页</a>
<"End If">
Content Linking组件
在此程序中,使用GetPreviousURL和GetPreviousDescription取得“上—页”的URL地址和说明;使用GetNextURL和GetNextDescription取得“下一页”的URL地址和说明。
用户在浏览此网页时,ASP脚本程序的运行结果为:上一页、下—页的超链接会根据“”文件内容的顺序链接到相应的上、下页面。网页制作人员只要维护好“”文件中页面的地址和说明以及前后顺序即可。
使用ASP发送E-mail
很多情况下要从网站上给用户发送E-mail。本节将学习如何在ASP中发送或接收E-mail,特别是要学习怎样利用Collaboration Data Objects for Windows NT Server(CDO for NTS)与Microsoft SMTPService进行通信。
使用ASP发送E-mail
1. Microsoft的SMTP Service
众所周知,E-mail的传递是由一个标准化的简单邮件传输协议SMTP(Simple Mail Transfer Protoco1)来完成的。SMTP是TCP/IP协议的一部分,概述了电子邮件的信息格式和传输处理方法。客户端向服务器发送邮件以及服务器间邮件的转发都遵守这个协议。
使用ASP的组件发送E-mail的方法是:首先,在IIS服务器上必须安装SMTP Service,安装Option Pack时将缺省地安装上这项服务,这时在System32目录下会存在一个名为“”的文件。要查看服务器上是否安装并运行了SMTPService,打开Internet Service Manager,查看IIS文件夹中是否有标有Dehult SMTP Site的图标。若没有,请运行Windows NT Option Pack Setup程序来安装此项服务。若已安装上但没有运行,则可启动此项服务。
使用ASP发送E-mail
安装SMTP Service时,会创建一个缺省的本地域,其名称决定服务传送消息的方法。若服务器收到的E-mail地址与缺省的本地地址相同,则在本地传送;否则会传送至其他地方。缺省的本地域与相应网站的域名相同。
安装SMTP Service后,可以通过检查日志文件监视其运行状况。该服务缺省的活动日志在\WINNT\System32\LogFiles目录下,此目录可以通过点击SMTP Site的属性栏,并编辑标有Log File Directory的通路米改变。可以在如Notepad等任何标准的文本编辑器中打开并查看SMTP Service的日志文件。
使用ASP发送E-mail
2. Microsoft SMTP Service的工作方法
从用户角度看,SMTP Service是简单的组件。此服务用了两个主要目录(名为Pickup和Drop)处理E-mail,这两个目录都位于InetPub/MailRoot目录下。
Drop目录用来接收E-mail。SMTP Service收到E-mail时,服务器将其写入目录Drop下。Microsoft SMTP Service不支持多个邮箱。
这两个主要目录中的E-mail都是文本文件。例如,可以打开记事本,输入下列文本,将文件保存在目录Pickup(Inetpub/mailrooVpickup)下,从而将E-mail发送出去。
使用ASP发送E-mail
TO webmaster@
From:someone@
Subject:Testing SMTP Service
Here is the message!
从理论上讲,可以在ASP中用File Access组件将消息写入目录Pickup下并发送该消息。实际上这不是一个好办法,有以下两方面的原因:第一,有时用这种方法只能发送出部分信息(SMTP可能在整个文件写完前将其发送出去);第二,在使用如信息优先级和文件附加物等E-mail高级特性时,不易使用这些方法。
使用ASP发送E-mail
用SMTP Service发送E-mail最可靠、简单的方法是使用Collaboration Data Objects (CDO)。
3.用CDONTS组件发送E-mail
IIS 附带一个很好的E-mail组件CDONTS (Collaboration Data Objects for Windows NT Server),还有其他第三方软件厂商开发的商业组件也提供强大的E-mail支持。这里以CDONTS为例,介绍如何用ASP发送E-mail。
使用ASP发送E-mail
(1)用ASP发送E-mail
用CDO从ASP中发送E-mail很容易,可以用—个仅包含8个语句的子程序完成。下面是用ASP发送E-mail的实例。
SUB sendMail(fromWho,toWho,Subject,Body)
DIM myMail
SET myMail=("")
=fromWho
=toWho
使用ASP发送E-mail
=Subject
=Body
myMail=Nothing
END SUB
该子程序接收四个与下列各条对应的参数分别为:消息发送者的E-mail地址、消息接收者的E-mail地址、消息主题、消息主体。
使用ASP发送E-mail
创建一个NewMail对象实例,设定相应属性,然后用E-mail发送方法实际发送此E-mail。 发送E-mail时,要将From地址设为带有域名的E-mail地址。否则,服务器可能会自动拒绝发送E-mail。
下面是一个包含E-mail发送表单的程序。
<%
SUB sendMail(fromWho,toWho,Subject,Body)
DIM myMai1
SET myMail=("")
=fromWho
=toWho
=Subject
使用ASP发送E-mail
SET myMail=Nothing
END SUB
FromWho=TRIM( ("fromWho"))
ToWho=TRIM( ("toWho"))
Subject=TRIM(("Subject"))
Body=TRIM( ("Body"))
IF toWho <> " "THEN
sendMail fromWho,toWho,Subject,Body
END 1F
%>
使用ASP发送E-mail
<HTML>
<HEAD>
<TITLE>Email Form</TITLE>
</HEAD>
<BODY BGOOLOR="#eeeeee">
<FORMMETHOD="POST" ACTION="<%= ("SCRIPT_NAME")%>
<BR>TO:<INPUT NAME="toWho" TYPE="text" SIZE=40>
<BR>FROM:<INPUT NAME="fromWho" TYPE="text" SIZE=40>
使用ASP发送E-mail
<BR>SUBJECT:<INPUT NAME="subject" TYPE="text" SIZE= 40><BR><TEXTAREA
NAME="Body" COLS=40 ROWS=5></TEXTAREA>
<BR><INPUT TYPE="SUBMIT" VALUE="Send Mail">
</FORM>
</BODY>
</HTML>
使用ASP发送E-mail
(2)发送带有附件的E-mail
可以用NewMail对象的AttachFile()方法把一个文件附件加入一条E-mail。该方法有三个参数:要发送的文件全路径;任选项——要在E-mail中出现时的文件名称;用来对文件进行编码的方法。
语法: (Source [,EileName][,EncodingMethod])
Source要附加在消息上的文件的全路径。
使用ASP发送E-mail
FileName将在E-mail中出现的文件,若此参数不存在则用文件路径代替。
采用UNEncoded编码,EncodingMethod值为0:采用Base 64 Encoded编码,EncodingMethod值为1。
例如,下面是在用户输入自己的E-mail地址并点击标有Send Source的按钮时,自动将其资源作为附件发送的ASP程序。
使用ASP发送E-mail
<%
DIM myMail,thisPage,email
ThisPage=("PATH_TRANSLATED")
Email=TRIM(("email"))
IF email<>" "THEN
SET myMail=("")
="source@"
=email
="Source for"& thisPage
使用ASP发送E-mail
="This emsil has the source for file" & thisPage
ThisPage,"Source"
SET myMail=NOTHING
END IF
%>
使用ASP发送E-mail
<HTML>
<HEAD>
<TITLE>Some Page</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="">
Email Address:<INPUT NAME="email" TYPE="TEXT" SIZE=40>
<INPUT TYPE="SUBMIT" VALUE="Send Source">
</FORM>
</BODY>
</HTML>
使用ASP发送E-mail
(3)设置E-mail消息优先级
大部分E-mail客户支持消息优先级。例如,使用MicrosoftOutlook可以将消息以低、普通或高优先级发送。
可以用NewMail对象的Importance属性设置消息的优先级。可将此属性设为0、1、2,其中0为低优先级,1为普通优先级,2为高优先级。
下面为发送一条有高优先级的E-mail的脚本程序:
使用ASP发送E-mail
<%
DIM myMail
SET myMail=("")
=server@
=administrator@
="Web Site Crashed!!!"
="The Web Site has crashed!"
:2
SET myMail=NOTHING
%>
使用ASP发送E-mail
(4)抄送和密件抄送
发送E-mail时,可以表明要将这条消息的一个副本发送至另一个E-mail地址。发送带副本的消息时,消息的主要接收者可以看到抄送接收者的E-mail地址。下面是一般抄送的脚本程序:
<%
DIM myMail
SET myMail= ("ODONTS,NewMaiI")
=fred@
=al ice@
="Confidential lnformation"
使用ASP发送E-mail
="Alice,I haven't sent any email to Bob."
=bob@
SET myMail=NOTHING
%>
此例中,用NewMail对象的Cc属性将E-mail的一个副本抄送至E-mail帐户bob@。
使用ASP发送E-mail
另外,也可以进行密件抄送。这样,消息的主要接收者不知道另一个副本将被送往何处。下例中用NewMail对象的Bcc属性进行密件抄送。
<%
DIM myMail
SET myMail=("")
=fred@
=alice@
="Confidential Information"
="Alice,I haven't sent any email to Bob."
=bob@
使用ASP发送E-mail
SET myMail=NOTHING
%>
要监视网站的e-mail情况,密件抄送会很有用。例如,假定网站对每个新用户自动发送带有登录信息的e-mail,可以进行密件抄送至不同的e-mail帐户来查看e-mail是否确已发出或已自动保存每条登录信息的一个副本。
使用ASP发送E-mail
(5)发送带HTML格式和图像的Email
可以用CDO发送带HTML格式和图像的E-mail,如可在文本中规定特定字体和颜色,定制背景图像及HTML链接。
但要注意的是,大部分E-mail客户机不完全支持带HTML格式或图像的E-mail。尽管Microsoft Outlook支持这些特性,但用其向其他E-mail客户机发送带HTML格式的E-mail时,也会产生完全不可读的乱码 (显示HTML资源本身)。
使用ASP发送E-mail
CDO发送E-mail时,缺省为普通文本。要发送带HTML格式的E-mail,必须要设置NewMail对象的两个属性。例如:
Iformat=0
=0
当属性MailFormat设为0时,E-mail以MIME格式发送。当属性BodyFormat设为0时,E-mail可以包含HTML。设定这两个属性后,可以发送带HTML格式的E-mail。例如:
<%
DIM myMail,HTML
HTML="<OENTER><FONT SIZE=+2 FACE=AriaI>"&_
"Come visit our Web site!"&_
使用ASP发送E-mail
"<p><a href=>"&_
"Click Here To Visit</a>"&_
"</FONT></CENTER>"
SET myMail=("")
=0
=0
="server@"
使用ASP发送E-mail
="user@"
="Welcome to our Web site!"
=HTML
SET myMail=NOTHING
%>
此脚本程序将E-mail发送至消息体时,要以Arial字体显示。此消息中包含了一个的超文本链接。
使用ASP发送E-mail
将链接包含进E-mail时,要把链接的全部路径包含进去(否则,E-mail客户机没有足够信息找到相应网站),即要用如下形式的地址:http://
例如:
<%
SET myMail=("")
=0
=0
使用ASP发送E-mail
="
=server@
=user@
="Welcome to our Web sire!"
="<a href=>Visit Our Web Site!</a>"
SET myMail:NOTHING
%>
使用ASP发送E-mail
有两种方法可用来将图像包含进e-mail中,最简单的方法是把HTML<IMG>标签包含在消息体中。如下脚本程序用此方法显示一个GIF图像:
<%
SET myMail=("!")
my =0
my =0
=
=server@
myMail To=user@
使用ASP发送E-mail
="Welcome to our Web site!"
="<IMG SRC="""">"
SET myMail=NOTHING
%>
当有人查看E-mail时,从网络服务器取出实际的图像。若服务器已被关闭,或已从服务器硬盘上将此图像文件删除,则无法看到该图像。解决了这些问题就可以将图像文件与E-mail一起发送。可以用NewMail对象的AttachURL()方法做到这一点。例如:
使用ASP发送E-mail
<%
SET myMail=("")
==0
="d:\inetpub\wwwroot\images\",""
="
=server@
=user@
使用ASP发送E-mail
="Welome to our Web sire!"
="<IMG SRO="""">"
SET myMail=NOTHING
%>
在此脚本程序中,将图像名称及其全部路径送至AttachURL()方法中。因为此图像文件与E-mail在一起,可以立即移交。通过调用AttachURL()方法可以任意多次地附加另外的图像。
使用ASP发送E-mail
4.用CDONTS组件接收E-mail
E-mail到达网站时,SMTP Service将E-mail放在目录Drop下。要查看这些E-mail,可以用记事本将其打开。这些E-mail只是普通文本文件。
可以在ASP脚本程序中用CDO for NTS从目录Drop下读取出消息,这必须先用CDO Session对象登录到SMTP Service上。下面部分脚本程序说明了怎样用Administrator的显示名称和E-mail地址登录。
administrator@:
SET mySession=("")
"Administrator","administrator@"
使用ASP发送E-mail
在使用任何其他CDO属性和方法前,必须调用LogonSMTP()方法对Session对象初始化(除NewMail对象外),用完CDO后,用“'”语句退出。
登录后,下一步是要获取Inbox文件夹的参考资料,对于Microsoft SMTPService,Inbox文件夹对应于Drop目录。这一步可以通过Session对象的Inbox属性来完成。例如:
SET myInbox=
然后用Messages属性获取表示Inbox文件夹中所有消息的对象。例如:
SET myMessages=
使用ASP发送E-mail
最后,Messages对象包含了目录Drop下所有消息的集合。因为该对象是一个集,可以用Item和Count在集合的所有独立信息间进行浏览。例如:
FOR k=1 To
SET myMessage=(k)
&"?"
&"<br>"
NEXT
使用ASP发送E-mail
此脚本程序用于浏览Messages对象中的消息,显示发送人和每条E-mail主题。
Mcssage对象还包含可以处理Drop文件夹中消息的方法。可以用Delete ()方法删除独立的消息,如:MyMessaSe、Delete。还可以在MessaSe集中调用Delete()方法进行删除。这将导致Drop文件夹中的所有文件会被永久性删除。
3 ADO数据库操作
在ASP脚本程序中可以通过三种方式访问数据库,分别为传统的IDC(Internet Database Connector)方式、ADO(ActiveX Data Objects)方式以及RDS(Remote Data Service)方式。从概念上来讲,这三种访问方式对数据库的访问是由Internet Information Server来完成的。Web浏览器使用HTTP协议向Internet信息服务器(IIS)递交请求,Internet信息服务器运行访问数据库的操作,并以一个HTML格式的文档作为回答。
ActiveX数据对象概述
实现Web数据库访问的方法大致可分为两类、四种。一类是以Web服务器作为中介,把客户端浏览器和数据源连接起来,在服务器端执行对数据库的操作;另一类是把应用程序和数据库下载到客户端,在客户端运行对数据库的访问。四种实现Web数据库访问的方法如下:
1. Web数据库访问的方法分类
(1)公共网关接口(CGI,Common Gateway Interface)
当浏览器发出HTTP“”请求时,Web服务器运行相应的应用程序,访问站点数据库,并将查询结果以HTML格式送回到浏览器。这种方式有很多缺点,功能有限、开发困难,且不具备事务处理功能,这在很大程度上限制了它的应用。
ActiveX数据对象概述
(2)Internet数据库连接器(IDC,Internet Database Connector)
这是一种简易方案,对数据库的操作仍然放在Web服务器端,但可以通过SQL(Structured Query Language)语句对数据库进行查询、输入、更新和删除等操作。IDC设计简易,不用编译就可直接运行,并且支持对数据的多重查询(MultipleQuery)。
(3)先进数据库连接器(ADC,Advanced Data Connector)
前两种方案中对数据库的操作都是在服务器端进行的,而ADC是在浏览器端运行数据查询动作。当浏览器提出对数据库的操作请求时,ADC先将相应的数据库下载到浏览器端,在用户端对数据库进行操作。显然,这种方案的效率是很高的。客户端对数据库的查询是由安装在客户端的ADC ActiveX Control完成的,而这个ActiveX Control是由站点服务器自动下载和安装在客户端的。
ActiveX数据对象概述
(4)ADO与ASP
这是一种完全的Web数据库访问解决方案,可把ADO与ASP结合起来,建立提供数据库信息的网页内容,在网页中运行SQL命令,对数据库进行查询、插入、更新和删除等操作。ADO中可以用VBScript、JavaScript语言来控制对数据库的访问(而ASP恰恰是脚本语言的解释环境)和查询结果的输出;ADO中使用RecordSets对象对数据库进行操作;ADO可以连接多种支持ODBC的数据库。
ADO(ActiveX Data Objects,ActiveX数据对象),是一种由ASP内置的属于ActiveX服务器组件的数据库访问组件(Database Access Component)提供的技术,可把它与ASP结合起来,建立提供数据库信息的网页内容,对数据库进行查询、插入、更新和删除等操作。
ActiveX数据对象概述
要运行ADO,服务器端需要安装Windows NT Server和Internet InformationServer(IIS),而客户端只要有IE或NETSCAPE较新版本的浏览器即可。使用ADO,可以对来自多种数据提供者的数据进行读取和写入操作。例如,可以使用ADO来访问Microsoft SQL Server数据库、Oracle数据库、Foxpro数据库(.dbf)、Access数据库(.mdb)以及Informix中的信息,甚至可以使用ADO从Microsoft Excel表格中读取信息。
在这一节里,将介绍如何使用ADO操作数据库,并以Microsoft SQL Server作为DBMS (Database Management System),所有的例子都假定是在使用这种数据库。但是,在后面介绍的大部分内容和所编写的程序对于其他类型的数据库也是适用的。
ActiveX数据对象概述
对象
ADO有以下七种独立的对象。
(1)连接对象(Connection)
代表与一个数据源的唯一对话,建立于OLE DB提供者的联系。
(2)记录集对象(Recordset)
代表来自一个数据库的一组记录,保存了从数据源查洵返回的所有记录。
(3)域对象(Field)
代表一个记录集中的一个字段,包括表中列的名称、数据类型和值的属性,此值种包含来自数据源的真实数据。
ActiveX数据对象概述
(4)命令对象(Command)
用于通过已建寸的连接向数据源发出命令。
(5)参数对象(Parameter)
代表与SQL命令相关的参数。
(6)属性对象(Property)
代表刘.象的属性,用于描述或控制对象的行为。
(7)错误对象(Error)
代表ADO出错信息。
ADO对象的使用
1. 配置服务器以使用ADO对象
配置好服务器和数据库管理系统是在ASP中使用ADO进行一切操作的前提,它包括数据库管理系统的合理配置以及IIS服务器端数据源的恰当设定,二者缺一不可。本书假定是在Microsoft SQL Sever中使用ADO,Microsoft SQL Sever必须与Web服务器安装在同一台机器上,或者两台机器在同一个网络中,而配置Web服务器端的数据源指向该Microsoft SQL Sever服务器。要了解安装和配置Microsoft SQL Sever的详细内容,请参阅相关的书籍,在此不再叙述。
ADO对象的使用
在能够使用ADO之前,必须先建立一个数据源。数据源包含了如何与一个数据库进行连接的信息。在这种情况下,将使用数据源与Microsoft SQL Sever建立连接。数据源有用户数据源、系统数据源、和文件数据源三种类型。当要建立一个与Web服务器一起使用的数据源时,应该建立一个文件数据源。建立文件数据源的好处是连接信息存储在一个实际的文件中,不止一个用户可以访问这个文件。而且,如果需要把Web应用程序从一种Web服务器移植到另一种Web服务器上,只需要移植这个文件即可。
ADO对象的使用
可按如下步骤建立一个新的系统数据源:
① 打开Windows NT Sever的控制面板(选择Start|Setting|Control Panel)。
② 单击ODBC图标。
③ 单击标签System DSN。
④ 单击按钮Add,出现Create New Data Source对话框。
⑤选择SQL Sever驱动程序并单击“完成”按钮,出现“Createa New Data Source”对话框。
输入所建的数据源的名字,如输入Hello。单击“下一步”,再单击“完成”按钮,则Wizard程序“Create a New Data Source to SQL Sever”会被启动。
ADO对象的使用
在文本框Description中,输入一行字符对所建数据源进行描述,如输入My Data Source。在文本框Sever中,输入己安装了SQL Sever的服务器的名字(如果SQL Sever与Web服务器安装在同一台机器上,可以输入Local;如果它们安装在不同的机器上,则输入该SQL Server服务器的名字或者直接输入该机器的IP地址,这在远程连接SQLServer的情况下是非常有用的),单击“Next”。会出现一系列对话框,要求定制数据源的各种属性。要指定—个缺省数据库,可选择表所在的数据库作为缺省数据库。让其他的选项保持其缺省值,单击“Next”,关闭所有的对话框。
ADO对象的使用
⑥最后,对新建数据源进行测试。如果测试成功了,单击“OK”,添加这个新数据源。如果连接成功,则会出现一个对话框,点击“OK”,新数据源就算设置完毕。
现已经建立了一个名为Hello的新数据源,使用这个数据源可以连接到Microsoft SQL Sever。
2.使用AD0对数据库进行读写操作
这一节给出了一个如何使用ADO对Microsoft SQL Sever数据库进行读写操作的简单例子。该例字用来演示从ASP网页中访问Microsoft SQL Sever的基本方法和检测服务器的配置是否正确。
ADO对象的使用
以下程序用于把文本“I am ADO of ASP!”插入一个表中,然后,从表中取出这个文本并显示在浏览器中。
<HTML>
<HEAD><TITLE>The first ADO Example By Computer Work Room</TITLE></HEAD>
<BODY>
<%
Set Conn=("")
"DSN=Hello"
ADO对象的使用
"INSERT HTable(HColumn) VALUES('I am ADO Of ASP!')"
Set RS=("SELECT * FROM Htable")
Response,Write(RS("Hcolumn"))
%>
</BODY>
</HTML>
ADO对象的使用
在使用这个例子之前,需要建立一个名为Htable的表。可以使用ISQL/w来创建它。启动ISQL/w,选择的缺省数据库,然后执行如下的SQL语句:
CREATE TABLE Htable (Heolumn VARCHAR(255))
VARCHAR表示可变长字符类型的字段。要了解更多建立表的信息,请参见有关介绍SQL的书籍。
该ASP程序的第一行创建了连接对象的一个实例。接下来调用连接对象的Open方法,打开一个对数据库的连接。在Open方法中用到了在上一节所建立的数据源,以建立对数据库的连接。
ADO对象的使用
一旦打开了一个连接,就可以用这个连接执行SQL语句。在这个例子中,用Execute方法执行了两个SQL语句。首先,用SQL的INSERT语句把字符串“I am ADO of ASP!”输入到数据库,然后,用SQL的SELECT语句从表中取出这个字符串。
如果系统配置正确,字符串“I am ADO of ASP!”先被插入数据库,然后又被取出并显示在浏览器窗口中。如果有什么不正常,请对程序进行调试。
ADO对象的使用
程序的调试
用ADO访问Microsoft SQL Sever经常会出现一些问题。下面列出了通常会遇到的一些问题的症状及其可能的原因:
(1)出现错误信息:Unable to create file buffer。原因:文件
数据源不正确。如果文件数据源的路径或名字有误,或者该数据源不存在,就会收到这个错误信息。应确保网页中Open方法所使用的文件数据源的路径与计算机中的实际路径相同。
ADO对象的使用
(2)出现错误信息:Invalid object name 'Htable'。
原因1:数据库中不存在表'Htable'。应该用ISQL/w创建这个表。
原因2:表'Htable'不在缺省数据库中。需要指定一个缺省数据库。选择 “Startl|Settings|Control Panel”。单击“ODBC”图标和单击“System DSN”标签,选择文件数据源的名字,单击“Configure”,再单击“Options”,在对话框中指定确省数据库的名字。
(3)出现错误信息:Thesever appears to be not available。
原因:SQL Sever没有运行。从Microsoft SQL Sever程序组中选择“SQL Sevice Manager”,选择运行“MS SQL SEVER”。
ADO对象的使用
(4)出现错误信息:Login failed。
原因:没有使用Windows NT确认模式。建立数据源时输入了错误的帐号和口令。选择“Start|Settings|Control Panel”,单击“ODBC”图标,然后单击“FileDSN”标签,选择文件数据源的名字,并单击“Configure”,可以选择“Use Trusted Connection”或输入合法的帐号和口令。
(5)出现错误信息:INSERT permission denied on object Htable或SELECT permission denied on objict Htable。
ADO对象的使用
原因:建立数据源时指定的帐号没有访问表Htable的足够的权限。需要改变文件数据源的注册帐号,或者给该用户或用户组提供更多的权限。
要提供对一个表的更多权限,从Microsoft SQL Sever程序组中启动SQL Service Manager,找到表'Htable',并用右键点击它,选择“Permissions”,此时可以为不同的用户或用户组设置对这个表的操作权限。
连接对象的使用
与数据库之间的所有通信都要通过一个打开的连接来进行。在对一个数据库进行数据的插入和读取之前,必须先打开与这个数据库的连接。这种打开和关闭一个连接的操作与打电话的过程有相似之处。在与SQL Sever进行通信之前,必须先与它建立连接关系,也就是说对它的管理例程进行会话。
连接对象的使用
1.打开和关闭数据库连接
要打开一个数据的连接,可以创建连接对象的一个实例。创建了这个实例之后,就可以调用连接对象的Open方法,打开一个连接。例如:
<%
Set Conn= ("")
"DSN=Hello"
"INSERT Htable (Hco lumn) VALUS ('I am AD0 of ASP!')"
%>
连接对象的使用
在这个例子中,创建了边接对象的一个实例Conn。然后调用连接对象的Open方法。接下来,调用连接对象Execute方法,执行一个SQL语句。最后,关闭这个连接。
每次打开一个新的连接时都要输入文件数据源的路径和名字,这实在另人厌烦的。可以把这个字符串分配给一个Session变量或者在一个包含文件中把它定义为一个常量。这样,只需要键入一个变量名即可,而不必输入文件数据源的完整名称。要定义一个包含有文件数据源名字的Session变量,可以在文件“”中定义。例如,可以把下面的内容添加到文件“” 的session_onstart脚本程序中:
连接对象的使用
Session("Connectionstring")="DSN=Hello"
建立了这个Session变量后,就可以用如下的脚本程序打开一个连接:
<%
Set Conn=("")
Session("Connectionstring")
%>
把文件数据源的名字分配给一个Session变量的另一个好处是,将来可以很容易地改变数据源。如果需要使用另外一个数据源,只要改变文件“”中一个Session变量的值即可。
连接对象的使用
使用完一个连接后,应该关闭它,这就像挂断一个电话,从而释放占用的线路。连接对象的Close方法对象的Close方法可以关闭一个连接。关闭了一个连接后,就不能再用这个连接与数据库进行通信。因此,依赖这个连接支持的其他对象也不能再与数据库进行通信。
连接对象的使用
2. 通过打开的连接执行SQL语句
通过打开的连接执行SQL语句,要用到Execute方法。这个方法有两种形式:一种形式用来从数据库中返回信息,当不需要返回信息时,则使用另一种形式。
下面的例子演示了如何使用Execute方法执行一个无返回结果的SQL语句:
<%
Set Conn=("")
"DSN=hello"
"INSERT Htable (Hcolumn) VALUES (I am ADO of ASP!"
%>
连接对象的使用
在这个例子中,用Execute方法执行一个SQL INSERT 语句。因为没有返回结果,EXCUTE方法不使用括号。
也可以用EXECUTE方法从一个查询返回结果。例如:
<%
Set Conn= ("")
"DSN=Hello"
Set RS= ("SELECT*FROM Htable")
%>
连接对象的使用
在这个例子中,用EXECUTE()方法返回一个SQL的SELECT语句的查询结果。与上例不同,这个EXECUTE方法使用了括号。当要返回结果时,别忘记使用括号,否则会收到错误信息Expected end of statement。
这个SQL查询的结果被读取到记录集对象的一个实例RS中,该记录集由Execute()方法自动创建。
连接对象的使用
Execute方法有两个可选参数。可以使用一个Record Affected参数保存被执行的SQL语句所操作的记录个数,还可以使用另一个Options参数提供被执行的SQL语句的有关信息。下面的例子同时使用了这两个可选参数:
<--#INCLUDE VIRTUAL="" -->
<%
Set Conn=("")
"DSN=Hello"
"UPDATEHtableSet Hcolumn= 'Goodbye!'",HowMany,adCMDText
连接对象的使用
(HowMany)
%>
连接对象的使用
在这个脚本程序中,执行了一个SQL的UPDATE语句,用以更新表Htable中所有记录的值。在这个例子中,变量HowMany被作为Record Affected参数。这个SQL语句执行后,变量HowMany中将存有该语句所操作的记录数。例如,如果表中有32条记录被更新,变量HowMany的值将是32。Options参数被指定为adCMDText。这个常量用来使ADO把字符串的内容解释为命令文本,而不是一个表的名字或一个存储过程。通过向ADO传递字符串内容的有关信息,这个常量使用ADO更高效地执行相关命令。
连接对象的使用
可以使用以下作为Options参数:
①adcmdtable:被执行的字符串包含一个表的名字。
②Adcmdtext:被执行的字符串饮食一个命令文本。
③AdcmdstoredProc:被执行的字符串包含一个命令文本。
④Adcmdunknown:不指定字符串的内容(这是缺少值)
在一个ASP网页中使用这些常量之前,必须先包含一个名为“”的特殊文件。该文件ADO使用的所有VBScript常量。上面程序中第一行的INCLUDE语句包含了文件“”。
连接对象的使用
在安装ASP时,文件“”被自动安装,一般来说,该文件会被安装在c:\Program Files\Common Files\System\ADO目录下。但是,也许不得不使用Windows NT任务栏中的Find命令去查找这个文件的确切位置,找到该文件后,再把这个文件拷贝到的ASP目录中。
如果使用的是JavaScript,而不是VBScript,ADO常量的解释文件应该是.
打开一个连接后,需要调用Execute方法多少次,就可以调用多少次。
连接对象的使用
例如,下面的脚本程序向表Htable输入了32个字符:
<!--#include virtual= “”-->
<%
Set conn=("")
"DSN=Hello"
For i=1 To 32
Mysql="insert htable (Hcolumn) values (this is entry "& i &")"
MySQL, HowMany, adcmdtext
Next
%>
连接对象的使用
这段脚本程序使用了一个FOR…next 循环,向表Htable中插入了32条记录。变量MySQL包含Execute方法作用的SQL命令字符串。注意书写SQL字符串时如何使用单引号和双引号:单引号用来标记SQL语句内部的引用,双引号用来指定VBScript内字符串的开始和结束。
用Execute方法几乎可以使用所有的SQL命令。例如,下面的脚本程序创建了一个表,然后添加数据和清除数据,最后删除这个表:
连接对象的使用
<!--#INCLUDE VIRTUAL=""〉
<%
Set Conn= ("")
"DSN=Hello"
'Create a new table
MySQL="CREATE TABLE newtable (Hcolumn VARCHAR (255))"
MySQL
'populate the table
MySQL="INSERT newtable (Hcolumn) VALUES ('hello')"
连接对象的使用
'truncate the table
MySQL="TRUNCATE TABLE newtable"
MySQL
'drop the table
MySQL="DROP TABLE newtable"
MySQL
%>
连接对象的使用
3.创建事务处理
当一组语句构成一个事务处理时,如果一个语句没有执行成功,则所有的语句都不会执行成功。例如,假设在某个时间某用户在着站点上购买了东西,有关的交易住处存储在两个表中:一个表用来保存买者的信用卡信息,另一个表购买的商品信息。现在,假设该用户正试图从站点上购买东西,其信用卡号码已经被输入了第一个表中,但就在这时发生了意外情况,一道闪电击中了服务器,使第二个表没有被更新。在这种情况下,当然最后的结果是两个表都没有被更新过,以避免收该用户的钱去买其不想买的东西。使用事务处理可以防止第二个表没有被更新而第一个表被更新的情况出现。下面是一个在网上购物应用中使用事务处理的一个实例。
连接对象的使用
<%
Set Conn=("")
"DSN=Hello"
"INSERT CreditCard (CCNum) VALUES ('5555-55-444-44-4444')"
"INSERT Shipping (Address) VALUES ('Paris,France')"
连接对象的使用
IF WEEKDAYNAME (WEEKDAY (DATE))= "Sunday" THEN
ELSE
END IF
%>
在这个例子中,使用了RollBackTrans 方法,如果是星期天,就取消事务处理所做的操作。在星期天两个表都不能被更新。
使用记录集(RECORDSET)
1. 用记录集显示记录
记录集可以用来代表表中的记录。与表一样,一个记录集包含一条或多条记录行,每个记录包括一个或多个域(字段)。在任何时刻,只有一条记录是当前记录。
要创建记录集对象的一个实例,可以使用连接对象的Execute()方法。当用Execute()方法从一个数据库返回查询结果时,一个记录集对象会被自动创建。例如:
<%
Set Conn=("")
"DSN=Hello"
使用记录集(RECORDSET)
Set RS= ("SELECT * FROM Htable")
%>
在这个例子中,使用一个SQL的SELECT语句从一个表Htable中返回了所有的记录,Execute()方法返回一个自动创建的记录集。在这个脚本程序中,该记录集被分配给变量RS,然后关闭这个记录集。最后,关闭与数据库的连接。
使用记录集(RECORDSET)
这个创建一个记录集的最简的方法,记录集由EXECUTE()方法的运行结果自动创建。
记录集中的每一条记录都HTABLE中的一条记录。要显示记录集中的所有记录,只要简单地加一个循环语句即可。例如:
<%
Set Conn= ("")
"DSN=Hello"
Set RS= ("SELECT*FROM Htable")
使用记录集(RECORDSET)
WHILE NOT
Response Write("<BR>"&RS ("Hcolumn"))
WEND
%>
在这个例子中,WHILE…WEND循环用来扫描记录集RS中的每一条记录,把每个记录的Hcolumn域输出到浏览器。这段脚本程序用以显示表Htable中的所记录。
使用记录集(RECORDSET)
当一个记录集对象中收集了数据时,当前记录总是第一条记录。在上面的例子中,调用了记录集对象的MoveNext方法,使当前记录移到下一条记录。记录集对象的EOF属性标志着记录集的末尾,当所有的记录都显示完毕时,EOF属性的值将变为True,从而终止WHILE…WEND循环。
如果记录集对象的MoveNext方法在记录集达到最后一条记录后继续执行,ADO程序将会出错。
使用记录集(RECORDSET)
一个记录集对象有一个域集合,包含了一个或多个域对象。一个域对象代表数据库表中的一个特定的字段。例如,在上面的脚本程序中,使用了表达式RS(”Hcolumn”)来显示字段Hcolumn。实际上,可以通过多种途径显示一个字段的值。下面的每一个表达式都可以显示字段Hcolumn的值:
RS ("Hcolumn")
RS (0)
("Hcolumn")
(0)
("Hcolumn")
(0)
使用记录集(RECORDSET)
注意:既可以通过字段名,也可以通过顺序号来指定一个字段,可以使用RS(”Hcolumn”)或RS(0)来代表字段Hcolumn。这两种方法起到了同样的效果,因为字段Hcolumn对应于表中的第一个字段(第一个字段的顺序号是0)。
在这里,RS(0)不是表示记录集中的第一条记录,而是表示该记录集中的第一个域,即第一个字段,这是初学者容易混淆的。
当不知道一个记录集中的字段名时,通过顺序号指定一个域是有用处的。例如,下面的ASP脚本程序显示了一个表中所有记录的所字段:
使用记录集(RECORDSET)
<html>
<head><title>show All Rows And Columns</tutke></head>
<body>
<%
Set Conn=("")
"dsn=hello"
Set RS=("select * from htable")
%>
<table border=1>
<tr>
<% fOR i=O to -1%>
使用记录集(RECORDSET)
<TH><% =RS(i).Name*></TH>
<%Next%>
</TR>
<%
wend
%>
</table>
</body>
</html>
使用记录集(RECORDSET)
在这个例子中,域集合的COUNT属性用来返回该记录集中的域的数目,NAME属性用来返回每个域的名字。两个FOR…NEXT循环用来对记录集中的所有字段进行操作。不论表中有多少记录和字段,它们都将被显示出来。
2.记录集游标和锁定类型
记录集的游标就是记录集属性的标志。游标决定了可以对一个记录集进行什么操作,还决定了其他用户可以对一个记录集进行什么样的改变。下面列出了游标的不同类型和限制:
使用记录集(RECORDSET)
①adOpenFowardOnly:使用前向游标,只能在记录集中向前移动。
②adOpenKeyset:使用关键集游标,可以在记录集中向前或向后移动。如果一个用户删除或改变了一条记录,记录集将反映这个变化。但是,如果另一个用户添加了一条新记录,新记录则不会出现在记录集中。
③adOpenDynamic:使用动态游标,可以在记录集中向前或向后移动。其他用户造成的记录的任何变化都将在记录集中有所反映。
④adOpenStatic:使用静态游标,可以在记录集中向前或向后移动。但是,静态游标不会对其他用户造成的记录变化有所反映。
使用记录集(RECORDSET)
在缺省情况下,当打开一个记录集时,将用前向游标打开它。这意味着只能用MovNext方法在记录集中向前移动。但不支持对记录集的其他操作。
使用前向游标的好处是较快。无论何时,如果前向游标可以实现的要求,就应该使用前向游标。但是,如果需要用功能更强的游标打开记录,可以使作、用如下的脚本程序:
使用记录集(RECORDSET)
<!--#INCLUDE VIRTUAL= "">
<%
Set Conn= ("ADODB Connection")
Set Rs= ("")
"DSN=Hello"
RS Open "SELECT * FROM Htable",ComandOpenDynamic
%>
使用记录集(RECORDSET)
要用一种特定的的游标打开记录集,必须显式地创建这个记录集,然后再用该游标类型打开它。要做到这一点,首先要创建记录集对象的一个实例,然后用Open方法,通过一个连接和一种游标类型,打开这个记录集。在这段脚本程序中,用连接对象Conn和一个动态游标打开了记录集RS。
打开记录集时,也可以指定锁定类型.锁定类型决定了当不止一个用户同时试图改变一个记录时,数据库应如何处理.可以指定以下四种锁定类型:
使用记录集(RECORDSET)
①adLockReadOnly:指定记录集中不能修改的记录
②adLockPessimistic:指定编辑一个记录时,立即锁定它。
③AdLockOptimstic:指定只有调用记录集的Update方法时,才锁定记录。
④AdLockBatchOptimstic:指定记录只能被成批地更新。
在缺省情况下,记录集使用只读锁定。要指定不同的锁定类型,可以在打开记录集时含这些锁定常量之一。例如:
使用记录集(RECORDSET)
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("AD0DB Connection")
Set RS=("")
"DSN=Hello"
RS Open "SELECT * FROM Htable",Conn, adOpenDynamic, adLockPessimisdic
%>
使用记录集(RECORDSET)
这个脚本程序与前一个基本相同,只是增加了锁定类型。当打开记录集RS,将使用adLockPessimisdic锁定。这意味着这个记录集中的记录可以被修改。
最后,打开一个记录集时,可以指定一个Options参数。Options参数标明用来打开记录的命令字符串的类型,向ADO传关被执行和字符串内容的有关信息将有助于高效地执行该命令字符串。
使用记录集(RECORDSET)
可以使用下面的常量作为Option参数:
①adCMDTable:命令字符串的内容是一个表的确名字。
②adCMDText:命令字符串的内容是一个命令文本。
③adCMDStiredProc:命令字符串的内容是一个存储过程名。
④adCMDUnknown:不指定命字符串的内容,这是缺省值。
使用记录集(RECORDSET)
在下面的脚本程序中,Option参数用来向ADO传送这样的信息:命令字符串的内容是命令文本。
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("AD0DB Connection")
Set RS=("")
"DSN=Hello"
使用记录集(RECORDSET)
RS Open "SELECT * FROM Htable",Conn, adOpenDynamic,adLockPessimisdic
%>
使用记录集(RECORDSET)
3. 操作记录集对象的高级方法
有多种用以修改记集中记录的方法。使用这些方法可以很方便地对记录集进行操作。下面对记录(RecordSet)对象的每种方法作简要说明:
①AddNew:向记录集中增加一条新记录
②CancelBatch:记录集处于批量更新模式时取消一批更新。
③CancelUpdate:在调Update之前取消对当前记录的所有修改。
④Delete:从记录集中删除一条记录。
⑤Update:保存对当前记录的修改。
⑥UpdateBatch:记录集处于批量更新模式时保存对一个或多个记录的修改。
使用记录集(RECORDSET)
以下例子展示了如何利用AddNew方法向一个打开的记录集中添加一条空记录。
<!--#INCLUDE VIRTUAL= ""->
<%
Set Conn= ("ADODB Connection")
Set RS= ("")
"DSN=Hello"
RS Open "SELECT * FROM Htable",Conn,adOpenDynamic, adCMDText
使用记录集(RECORDSET)
RS AddNew
RS Update
%>
在这个脚本程序中,用AddNew方法增加了一条新记录。接着,记录集的Hcolumn域被赋值“New data”。最后,调用Update方法保存新记录。要使用变些方法,记录集必须以只读方式以外的其他锁定方式打开。
也可以使用SQL的INWERT语句向一个表中增加新记录,以取代AddNew方法。通常,使用SQL比使用上述方法要好一些,因为SQL更加灵活。
使用记录集(RECORDSET)
4. 遍历记录集
记录集对象有许多可在记录之间进行移动的方法,这些方法大多数只有在记录集以某种特定的游标打开时才可以使用。
(1)记录集对象的方法及其功能
下面列出了记录集对象的一些方法及其功能。
①Move NumRecords:记录集中向前或向后移动指定数目的记录。
②MoveFirst:移动到记录集的第一条记录。
③MovEnext:移动到记录集的下一条记录。
④MovePrevious:移动到记录集的下一条记录。
⑤MoveLast:移动到记录集的最后一条记录。
使用记录集(RECORDSET)
(2)记录集对象的属性和功能
记录集对象还有许多属性,对遍历记录集是很有用处的,同样,许多属性需要特定的游标类型。下面列出了记录集对象的一些属性及其功能:
①AbsolutePosition:设置或读取当前记录在记录集的位置顺序号
②BOF:标明当前位置在记录集的第一条记录之前。
③EOF:标明当前位置在记录集的最后一条记录之后。
④RecordCount:表示一个记录集的记录总数。
使用记录集(RECORDSET)
如果想在一个记录集中反向移动,可以使用MoveLast和MovePrevious方法以及BOF属性。例如:
<HTML>
<HEAD><TITLE>Backwards Recordset</TIRLE></HEAD>
<BOOY>
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("ADODB Connection")
Set Rs= ("")
"DSN=Hello"
使用记录集(RECORDSET)
"SELECT * FROM Htable",Conn, adOpenDynamic
WHILE NOT
("<BR>"&RS("Hcolumn"))
WEND
%>
</BOOY>
</HTML>
使用记录集(RECORDSET)
在这个例子中,用静态游标打开记录集。记录集打开后,通过使用MoveLastt MovPrevious该记录集中的所有记录都被显示,直至到达记录的开头。其中,EOF属性用来检测何时到达记录集的结尾。
读者可以用这种方法在一个记录集中向移动,但是,很难想象有什么理由需要这样做。使用SQL语言自身对查询结果进行排序是有效的,应该用ORDER BY子句对记录进行排序。
使用记录集(RECORDSET)
5.返回记录数目
可以用记录集对象的RecordCount属性不确定一个记录集中的记录总数。但是应该慎重使用用这个属性,因为该属性在许多情况下效率极低。
对一个用前向游标打开的记录集,不能使用RecordCount属性,必须打开一个较率较低的游标才可以使用这个属性。例如:
使用记录集(RECORDSET)
<!--#INCLUDE VIRTUAL= ""->
<%
Set Conn= ("")
Set Conn= ("")
"DSN=Hello"
"SEKECT Hcolmn FROM Htable",conn,adOpenStatic
(RS RecrdCount)
%>
使用记录集(RECORDSET)
这个脚本程序用来输出表H table中的记录数目RecordCount 属性,记录集用一个静态游标打开。
通常,查询一个记录数的目的在于想确定是否至少有一条记录满足定,RecordCount 是 大于0。例如,常见的用法是用于检查用户输入的口令是否正确,这可以在接收用户的口令输入后,根据该条件到数据的口令中查询是否有该口令存在而实现。在这种情况下,可以查询一个保存口令的表,用RecordCount 属性确定是有口令存在。如果RecordCount 大于0,说明有口令存在,否则说明没有口令存在,该口令是非法的。
使用记录集(RECORDSET)
但是,用EOF属性检测一个查询是否返回了结果将会更好。当用前向游标打开一个记录集时,可以使用EOF属性。例如:
<!--#INCLUDE VIRTUAL= ""->
<%
Set Conn= ("")
Set Conn= ("")
"DSN=Hello"
"SELECT * FROM Password_Table WHERE Password= "&
("Password"),Conn
使用记录集(RECORDSET)
IF RS EOF THEN
("The password you entered is invalid.")
ELSE
("Welcome to out web site!")
END IF
%>
在这个例子中,用EOF属性检测是否一个查询有返回结果。如果EOR属性True,说明用户输入的口令不在保存口令的表中。
使用记录集(RECORDSET)
在些情况下,的确需要返回记录数目。例如,也许想显示在站上注册的用户总数,这时该避免使用RecordCount属性,而应执行一个SQL COUNT(*)查询。例如:
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("")
Set Conn= ("")
"DSN=Hello"
使用记录集(RECORDSET)
"SELECT COUNT(*)Mycount FORM Password-Table",Conn
%>
There are <% =RS ("MyCount") %>registered users at the web site
<%
%>
注意,这个查询中是如何使用字段名Mycount的,通过给集合函数COUNT(*)提供一个名字,可以在输入查询结果时使用这个名字。
命令对象的使用方法
1.使用命令对象
ADO的命令(Command)对象也是ADO对象集合的一员,其主要功能是执行一句或者一批SQL查询语句,或者驱动SQL Server段的StoreProcedure存储过程。
从字面上的意思来看,Command是“命令”的意思,“命令”会让我们联想到SQL命令,Command对象就是在ADO中执行一系列SQL查询语句的工具,SQL语句是它的基础。
命令对象代表一个命令,如一个SQL查询或一个SQL存储过程。前面介绍了如何用连接对象的Execute方法和记录对象的Open方法执行命令字符串,同样可以使用Command对象来实现。例如:
命令对象的使用方法
"SELECT * FROM Htable", Conn
"UPDATE Htable SET Hcolumn='Hello'"
这两个例子都使用了SQL命令字符串。在第一个例子中,用命令安符串打开记录集。在第二个例子中,执行命令字符串来更新数据。
命令对象可以用来代替命令字符串,或可以用来代表一个专门的命令。可以用命令对象的一个实例返回记录集或执行一个不返回记录集的SQL命令。例如:
命令对象的使用方法
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand=("")
"DSN=Hello"
Set =Conn
="UPDATE Htable SET Hcolumn='Hello'"
=adCMDText
%>
命令对象的使用方法
在这个例子中,创建了命令对象的一个实例。接着,ActiveConnection属性把命令和一个打开的连接联系在一起(用Set语句完成这个任务,因为是在分配一个对象)。CommandText属性指定要执行什么SQL语句。CommandType属性指明该命令是一个命令的文本定义。最后,调用Execute方法执行这个命令。
使用命令对象可以通过两种途径返回记录集。一是使用命令对象的Execute()方法返回一个记录集,二是和一个已经存在的记录集一起使用命令对象,下面是第一种途径的实例:
命令对象的使用方法
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand= ("")
"DSN=Hello"
Set =Conn
=adCMDText
="SELECT * FROM Htable"
Set RS=()
%>
命令对象的使用方法
在这段脚本程序中,命令对象的Execute()方法被用来返回一个记录集。注意引号的使用,因为该方法用来返回结果。用命令对象创建了记录集对象的一个实例后,可用标准的方式操作它。
也可以和一个已经存在的记录集一起使用命令对象。例如:
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("")
Set MyCommand=("")
Set Rs=Sever Creare0bject("")
"DSN=Hello"
命令对象的使用方法
Set =Conn
=adCMDText
= "SELECT * FROM Htable"
MyCommand,
%>
命令对象的使用方法
用命令对象打开一个已经存在的记录集对象的好处是可以指定记录集的游标和锁定类型。在这个例子中,命令对象用来打开一个使用静态游标和adLockOptimistic锁定的记录集。注意打开记录集时如果使用静态游标和需指定连接对象,命令对象决定该使用哪个连接。
上面的例子中专门创建了一个命令对象而不使用命令字符串。这是因为使用命令对象有一个主要的优点:可以使用SQL存储过程。使用SQL存储过程的理由如下:
①SQL存储过程执行起来比SQL命令文本快得多。当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要对它进行分析和编译。
命令对象的使用方法
②可以在多个网页中调用同一个存储过程。这使得站点易于维护,如果需要对一个SQL语句做某些改动,只要进行一次即可。
③可以在存储过程中利用Tranwact-SQL的强大功能。一个SQL存储过程可以包含多个SQL语句,并可以使用变量和条件。这意味着可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。
④在存储过程中可以使用参数。可以传关和返回参数,还可以得到一个返回值。
命令对象的使用方法
2.使用命令对象调用存诸过程
假设要取出表Htable中的所有记录并在一个ASP网页中显示这些记录。而且,假设要以 可能高效的方式从表中取出记录,在变种情况下,应该使用存过程。
要建立新的存储过程,应该从Micrisoft SQL Sever程序组中启动“ISQL/w”,然后,在查询窗口中输入以下的文本:
CREATE PROCEDURE sp_myporc AS
SELECT * FROM Htable
单击“执行查询”按钮(看起来像一个绿色三角形),建立这个存储过程,该存储过程的名字是sp_myporc。
命令对象的使用方法
要在一个ASP网页中调用sp_myproc,可以使用命令对象的一个实例。例如:
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand= ("")
"DSN=Hello"
Set =Conn
=adCMdStoredProc
= "sp_myproc"
命令对象的使用方法
Set RS= ()
WHILE NOT
("<BR>"& RS ("Hcolumn"))
WEND
%>
这段脚本程序通过调用存储过程sp_myproc取出记录,并显示表Htable中的所有记录。当用命令对象调用存储过程时,应该把该命令对象的CommandType属性设为adCMDStoredProc。CommandText属性用来指定要调用的存储过程的名字。
命令对象的使用方法
3.返回状态值
可以用命令对象从一个存储过程得到返回状态值。例如,假设要统计一个表中的记录总数,效率最高的方法是建立一个存储过程。例如:
CREATE PROCEDURE sp_CountMytabe AS
RETURN(SELECT COUNT(*) FROM Htable)
这个存储过程返回表Htable中的记录总数。SQL集合函数COUNT()用以计算该表中的记录数,RETURN语句返回该记录数。
命令对象的使用方法
要得到一个存储过程的返回状态值,必须为命令对象建立一个参数。命令对象有一个名为Parameters的集合,该集合是一个参数对象的集合。
可以用命令对象的CreateParameter() 方法建立一个参数。接下来,用Append方法把这个参数添加到命令对象的Parameters集合中。例如:
命令对象的使用方法
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand=("")
"DSN=Hello"
Set =Conn
=adCMdStoredProc
="sp_CoutHtable"
Set MyParam= ("RetVal",adlnteger,adParamReturnValue)
命令对象的使用方法
Myparm
%>
There are <%=MyCommand("RetVal")%> records in Htable
<%
%>
在这个脚本程序中,用CreateParameter()方法建立了一个参数对象。此例中的CreateParameter()方法有以下三个参数:第一个参数为新参数指定一个名字;第二个参数指定数据类型;第三个参数指定新参数的类型。在此例中,常量adParamReturnValue指明该参数是一个返回参数。
命令对象的使用方法
建立了任何新参数之后,都须将它们添加到命令对象的Parameters集合中。Append方法用来把新参数添加到这个集合中。
命令执行后,参数的值可以被取出。因为该参数是命令对象的Parameters集合中的一员,用MyCommand("RetVal")可以返回该参数的值。实际上,用以下任何一个表达式都可以得到该值:
命令对象的使用方法
MyCommand ("RetVal")
MyCommand (0)
("RetVal")
(0)
("RetVal")
(0)
这些方法都可以用来取出一个参数的值,因为一个参数是命令对象参数集合的一部分。注意,对所有的集合,都可以通过名字或顺序号指定一个参数。
命令对象的使用方法
4. 输出参数
使用输出参数的好处是输出参数可以有一个或多个,而且,输出参数可以属于任何数据类型。
例如,假设有一个表Webusers保存了在站点上注册的用户名字,这个表只有一个字段UserName, 现在假设要取出按字母顺序排在最前和最后的用户名,可以使用以下存储过程。
CREATE PROCEDURE sp_HighAndLow
(@HighUser VARCHAR (30)OUTPUT, @LowUser VARCHAR(30) OUTPUT)
AS
SELECT @HighUser=MAX(UserName) FROM Webusers
SELECT @LowUswr=MIN(UserName) FROM WebUsers
命令对象的使用方法
这个存储过程有两个输出参数:@HighUser和@LowUser。@HighUser包含按字母顺序排在最后的用户名(如Zeek Zimmerman),@LowUser包含按字母顺序排在最前的用户名(如Anne Arnold)。
要在ASP网页中调用这个存储过程,可以使如下脚本程序:
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn= ("")
Set MyCommand=("")
"DSN=Hello"
命令对象的使用方法
Set =Conn
=adCMdStoredProc
= "sp_HighandLow"
Set MyFirstParam=("HighUser",adVarChar,
adParamOutput,30)
MyFirstParam
Set MySecondParam= ("LowUser", adVarChar,
adParamOutput,30)
MySecondParam
命令对象的使用方法
%>
<P>The person with the alphabetically Hiighest name is
<%=MyCommand ("HighUser")%>
<P>The person with the alphabetically lowest name is
<%=MyCommand("LowUser")%>
<%
%>
命令对象的使用方法
这个脚本程序的结构与上一个非常相似。在这个脚本程序中,用CreateParameter()方法创建了两个参数对象,这两个参数都被定义为VARCHAR型。为了指明它们是输出参数,使用了常量adParamOutput。最后,在职CreateParameter()方法中指定了每个参数的最大长度。当建立的参数属于变长度数据类型(如VARCHAR)时,必须指定一个最大长度。
命令对象的使用方法
5.输入参数
SQL存储过程可以接收输入参数。输入参数能够将数据传递给存储过程。
例如,假设有一个表保存了用户名和密码,假设要建立一个检查密码的存储过程。使用以下存储过程,可以检查一个用户是否输入了合法的密码。
CREATE PROCEDURE sp_CheckPass
(@CHKName VARCHAR (30), @CHKPass VARCHAR(30),@ISValid CHAR (4) OUTPUT)
命令对象的使用方法
AS
IF EXISTS(SELECT UserName FROM WebUsers
WHERE UserName='@CHKName' AND UserPass='@CHKPass'
SELECT @LSVaid="Good"
ELSE
SELECT @LSValid="Bad"
这个存储过程接收两个输入参数:输入参数@CHKaName向存储过程传递一个用户名,@CHKPass向存储过程传递一个密码。如果某用户拥有指定的密码,输出参数将返回“Good”,否则,返回“Bad”。
命令对象的使用方法
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand=("")
"DSN=Hello"
Set =Conn
=adCMdStoredProc
= "sp_CheckPass"
Set MyFirstParam= ("UserName",adVarChar,adParamlntput,30)
命令对象的使用方法
MyFirstParam
Set MySecondParam= ("UsePassr",adVarChar, adParamlnput,30)
MySecondParam
Set MyThirdParam=MyCommand CreatsParameter ("RetValue",adChar,
adParamOutput,4)
MyThirdParam
MyCommand("UserName")= "Computer"
命令对象的使用方法
MyCommand("UserPass")= "ASP"
%>
The password is <%=MyCommand ("RetValuer") %>
<%
%>
在这个例子中,名字Computer和密码ASP被传递给存储过程。如果表中存在这个名字一密码组合,则报告该密码为Good,否则报告密码Bad。
命令对象的使用方法
在这个脚本程序中,用常量adParamInput指定两个输入参数。注意这两个输入参数在命令执行前都被分配了一个值。
命令对象的使用方法
6.取出参数信息
有时需要用到一个存储过程,但是不知道该存储过程需要什么参数。例如,也许不知道参数的数据类型或参数的大小,在这种情况下使用下面的脚本程序,可以得到一个存储过程所使用参数的有关信息。
<!--#INCLUDE VIRTUAL=""->
<%
Set Conn=("")
Set MyCommand=("")
"DSN=Hello"
命令对象的使用方法
Set =Conn
=adCMdStoredProc
= "sp_myproc"
%>
<HTML>
<HEAD><TITLE>Parameter Information</TITLE></HEAD>
<BOOY>
<TABLE BORDER=1>
<CAPTION>Parameter Information</CAPTION>
<TR>
命令对象的使用方法
<TH>Parmeter Name</TH>
<TH>Datatype</TH>
<TH>Direction</TH>
<TH>Size</TH>
</TR>
<%For Each thing in %>
<TR>
<TD><%=%></TD>
<TD><%=%></TD>
<TD><%=%></TD>
命令对象的使用方法
<TD><%=%></TD>
</TR>
<%
Next
%>
</TABLE>
</BOOY>