利用 Microsoft Active Server Pages 创建动态、交互式站点
利用微软的软件产品 Active Server Pages,通过在普通页面中嵌入的ASP脚本语言,可以帮助建立动态的交互式站点,这一点早已是大家所熟知的了,就不用多说了.笔者也是初学ASP 脚本语言编写,来谈谈自己的学习体会,希望能给后学者一点建议和启示,更期望引起大家的兴趣来交流探讨、共同提高.
一 ASP 与 HTML 相比的优点
关于这方面的论述已经很多了,这里就不展开讨论了.笔者认为,ASP与HTML相比,其最大的优势在于三个方面:
1.在创建动态、交互式站点方面,其功能强大、处理方式灵活,具体可参见其它歌颂 ASP 功能的文章.
2.由于ASP脚本语言是由服务端来解释和运行,动态生成普通的HTML页面,然后再传送到客户端供浏览,因而对客户端浏览器要求相对较低,并不要求其必须支持特定的某些脚本语言如JavaScript、JScript、VBScript、Perl等等.
3.由于传送到客户端的只是解释后的HTML页面,因而有效地保护了页面开发者的知识产权.
二 搭建学习 ASP 的应用系统平台
关于这方面的文章也不少,如【计算机世界】1998年第38期Internet&Intranet版的一篇文章《自己搭建ASP集成开发环境》就挺不错,目前读者还保留这篇文章,如果你需要就发个Mail过来吧.笔者所用的开发平台为 Win95 + TCP/IP + PWS + ASP + FrontPage98,其中 FrongPage 不是必须的,可以用其它页面开发工具甚至是 NotePad 来代替.PWS 应该容易获得和安装,在 Win95 OSR2 及其后的版本中都有;而ASP 则需要在 WinNT 的 IIS 中去找,或在 Visual Interdev 的安装光盘中去找,实在找不到就到微软的站点上去下载一个吧.
三 建立自己的简单ASP页面
所谓的ASP页面就是在普通的HTML页面文件中插入一些特殊的脚本语言并以扩展名asp保存后的页面,所以可以很容易地建立一个自己的简单的ASP页面,体会一下ASP的入门感觉,同时获得点成功的快感以便保持继续学习下去的兴趣.
首先来学习一下ASP脚本语言的简单的语法.最基本的的是,在与HTML语言混合使用时ASP语句是以""<%"为开始,以"%>"为结束的,且必须成对出现.另外,由ASP默认的脚本语言是VBScript(设置其它脚本语言稍后再谈),你还应该熟悉VBScript的基本语法.有了这些,建立一个简单的ASP页面应该是没有问题了.
看看下面的一个页面文件( test1.asp ):
<% rem test1.asp %>
一个简单的ASP页面
下面应出现4行语句,字体大小从4到7
<% for i = 4 to 7 %>
>这行语句的字体大小为
<% =i %>
<% next %>
其中,语句 <% =i %> 是将变量 i 的值输出到HTML文件中.ASP用"<%=变量名%>"将指定变量的内容输出到其生成的HTML页面中.
由上可见,可以先设置制作一个普通的HTML页面文件,然后在需要的地方插入ASP脚本语言即可.关键是熟练应用ASP脚本语句.
该页面虽然简单,却可以帮助熟悉和理解ASP语法.可以用浏览器查看运行效果,再用其查看源代码的功能看一下源代码,可以看对ASP页面解释后的HTML文件.注意必须用http的方式访问ASP页面,不能象HTML页面文件那样双击文件名以文件方式浏览.如在笔者的计算机上的访问方式为 http://wangfajun/aspsamp/test1.asp
四 利用Request对象制作简单的交互页面
ASP的内建对象Request中包含了访问者的一些申请信息.可以将这些信息作为某些应用(如商业订单信息)并对申请者的申请要求作出反馈.
在我们的这个例子中,读者会员资格注册申请页面要求申请者填写其姓名全称、身份证号码、EMail地址.在收到读者申请后通知其注册成功.
先做一个读者会员资格注册申请页面,可以是HTML页面或ASP页面.这应该不成问题.
读者会员资格注册申请
读者会员资格注册申请
在申请页面中,所有的申请数据均填写在Form元素中,并且在Form的Action中指定处理申请的页面为result.asp.当收到申请时,对应项目的数据可以由Request.Form("项目名称")来获得,其中"项目名称"为Form元素的名称,如"姓名全称"对应"FullName" ,如"身份证号码"对应"UniversalID" .现在利用这些信息来制作一个注册成功的通知页面Result.asp.
<% rem result.asp %>
读者会员资格注册申请成功
读者会员资格注册申请成功
亲爱的<%=Request.Form("FullName")%>读者:
我们已经收到你的申请,并接受你的申请.你已经成为我部正式读者会员.
你的读者号为CN<%=Request.Form("UniversalID")%>.我们将通过你的电子信箱<%=Request.Form("Email")%>
来正式通知你.此后我部举行读者沙龙活动的时间和地点也将通过该信箱通知你.
现在用浏览器打开申请页面,填入对应数据后提交申请,查看反馈效果,再用浏览器的查看源代码的功能看一下源代码,可以看对ASP页面解释后的HTML文件.
五 通过内建对象 Request 获取用户申请信息
可以从 ASP 的内建对象 Request 获取用户通过HTTP传送过来的申请信息,如客户认证、Cookies数据、Post信息、查询参数、服务器环境信息等,这些可以分别从对象 Request 的集合属性ClientCertificate、Cookies、Form、QueryString、ServerVarables 中获取,获取方式为 Request.CollectionName( ItemString ),其中CollectionName为集合属性名称即
ClientCertificate、Form、QueryString、ServerVarables 中的一个,ItemString 为要获取的项目的名称.如果可以确定没有重复的项目名称,也可直接以Request( ItemString )来获取用户信息,而不用指明集合属性名称.例如请求页面中有一个Form元素CustomerID,且没有其它元素名称为CustomerID,则用Request.Form( "CustomerID" ) 与用Request.( "CustomerID" )
具有同样的效果.
㈠.用Request.Form获取表格信息
1.ASP页面可从一个HTML中获取表格信息,只要将该表格的Action指定为对应的ASP页面即可.该项应用可参见前面的列举的读者会员资格申请的例子.在该例子中,result.asp 从一个HTML中获取表格信息并提供反馈信息.
2.ASP页面可从另一个ASP页面生成的HTML中获取表格信息.具体运作方式基本与从HTML页面中获取信息相同.
3.ASP页面可从自己生成的HTML中获取表格信息,只不过需要判断该页面是输入页面还是反馈页面.在下面的例子中,login.asp 提供了一个用户登录页面,要求用户输入登录帐号和密码,然后再通过Form的Action属性将表格发送给自己进行处理.在 login.asp 中,将根据帐号和密码是否全为空来判断是输入页面还是反馈页面,并给予不同的提示,若是输入则提示"用户登录,请输入用户帐号和密码",否则显示用户帐号和密码.
<% rem login.asp %>
用户登录
<% if isEmpty( Request.Form( "CustomerID" ) ) and isEmpty( Request.Form( "Password" ) ) then
PromptString = "用户登录,请输入用户帐号和密码"
else
PromptString = "用户"&Request.Form( "CustomerID" )&"登录成功,密码为"&Request.Form( "Password" )
end if
%>
<% = PromptString %>
㈡.用Request.QueryString获取用户查询参数信息
当用户以 xxxxx.asp?ParaName = ParaValue 的方式发出查询请求时,xxxxx.asp 可以从Request.QueryString("ParaName") 中获取用户提交的查询参数ParaName的信息ParaValue,还可以从Request.QueryString("ParaName").count得知同一个参数被赋值的次数并进行相应的处理.
当用户以 query.asp?CustomerID=7777 的方式发出查询请求时,query.asp 可以从Request.QueryString("CustomerID") 中取得查询参数 CustomerID的值为 7777,Request.QueryString("ParaName").count 为 1.
当用户以 query.asp?CustomerID=7777&Password=DogIsDog 的方式发出查询请求时,query.asp 可以从Request.QueryString("CustomerID") 中取得查询参数 CustomerID 的值为 7777,从Request.QueryString("Password") 中取得查询参数 Password的值为 DogIsDog ,Request.QueryString("CustomerID").count 为 1,Request.QueryString("Password").count 为
1.
有时用户可能对一个参数指定若干个值,此时可以从Request.QueryString("ParaName ").count 获取该参数ParaName被指定的内容的个数,并以索引的方式来取得参数值.例如用户希望查询到三个客户7777 、 8888 和 9999 的相关资料时就可能以下面的方式query.asp?CustomerID=7777&CustomerID=8888&CustomerID=9999 发出查询请求,此时在query.asp 可以获知 :
<% = Request.QueryString("CustomerID").count %> 为 3
<% = Request.QueryString("CustomerID") %> 为 7777,8888,9999
<% = Request.QueryString("CustomerID")(1) %> 为 7777
<% = Request.QueryString("CustomerID")(2) %> 为 8888
<% = Request.QueryString("CustomerID")(3) %> 为 9999
其中Request.QueryString("CustomerID")可同时获取三个参数,各个之间参数用逗号隔开.
下面的例子(query.asp)用于获取用户指定的客户帐号,并显示出来反馈给用户.
<% rem query.asp %>
用户帐号
您指定的客户帐号如下
<%for i = 1 to Request.QueryString("CustomerID").count %>
第<% = i %>个用户帐号:<% = Request.QueryString("CustomerID")( i ) %>
<%next%>
㈢.用Request.ServerVariables获取服务器环境信息
Request.ServerVariables 包含了请求HTTP服务的服务器的环境变量信息.由于应用较少,现列出常用的几个.
Request.ServerVariables( "SERVER_PORT" ) : HTTP服务端口号,一般为 80.
Request.ServerVariables( "HTTP_ACCEPT_LANGUAGE" ) : 服务器采用的语言,
"en"表示英文,"zh-cn"表示简体中文.
Request.ServerVariables( "SERVER_NAME" ) : 服务器的名称或IP地址
Request.ServerVariables( "REQUEST_METHOD" ) : 发出Request的方法
(Post/Get/Head)
Request.ServerVariables( "SCRIPT_NAME" ) : 程序被调用的路径及文件名称
Request.ServerVariables( "REMOTE_HOST" ) : 发出Request的客户端机器的名称
Request.ServerVariables( "REMOTE_ADDR" ) : 发出Request的客户端机器的IP地址
Request.ServerVariables( "REMOTE_IDENT" ) : 发出Request的用户名称,当NCSA
IdentityCheck为True且客户端机器支持RFC931时有效.
Request.ServerVariables( "CONTENT_TYPE" ) : 数据的MIME类型
Request.ServerVariables( "HTTP_ACCEPT" ) : 客户端可接受的MIME类型列表.
Request.ServerVariables( "HTTP_USER_AGENT" ) : 发出Request的客户浏览器类型
Request.ServerVariables( "HTTP_REFERER" ) : 在发出CGI程序之前,客户所指的文本
URL
㈣.用Request.Cookies获取用户的Cookies信息
Cookies 可以服务器和客户端之间双向传递,它记录了特定用户的某些信息.利用Request.Cookies获取用户的Cookies信息.
如果请求用户的Cookies为 Product=Floppy,则Request.Cookies("Product")的值为"Floppy";如果用户发送的Cookies为多重信息即包含有下属类型时,则可采用类似查询参数QueryString的多维方式获得,此时可以用Request.Cookies(cookie)的属性HasKey来判断某个Cookie是否有下属类型。如当用户的Cookies为 Product=Floppy&Floppy=Sony时,属性
Request.Cookies("Product").HasKey为True,可通过Request.Cookies("Product")("Floppy")
得知其值为 "Sony".
Product = <%=Request.Cookies("Product")%>
Floppy = <%=Request.Cookies("Product")("Floppy")%>
㈤.ClientCertificate用的较少,这里就不说了.
要求客户端必须支持SSL3.0或PCT1协议, 服务器端必须启动用户端认证,客户端必须进行相应的设置.
六 通过内建对象 Response 向用户发送信息
可以利用 ASP 的内建对象 Response 很灵活地控制向客户端发送的信息的内容和方式.例如可以自动转向另一个URL页面,可以改变页面脚本的解释方法,可以设置客户的Cookie等
等.
㈠.利用Resopnse.Write 控制发送的信息内容
方法 Response.Write 可以向发往客户端浏览器的HTML文件中直接输出内容.这一点与利用主脚本的<% = 变量名 %>功能基本相同,但Resopnse.Write 的使用更为灵活,这体现在它作为一个方法函数,可以在非主要脚本的函数中直接使用(调用时传递参数的方式遵守对应脚本语言的规定),即可以出现在之间向客户输出内容,这一点是<% = 变量名
%>无法做到的,也是对其功能的一个补充吧.
在下面的例子中,selecolr.asp 要求用户输入一个颜色名称,用户确认后将用户申请发往同一个页面selecolr.asp,然后用用户指定的颜色将颜色名称显示出来.这里实现的功能可以用<% = 变量名 %>的方式来实现.Response.Write 在函数中的应用要涉及到函数调用,稍后会在讨论多脚本语言编程时有例子出现.
<% rem selecolr.asp %>
选择颜色
<%
if isEmpty( Request.Form( "ColorName" ) ) then
Response.write "你只需选择颜色名称,我来显示
"
else
Response.write "你选择的颜色是"&Request.Form( "ColorName" )&"
"
end if
%>
㈡.利用 Response.Redirect 进行URL页面重新定位
假如由于业务上的原因,你的站点的域名或IP地址发生了变化,就象Borland变成了Inprise一样,老顾客在用原来的域名访问时,可以用 Response.Redirect 直接将其引导到新的站点上去;假如要求用户在访问本页面前必须先访问另外一个页面,可用 Response.Redirect 直接将其引导到应该去的页面上去,而不是发出用户无权访问该页面的信息.
值得注意的是,必须在向客户端发送任何信息前使用 Redirect,否则会引起错误.你可以在页面的第一条语句将用户引导另一个URL,也可以将 Response.Buffer 设置为 True 而在以后适当的时间将用户引导另一个URL.
在下面的例子中,若用户调用本页面,则将其引导到另一个页面 selecolr.asp.
<% rem redirect.asp %>
<%Response.redirect "selecolr.asp"%>
重新定向
你不可能进入到本页面,否则就是我的失败.
㈢.利用 Response.ContentType 页面内容解释方法
在HTML页面代码中,经常会看见下面一个句子
其中,它用于指定HTML页面被浏览器解释的方式.当 content="text/html"时,浏览器将代码解释为普通HTML页面并显示给用户;当 content="text/plain" 时,浏览器将代码不加任何解释地显示给用户;当 content = "image/jpeg"是传递图形文件; 当未指定时,ContentType
默认为 "text/html".在ASP页面中,Response.ContentType 作用与普通HTML相同,即可以控制浏览器解释HTML文本的方式。
在下面的例子中,plain.asp 将 Response.ContentType 设置为"text/plain",使用客户
端用户可以直接看到该页面的HTML代码.
<% rem plain.asp %>
<% Response.ContentType = Request.Form( "ContentTypeName" ) %>
内容类型设置
<% if isEmpty( Request.Form( "ContentTypeName" ) ) then
Response.write "你只需选择类型,我来显示
"
else
Response.write "内容类型设置成功
"
end if
%>
㈣.利用 Response.Cookies 设置客户端Cookies
通过设置Response.Cookies可以增加或修改客户端的Cookies,其设置方法与取得对应Cookie的值的方法相同.当要设置的Cookie不存在时,将创建一个新的Cookie,其值为要设置的值;Cookie存在且没有下属类别时,以新值代替原有的值;Cookie存在且有下属类别时,若要设置的Cookie不含下属类别,则原有的下属类别将被删除,若含下属类别且无对应类别则创建新的下属类别,有对应类别则以新值代替原有的值.
在下面的例子中,cookie.asp 用来设置一个名称为 wfj 的Cookie的值.调用时将显示上次设置的Cookie(wfj)的值.由于设置Cookie值要在发送内容之前,所以这里将Response.Buffer 设置为 true( 其原因见后 Response.Buffer 的说明 ).
<%rem cookie.asp %>
<%Response.Buffer = true%>
Cookie设置
<%
Response.Write "原来的Cookie(wfj) = "&Request.Cookies( "wfj" )
if not isEmpty( Request.Form( "CookieValue" ) ) then
Response.Cookies("wfj") = Request.Form( "CookieValue" )
Response.Write "
Cookie(wfj) 已经设置为 "&Request.Form( "CookieValue" )
Response.Write "
下次调用时你会看到的"
end if
Response.write "
你只需设置Cookie,我来显示
"
%>
㈤.利用 Response.Buffer 控制页面发送进度
Response.Buffer 的默认值为 Flase,在这种情况下,服务器在处理对ASP页面的请求时,采用边处理边发送反馈的方式,即在处理完一部分脚本后即向客户端发送反馈,这样在处理耗时较长的ASP页面时,用户不用等待很长时间就可以得到反馈,在用户浏览的同时服务器继续处理和发送反馈信息.当Response.Buffer 为 True 时,服务器在处理对ASP页面的请求时使用缓冲技术,在页面所有的脚本处理结束后才将处理结果传送给客户端,这样在处理耗时较长的ASP页面时,用户需要等待较长的时间,而服务器端则可减少与客户端连接的次数而提高整体响应速度,并可以在满足某种条件时撤消已经处理的结果而不会出现响应完成一部分才停止的状况.
在下面的例子中,buffer.asp 可以根据 BufferValue 的值来决定是否撤消反馈.当输入yes时,用 Response.Clear 取消前面的反馈信息,用 Response.Redirect 将用户引导到Cookie设置页面,用 Response.End 停止反馈.
<% rem buffer.asp%>
<% Response.Buffer = true %>
Buffer设置
<% if isEmpty( Request.Form( "BufferValue" ) ) then
Response.write "你只需设置BufferValue,我来显示
"
else
Response.Write "BufferValue="&Request.Form( "BufferValue" )
end if
%>
<% if Request.Form( "BufferValue" ) = "yes" then
Response.Clear
Response.Redirect "cookie.asp"
Response.End
else
Response.Write "BufferValue="&Request.Form( "BufferValue" )
end if
%>
㈥.Response其它属性和方法
1.Expires属性: 网页在客户端保留的时间长度
2.ExpiresAbsolute属性: 网页在客户端保留的日期与时间
3.AddHeader方法: 设定HTML文件的HTTP报头.
4.AppendToLog方法: 在服务器日志中增加字符串.
5.Flush方法: 立刻送出缓冲区中的的HTML资料.
七 多种脚本语言混合编程
在同一个ASP页面中,可以同时使用多种脚本语言,充分利用各个脚本语言的功能优势.但必须指定一个主要脚本语言,若没有指定则默认为 VBScript.要在一个ASP页面中指定其它脚本语言为主要脚本语言,必须在该页面的第一行指定,方法如下:
<%@ Language = LanguageName %>
如果要将JScript指定为某页面的主要脚本语言,则须在该页面第一行加入:
<%@ Language = JScript %>
若没有指定,则相当于:
<%@ Language = VBScript %>
应注意,这种方法只对支持 Object.Method 语法的脚本语言有效,不支持的要在WinNT服务器上对 LanguageEngines 进行设置,由于笔者没有用到,就不讨论了.
上述是改变单个ASP页面中主要脚本语言,在改变所有ASP页面中主要脚本语言,采用上述方法可能不够聪明,最好是在WinNT服务器上对 DefaultScriptLanguage 进行设置,由于笔者没有用到,就不讨论了,还是用笨办法吧.
除了主要脚本语言外,还可在页面的局部采用其它脚本语言来实现特定的功能.此时要用
其中,LanguageName 为脚本语言名称,可以是VBScript、JScript、Perl 等服务器上已安装的解释引擎的脚本语言;Runat = Server 指定该段脚本在服务器运行,以区别在客户端浏览器运行,因为默认是在客户端浏览器运行,所以该设置不能省略,否则对应的脚本将发送到客户端让浏览器解释运行.
在ASP页面中,一般每种脚本完成一个完整的功能,然后用主要脚本语言进行调用,调用
方法为<%Call Function%>.
用
VBScript :您指定的客户帐号如下
<% Call VBSQuery %>
JScript :您指定的客户帐号如下
<% Call JSQuery %>
主脚本 :您指定的客户帐号如下
<%for i = 1 to Request.QueryString("CustomerID").count %>
第<% = i %>个用户帐号:<% = Request.QueryString("CustomerID")( i ) %>
<%next%>