ASP
十步进阶
王发军
编者按:有关ASP的几篇文章在本报刊出之后,有很多读者来信询问相关问题,均认为有不得其全貌之感。本来报纸不比书籍,不易将某一问题讲透,幸而有王发军先生一文,对于完整了解ASP极有帮助,现将其推荐给各位一读。
利用微软的软件产品ActiveServerPages,通过在普通页面中嵌入ASP脚本语言,可以帮助建立动态的交互式站点,这一点早已是大家所熟知的了,就不用多说了。笔者也是初学ASP脚本语言编写,来谈谈自己的学习体会,希望能给后学者一点建议和启示,更期望引起大家的兴趣来交流探讨、共同提高。
ASP与HTML相比的优点
关于这方面的论述已经很多,这里就不展开讨论了。笔者认为,ASP与HTML相比,其最大的优势在于三个方面:
在创建动态、交互式站点方面,ASP功能强大、处理方式灵活;
由于ASP脚本语言是由服务器端来解释和运行,动态生成普通的HTML页面,然后再传送到客户端供浏览,因而对客户端浏览器要求相对较低,并不要求其必须支持特定的某些脚本语言如JavaScript、JScript、VBScript、Perl等等;
由于传送到客户端的只是解释后的HTML页面,因而有效地保护了页面开发者的知识产权。
搭建学习ASP的应用系统平台
关于这方面的文章也不少,如《计算机世界》1998年第38期Internet&Intranet版的一篇文章"自己搭建ASP集成开发环境"就挺不错,目前笔者还保留有这篇文章,如果需要就发个Mail过来吧。笔者所用的开发平台为Win95+TCP/IP+PWS+ASP+FrontPage98,其中FrongPage不是必须的,可以用其他页面开发工具甚至是NotePad来代替。PWS应该容易获得和安装,在Win95OSR2及其后的版本中都有;而ASP则需要在WinNT的IIS中去找,或在VisualInterdev的安装光盘中去找,实在找不到就到微软的站点上去下载一个。
建立自己的简单ASP页面
所谓ASP页面就是在普通的HTML页面文件中插入一些特殊的脚本语言并以扩展名asp保存后的页面,所以可以很容易地建立一个自己的简单ASP页面,体会一下ASP的入门感觉,同时获得成功的快感以便保持继续学习下去的兴趣。
首先来学习一下ASP脚本语言的简单语法。最基本的是,在与HTML语言混合使用时ASP语句是以"<%"为开始,以"%>"为结束的,而且必须成对出现。另外,由于ASP默认的脚本语言是VBScript(设置其他脚本语言稍后再谈),你还应该熟悉VBScript的基本语法。有了这些,建立一个简单的ASP页面应该是没有问题了。
看看下面的一个页面文件(test1.asp):
<%remtest1.asp%>
<html>
<head>
<title>一个简单的ASP页面</title>
</head>
<body>
<p>
<h1>下面应出现4行语句,
字体大小从4到7</h1>
<%fori=4to7%>
<br><fontsize=<%=i%>>
这行语句的字体大小为
<%=i%></font>
<%next%>
</p>
</body>
</html>
其中,语句<%=i%>是将变量i的值输出到HTML文件中。ASP用"<%=变量名%>"将指定变量的内容输出到其生成的HTML页面中。
由上可见,可以先制作一个普通的HTML页面文件,然后在需要的地方插入ASP脚本语言即可。关键是熟练应用ASP脚本语句。
这个页面虽然简单,却可以帮助熟悉和理解ASP语法。可以用浏览器查看运行效果,再用查看源代码的功能看一下源代码,可以看对ASP页面解释后的HTML文件。注意必须用http的方式访问ASP页面,不能像HTML页面文件那样双击文件名以文件方式浏览。
利用Request对象
制作简单的交互页面
ASP的内建对象Request中包含了访问者的一些申请信息。可以将这些信息作为某些应用(如商业订单信息)对申请者的申请要求作出反馈。
在我们的这个例子中,读者会员资格注册申请页面要求申请者填写其姓名全称、身份证号码、Email地址,在收到读者申请后通知其注册成功。
先制作一个读者会员资格注册申请的页面,可以是HTML页面或ASP页面,这应该不成问题。
<!--apply.htm-->
<html>
<head>
<title>读者会员资格注册申请</title>
</head>
<body>
<H2>读者会员资格注册申请</H2>
<formmethod="post"action="result.asp">
<p>
姓名全称:
<inputname="FullName"SIZE="20"value="姓名全称">
<p>
身份证号码:
<inputname="UniversalID"SIZE="15"
value="888888888888888">
<p>
电子邮箱:
<inputname="Email"value=mailbox@yourcompany.com>
<p><inputtype=submitvalue="提交申请">
<inputtype=resetvalue="重新填写">
</form>
</body>
</html>
在申请页面中,所有的申请数据均填写在Form元素中,并且在Form的Action中指定处理申请的页面为result.asp。当收到申请时,对应项目的数据可以由Request.Form("项目名称")来获得,其中"项目名称"为Form元素的名称,如"姓名全称"对应"FullName","身份证号码"对应"UniversalID"。现在利用这些信息来制作一个注册成功的通知页面Result.asp。
<%remresult.asp%>
<html>
<head>
<title>读者会员资格注册申请成功</title>
</head>
<body>
<palign="center"><H2><fontcolor="green">
读者会员资格注册申请成功</font></H2>
<p>亲爱的<%=Request.Form("FullName")%>
读者:<br>
我们已经收到你的申请,并接受你的申请,
你已经成为我部正式读者会员。<br>
你的读者号为CN<%=Request.Form("UniversalID")%>.
我们将通过你的电子信箱
<%=Request.Form("Email")%><br>
来正式通知你,此后我部举行读者沙龙活动的
时间和地点也将通过该信箱通知你。
</body>
</html>
现在用浏览器打开申请页面,填入对应数据后提交申请,查看反馈效果,再用浏览器的查看源代码的功能看一下源代码,可以看对ASP页面解释后的HTML文件。
通过内建对象
Request获取用户申请信息
可以从ASP的内建对象Request获取用户通过HTTP传送过来的申请信息,如客户认证、Cookies数据、Post信息、查询参数、服务器环境信息等。这些可以分别从对象Request的集合属性ClientCertificate、Cookies、Form、
QueryString、ServerVariables中获取,获取方式为Request.CollectionName(ItemString),其中CollectionName为集合属性名称即ClientCertificate、
Form、QueryString、ServerVariables中的一个,ItemString为要获取的项目的名称。如果可以确定没有重复的项目名称,也可以直接以Request(ItemString)来获取用户信息,而不用指明集合属性名称。例如请求页面中有一个Form元素CustomerID,且没有其他元素名称为CustomerID,则用Request.Form("CustomerID")与用Request.("CustomerID")具有同样的效果。
1.用Request.Form获取表格信息
ASP页面可以从一个HTML中获取表格信息,只要将该表格的Action指定为对应的ASP页面即可。可以参见前面列举的读者会员资格申请的例子,在该例子中,result.asp从一个HTML中获取表格信息并提供反馈信息。
2.用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。
3.用Request.ServerVariables获取服务器环境信息
Request.ServerVariables包含了请求HTTP服务的服务器的环境变量信息。由于应用较少,现列出常用的两个:
Request.ServerVariables("SERVER_PORT"):HTTP服务端口号,一般为80;
Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"):服务器采用的语言,"en"表示英文,"zhcn"表示简体中文。
4.用Request.Cookies获取用户的Cookies信息
Cookies可以在服务器和客户端之间双向传递,它记录了特定用户的某些信息。利用Request.Cookies可以获取用户的Cookies信息。
例如请求用户的Cookies为Product=Floppy,则Request.Cookies("Product")的值为"Floppy"。
通过内建对象Response
向用户发送信息
可以利用ASP的内建对象Response很灵活地控制向客户端发送信息的内容和方式。例如可以自动转向另一个URL页面,可以改变页面脚本的解释方法,可以设置客户的Cookie等等。
1.利用Response.Write控制发送的信息内容
方法Response.Write可以向发往客户端浏览器的HTML文件中直接输出内容。这一点与利用主脚本的<%=变量名%>功能基本相同,但Response.Write的使用更为灵活,这体现在它作为一个方法函数,可以在非主要脚本的函数中直接使用,即可以出现在之间向客户输出内容,这一点是<%=变量名%>无法做到的。
在下面的例子中,selecolr.asp要求用户输入一个颜色名称,用户确认后将用户申请发往同一个页面selecolr.asp,然后用用户指定的颜色将颜色名称显示出来。
<%remselecolr.asp%>
<html>
<head>
<title>选择颜色</title>
</head>
<body>
<%
ifisEmpty(Request.Form("ColorName"))then
Response.write"<H4>你只需选择颜色名称,
我来显示</H4>"
else
Response.write"<H2>你选择的颜色是
<fontcolor="&Request.Form("ColorName")&"> |
|
"&Request.Form("ColorName")&"</font></H2>"
endif
%>
<formmethod="post"action="selecolr.asp">
<p>
颜色名称:<inputname="ColorName"value="black">
<p><inputtype=submitvalue="显示吧">
<inputtype=resetvalue="想重选">
</form>
</body>
</html>
2.利用Response.Redirect进行URL页面重新定位
假如由于业务上的原因,你的站点的域名或IP地址发生了变化,老顾客在用原来的域名访问时,可以用Response.Redirect直接将其引导到新的站点上去。另外,假如要求用户在访问某页面前必须先访问另外一个页面,也可用Response.Redirect直接将其引导到应该去的页面上去,而不是发出用户无权访问该页面的信息。
值得注意的是,必须在向客户端发送任何信息之前使用Redirect,否则会引起错误。
在下面的例子中,如果用户调用本页面,则将其引导到另一个页面selecolr.asp。
<%remredirect.asp%>
<%Response.redirect"selecolr.asp"%>
<html>
<head>
<title>重新定向</title>
</head>
<body>
<p>你不可能进入到本页面,
否则就是我的失败。
</body>
</html>
3.利用Response.ContentType页面内容解释方法
在HTML页面代码中,经常会看见下面一个句子:
它用于指定HTML页面被浏览器解释的方式。当content="text/html"时,浏览器将代码解释为普通HTML页面并显示给用户;当content="text/plain"时,浏览器将代码不加任何解释地显示给用户。当未指定时,ContentType默认为"text/html"。
在ASP页面中,Response.ContentType的作用与普通HTML相同,只不过它针对的对象是客户端浏览器而不是用户。
4.利用Response.Cookies设置客户端Cookies
通过设置Response.Cookies可以增加或修改客户端的Cookies,其设置方法与取得对应Cookie值的方法相同。
在下面的例子中,cookie.asp用来设置一个名称为wfj的Cookie的值,调用时将显示上次设置的Cookie(wfj)的值。由于设置Cookie值要在发送内容之前,所以这里将Response.Buffer设置为true(其原因见后面Response.Buffer的说明)。
<%remcookie.asp%>
<%Response.Buffer=true%>
<html>
<head>
<title>Cookie设置</title>
</head>
<body>
<%
Response.Write"<p>原来的Cookie(wfj)=
"&Request.Cookies("wfj")
ifnotisEmpty(Request.Form("CookieValue"))then
Response.Cookies("wfj")=
Request.Form("CookieValue")
Response.Write"<p>Cookie(wfj)
已经设置为"&Request.Form("CookieValue")
Response.Write"<p>
下次调用时你会看到的"
endif
Response.write"<p><hr>
<H4>你只需设置Cookie,
我来显示</H4>"
%>
<formmethod="post"action="cookie.asp">
<p>
Cookie设置:
<inputname="CookieValue"value="wangfajun">
<p><inputtype=submitvalue="设置吧">
<inputtype=resetvalue="想重选">
</form>
</body>
</html>
5.利用Response.Buffer控制页面发送进度
Response.Buffer的默认值为False,在这种情况下,服务器在处理对ASP页面的请求时,采用边处理边发送反馈的方式,即在处理完一部分脚本后即向客户端发送反馈,这样在处理耗时较长的ASP页面时,用户不用等待很长时间就可以得到反馈,在用户浏览的同时服务器继续处理和发送反馈信息。当Response.Buffer为True时,服务器在处理对ASP页面的请求时使用缓冲技术,在页面所有的脚本处理结束后才将处理结果传送给客户端,这样在处理耗时较长的ASP页面时,用户需要等待较长的时间,而服务器端则可减少与客户端连接的次数而提高整体响应速度,并可以在满足某种条件时撤消已经处理的结果而不会出现响应完成一部分就停止的状况。
多种脚本语言混合编程
在同一个ASP页面中,可以同时使用多种脚本语言,充分利用各个脚本语言的功能优势。但必须指定一个主要脚本语言,若没有指定则默认为VBScript。要在一个ASP页面中指定其他脚本语言为主要脚本语言,必须在该页面的第一行指定,方法如下:
<%@Language=LanguageName%>
例如要将JScript指定为某页面的主要脚本语言,则须在该页面第一行加入:
<%@Language=JScript%>若没有指定,则相当于:
<%@Language=VBScript%>
除了主要脚本语言外,还可在页面的局部采用其他脚本语言来实现特定的功能。此时要用<Script>来实现,具体方法如下:
<ScriptLanguage=LanguageNameRunAt=Server>
....
功能实现部分
....
</Script>
其中,LanguageName为脚本语言名称,可以是VBScript、JScript、Perl等服务器上已安装了解释引擎的脚本语言;Runat=Server指定该段脚本在服务器运行,以区别在客户端浏览器运行,因为默认是在客户端浏览器运行,所以该设置不能省略,否则对应的脚本将发送到客户端让浏览器解释运行。
在ASP页面中,一般每种脚本完成一个完整的功能,然后用主要脚本语言进行调用,调用方法为<%CallFunction%>。
用<Script>方式编写服务器端脚本时应注意:
脚本语句必须作为某个函数的一部分出现,而不能单独出现在函数体之外;
不能使用输出语句,如<%=变量名%>向生成的HTML页面输出;
编写函数时不可再用<!---->来屏蔽,因为服务器必须能解释脚本,否则会引起错误。
多种脚本语言混合使用时应注意,要使用某种脚本语言,必须首先在服务器上安装对应的脚本语言解释器。在ASP中已经内置了VBScript和JScript两种脚本语言解释器,但其他脚本语言则必须安装后才能使用。
下面是一个VBScript和JScript两种脚本混合使用的例子。
<html>
<head>
<title>用户账号</title>
</head>
<ScriptLanguage=VBScriptRunAt=Server>
SubVBSQuery
fori=1toRequest.QueryString("CustomerID").count
Response.Write"<p>第"&i&"个用户账号:
"&Request.QueryString("CustomerID")(i)
next
EndSub
</Script>
<SCRIPTLANGUAGE=JScriptRUNAT=Server>
functionJSQuery()
{
vari;
for(i=1;i<=Request.QueryString
("CustomerID").count;i++)
Response.Write("<p>第"+i+"个用户账号:
"+Request.QueryString("CustomerID")(i));
}
</Script>
<body>
<H2>VBScript:您指定的客户账号如下</H2>
<%CallVBSQuery%>
<H2>JScript:您指定的客户账号如下</H2>
<%CallJSQuery%>
<H2>主脚本:您指定的客户账号如下</H2>
<%fori=1toRequest.QueryString("CustomerID").count%>
<p>第<%=i%>个用户账号:
<%=Request.QueryString("CustomerID")(i)%>
<%next%>
</body>
</html>
服务器端脚本和
客户端脚本混合编程
当使用<script></script>编写一段脚本程序时,如果没有指定Runat=Server,则认为其中的脚本程序在客户端执行,此时可以在程序中混合使用服务器端主要脚本和客户端脚本,这样就可以根据客户端的请求灵活地控制客户端脚本的执行,使对客户的反馈更具有个性化。在混合使用时,服务器端脚本要以<%%>的形式嵌入,以示区别。
增加注释
在编程时添加注释是一个好的习惯。ASP允许在页面代码中添加注释。具体的注释方法可参见各脚本语言的规则规定,如VBScript的注释符号为Rem或单引号"''''",JScript的注释符号为双斜杠"//"。有一点要注意,就是在HTML输出语句中不能添加注释,如<p>当前时间为<%=now''''在HTML输出当前时间%>即是无效的。
利用Include来
实现功能模块化
可以将常用的功能函数存于一个ASP文件,在其他ASP页中要用到其中的功能时,将包含函数的ASP文件包含在调用函数的ASP文件中,这时可使用Include语句。具体语法为:
<!--#includefile="AspFileName"-->或<!--#includeVirtual="AspFileName"-->。
使用时应该注意:
<!--includefile>用于被包含的ASP文件的文件名为普通文件名,其中文件所在的目录为实际目录;而<!--includevirtual>用于被包含的ASP文件的文件名为虚拟文件名,其中文件所在的目录为虚拟目录。
被包含文件的文件名称不能使用ASP脚本变量,因为包含语句是先于脚本语句被解释和执行的。如下面语句即为无效的:
<%fori=1to4
AspFileName="\aspsamp\Asp"&i&".asp"
%>
<!--includefile=AspFileName-->
<%next%>
应避免自包含,即File1包含File1。在多个文件中有包含语句时,应避免间接自包含即循环包含,如File1包含File2,File2包含File3,File3包含File1。
被包含的脚本语言的类型必须是默认语言类型,即必须是主文件<%@language%>语句中指定的脚本语言类型,被包含文件中不能使用<%@language%>语句。
可以使用"../"来表示相对路径。此时应保证服务器端EnableParentPaths设置为1,当然在Win95上无法设置了。
以上是学习和使用ASP创建动态、交互式站点的一些入门知识,有了这些基础知识,就可以发挥以前自己积累的编程经验,自己动手学习和探索用ASP创建动态、交互式站点的高级应用了。
深圳华讯公司--王发军
(作者Email:wangfajun@163.net)
《计算机世界》99年第8期3月8日
文章版权或来源:梦幻时空 |