用Active Service Pages创建强大的Web应用程序
作者:华彬彬 来源:未知 添加时间:2006-5-21 10:31:48人们对于Web的要求越来越高,不再只是满足于HTML所提供的简单的静态页面,而是需要灵活的动态页面。如果利用传统的公共网关接口CGI(Common Gateway Interface)来实现动态页面则不仅开发困难,而且CGI对每一个HTTP请求都将激活一个相应进程,由此造成程序挤占系统资源,降低效率,在出现大量并发请求时更是力不从心。ISAPI或NSAPI相对于CGI在效率上有了很大提高,它通过利用DLL(动态链接库)技术提高了性能和速度,但因为需要考虑线程同步问题所以开发起来比较麻烦。而Java的执行效率较低,开发也比较困难。至于完全的客户端VBScript和JavaScript以及IDC(Internet Database Connector)则功能有限,不能满足较高的要求。
微软的Active Server Pages(支持Active技术的服务器页,简称ASP)是一种应用程序环境,它使开发者可以使用几乎所有开发工具来组合HTML代码,这些脚本可以利用本地服务器或远程服务器上运行的组件来存取数据库、应用程序或处理信息。因此,可利用ASP来直观、简易地实现强大的Web应用程序。
一、ASP的优点
ASP具有以下几个优点:
1. 开放性
在IIS 3.0上,并不需要开发者使用一个专有的脚本语言来生成网络应用程序,实际上Active Server Pages包括了对VBScript和JavaScript/Jscript的本机支持。通过第三方组合组件,它还可以使用其他语言(如Perl、REXX和Tcl)。多个脚本语言甚至可以在相同的ASP文件中交替使用并相互调用。而ActiveX Server组件实际上可以用任何语言编写,这些语言包括Java、Visual Basic、C++、COBOL等等。
2. 易操作性
ASP使HTML设计人员可以在服务器上方便地“激活”他们的Web页,可以立刻对定制化网页和简单的应用程序进行开发。以往需要用Perl或C编写的复杂的CGI程序来完成的功能(如数据库连接),现在若使用ASP则只要几行简单的代码就能实现。
3. 程序与外观分离
通过使用脚本和组件,Active Server Pages允许用户将编程工作与一个网页的设计和其他工作分离开来。这就可以确保开发者能够将主要的精力用来考虑编写程序的逻辑,而不必担心外观是怎样的。同时,它也使那些从事外观设计的人员可以利用一些工具来对网页进行修改,而不用过于关心编程问题。
4. 非手工编译
ASP的即时编译系统在被请求时自动对ASP源文件重新编译,并将其载入服务器的高速缓存中。因此,开发者对ASP文件的修改可在浏览器中立即得到反映,只需要简单地保存该文件并在浏览器中刷新即可。
5. 浏览器独立性
ASP提供了一种浏览器中枢方案来完成应用程序的设计工作。因为用于生成动态内容的脚本可以在服务器上执行,所以开发者不必担心客户用什么浏览器来浏览网点。
二、ASP基础知识
对开发者来说,要想熟练掌握ASP,则还需要了解以下三个方面的知识:Active Scripting(Active脚本编程)、内建对象和基本组件。
1. Active Scripting
Active Scripting就是用VBScript、JavaScript/JScript和Perl等脚本语言并遵照ASP的语法规则编写出的程序,这并不复杂,只需要使用“<%”和“%>”这两个界定符即可。例如,<% UserName="Rick" %>是一条赋值语句。如果想向浏览器输出表达式,则可以使用“<% =”和“%>”。例如,<% = UserName %>将在浏览器上显示“Rick”这两个字。
完整的源代码(包括HTML代码)如下:
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<% UserName = "Rick" %>
用户名:<% = UserName %>
</BODY>
</HTML>
用任何一种无格式的文本编辑工具(如Notepad)或专用ASP开发工具Visual InterDev等将上述代码写入,并保存为扩展名是.asp的文件(例如demo.asp),再将其放在Web Server上有执行权限的目录下,就可以访问了。注意:现在只有IIS 3.0 on Windows NT Server、Peer Web Server v3.0 on NT Workstation和Personal Web Server on Windows 95支持ASP,并且在这三种Web Server上还需要安装Active Pages Server。
假设Web Server名为demo,asp是demo上一个有执行权限的虚拟目录。若在浏览器地址栏中调用http://demo/asp/demo.asp,则可以看到如图1所示的效果。
(21601.jpg)
图1
由此可见,<%和%>之间的语句是由Active Page Server负责解释执行的,你可以使用<%@ LANGUAGE=“VBSCRIPT” %>语句来指定脚本的解释引擎为VBScript引擎,也可以指定为JavaScript/Jscript或Perl以及其他第三方脚本解释引擎。
2. ASP内建对象
ASP包括许多内置的服务器和应用程序构建对象。这些对象使开发者可以摆脱很多烦琐的工作,如存取来自客户方请求的细节、管理应用程序状态和调配请求等。这些内建对象包括:
(1)Request和Response。Request对象提供了对任何由HTTP请求而转入脚本的信息的存取,其中包括窗体、表格、URL查询和HTTP域名等有关信息。Response对象可用来构建对信息的反馈,其中包括网页截止时间和HTTP输出流的全控件。
(2)Application和Session。这些对象用来简化状态处理。Application对象被用于存储一个特定应用程序所需的信息,而Session对象被用于存储一个特定用户任务所需的信息。这是ASP的一个非常有用的特性,可以用来解决令许多Webmaster头疼的问题。利用Application对象,用户可以对Web应用程序的属性进行设置,以便在众多用户中实现信息共享。此外,它还有LOCK(加锁)和UNLOCK(解锁)方法,用来确保多个用户不会同时修改一个属性。利用Session对象,只要用户在同一任务中,如在Web应用程序中的页之间跳转时,则存储在Session对象中的变量始终有效;只有当任务被截止或者被放弃时,服务器才毁坏这一任务对应的Session对象。Session对象最常见的用途之一就是用来存储已登录用户的权限信息,这样就可以方便地解决Web应用程序的安全问题。
(3)Server。Server对象允许脚本来生成Active Server组件的实例,并且利用新的功能进行对ASP环境的扩展。Server对象拥有两个重要方法,即MapPath和CreatObject。MapPath可用来将Web Server的虚拟路径还原成实际路径;CreatObject可能是最重要的一个方法,用它可产生服务器组件的对象实例。详细介绍请参见下文。
3. ASP基本组件
ASP组件,以前被称为OLE自动服务器(OLE Automation Servers),现在经过设计后可以作为一个网络应用程序的一部分在用户的网络服务器上运行。这些组件允许用户在内部对其脚本进行功能扩展,系统对这些扩展的功能进行保密。ASP组件可以构建在由Microsoft公司建立的公认的公约标准上,也可以直接使用ASP自带的基本组件,如ActiveX数据对象(ADO)组件、内容链接组件、文件系统组件、浏览器功能性组件和广告转子组件。
(1)ActiveX 数据对象(ADO)组件。ADO是最重要的一个组件,它提供了与任何ODBC兼容数据库或OLE DB数据源的高性能连接。ADO允许网络开发者方便地将一个数据库与一个“激活”的网页相连接,以便存取和操作数据。这就使得开发者能够为网络开发出一个新型的、由数据库驱动的Web应用程序,并可以在一个系统上设置一个网络“前端处理器”。一个使用ADO的ASP文件可以动态地从某个数据库中请求信息。例如,在对一个交易数据库进行修改后,可以立刻给每个股民以相应的反馈信息,而不必改动HTML代码。
(2)内容链接组件。内容链接组件管理一个URL表,这样用户就可以像看书一样在网点上方便地对URL进行访问。用户可以使用内容链接组件的功能来自动生成以及更新内容表并导航性地与前后的Web页进行链接。这对于像联机报纸和论坛信息表等应用程序来说是理想的模式。内容链接组件参照一个内容链接表文件,此文件包含了链接Web页的列表。这个列表被存储在网络服务器上。对一个网页“流”可以动态地管理和重排,而不会破坏链接。增加、删除或移动网页则要求在列表文件中对页序进行调整。用户不必在单个网页上对HTML文件进行编辑。
(3)文件系统组件。文件系统组件提供了一种存取方式,以完成对存储在服务器上文本文件的存取工作。通过这种方式,开发者无需编写自己的代码即可在文件系统上打开或关闭文件,因为大多数脚本语言不允许直接存取文件,所以这种方法非常有用。
(4)浏览器功能性组件。通过使用浏览器功能性组件,一个ASP文件可以对客户使用的浏览器的功能性进行组织,并动态地完成布局和内容的优化。这就确保了Webmaster不必再为每个浏览器生成一系列重复的网页。例如,微软自己的网点上有一个针对支持ActiveX的浏览器的视窗、一个针对图文框浏览器和一个不支持图文框浏览器的视窗。ASP文件控制定制操作,因此只存在内容的一个拷贝。
(5)广告转子组件。想在自己的页面上加入可以方便地变幻的广告部分吗?广告转子组件可以让你轻松地做到这一点,它通过对不同图像的广播时间转子进行管理来完成对不同广告和通告显示过程的简化。它构成一个不同广告的列表来安排显示优先权的相对比例。每次对ASP文件进行一次请求后,可以通过使用组件并基于当前的标准来显示一个广告。
要调用服务器上的基本组件,必须先利用前面介绍的Server对象中的方法CreatObject产生服务器组件对象实例:
Server.CreatObject(ProgID)
其中ProgID指定了构件标识。构件可以是EXE程序,也可以是DLL动态链接库。这些程序必须在操作系统中注册后,COM才会在系统资料库(Registry)中维护这些信息。上述5个基本组件在安装ASP时已经注册,你也可以用VB或VC方便地开发自己的构件,然后用regsvr32进行登记。登记完毕之后,就可以调用这些构件了。使用Server构件的程序片段如下所示:
’产生构件
Set Obj = Server.CreatObject
’使用它的方法
Obj.Method
具体实例参见“ASP编程示例”部分。
三、ASP编程示例
ASP功能强大,尤其是其方便的数据库连接能力格外引人注目。利用ADO,只需寥寥数行代码就可以写出非常好的Web数据库应用程序。下面这个示例是一个系统用户管理程序,首先用户进行登录,通过与数据库中的数据进行比较,确认其是否有权登录:如果有权进行登录,则可进入授权页面,否则需要再次登录。图2是系统登录页面示意图。
(21602.jpg)
图2
以下是该页面的源代码,文件名为login.asp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312">
<title>系统登录</title>
</head>
<body>
<p>系统登录 <%if request.querystring("log")="true" then%>
<script language="JavaScript"><!--
alert("用户名或口令不对,请注意大小写!!");
// --></script>
<%end if%>
<%if request.querystring("logsuccess")<>"true" then%> </p>
<form action="license.asp" method="POST" name="login">
<p>用户名:<input type="text" size="20" name="userid"></p>
<p>密 码:<input type="password" size="20" name="password"></p>
<p><input type="submit" name="登录" value="登 录"> </p>
</form>
<%end if%>
</body>
</html>
login.asp向license.asp这个文件发出验证请求,由license.asp查询数据库,确定登录者权限,由于ADO是通过ODBC访问任何可以支持ODBC的数据库,所以要在服务器上设定一个ODBC数据源userpermission,由userpermission访问数据库userinfo中的表user,user包括3项:user_id、user_passwd和user_permission。
license.asp源文件的内容如下:
<%
'从发请求页面接收参数
userid=request.form("userid")
password=request.form("password")
'生成ADO组件实例
set conn=server.CreateObject("ADODB.Connection")
'连接数据库,数据源userpermission,登录者名Admin,口令为空
conn.Open "userpermission","Admin",""
'指定SQL语句,从表user中提取数据
sql="select count(*) as userno from user where user_id='"&userid&"' and
user_passwd='"&password&"'"
'执行查询
set rs=conn.Execute(sql)
'检查是否有此用户,如果没有则返回登录页面
if rs("userno")=0 then
rs.close
conn.close
response.Redirect("login.asp?logsuccess=false&log=true")
else
'如果有此用户,则给予授权
rs.close
sql1="select * from user where user_id='"&userid&"' anduser_passwd='"&password&"'"
set rs1=conn.Execute(sql1)
session("logflag")="true"
session("userid")=userid
session("password")=rs1("user_passwd")
session("user_permission")=rs1("user_permission")
rs1.close
conn.close
’有授权,转往demo.asp
response.Redirect("demo.asp")
end if
%>
通过身份验证,访问者进入demo.asp页面,效果如图3所示(以用户Rick身份登录)。
(21603.jpg)
图3
下面给出了demo.asp的源代码。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<%@ LANGUAGE="VBSCRIPT" %>
<%
’根据session变量检查授权
if session("logflag")<>"true" then
response.Redirect("login.asp?logsuccess=false&log=true")
else
%>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" content="text/html; charset=gb_2312-80">
<title>ASP演示</title>
</head>
<body>
<p align="center"><big><big><big><big><big><big>欢迎你<%= session("userid")%> </big></big></big></big></big></big></p>
<p align="center"><big><big><big>你已通过身份检查,现在可以进行授权访问</big></big></big></p>
</body>
</html>
(北京理工大学计算机科学工程系 100081 余 波 创联通信网络有限公司 华彬彬)
站内搜索