在 ASP 网页中使用 Microsoft® 组件对象模型 (COM) 组件可以极大地扩展 ASP 的已有功能。COM 组件是已编译的代码段,可以从 ASP 网页进行调用。COM 组件是安全、简洁的对象,可以复用,它被编译为 DLL,可以用 Microsoft Visual C++®、Microsoft Visual Basic® 或其他任何支持 COM 的语言编写。例如,Microsoft ActiveX® 数据对象 (ADO)(本教程的单元 1 中已经使用过)提供的方法和属性可以高效地查询数据库。通过使用 ADO,您不必自己编写复杂的数据访问代码,因为 ADO 对象是使用 COM 组件建立的。
在本单元中,您可以同时使用 COM 组件和 ASP,此外,您也可以编写自己的组件。本单元将展示如何开发能够为电子商务提供有用服务的 ASP 网页,其中包括下列教程:
广告是网站的重要业务。本教程说明了如何使用与 IIS 一起安装的 Ad Rotator 组件在网页上轮换广告。Ad Rotator 组件在每次用户加载或刷新网页时为网页选择一个广告。另外,如果您需要更改广告,则只需要在重定向和轮换计划文件中更改此广告即可,而不必修改包含此广告的所有 ASP 文件。如果此广告出现在网站中的许多网页上,这样就可以节省开发时间。
建立 Ad Rotator 组件需要两个文件:重定向文件(包含指向广告的 URL 链接)以及轮换计划文件(包含显示数据)。通过建立这两个文件,网站上的任何 ASP 网页都可调用 Ad Rotator 组件。
在本教程中,您将执行下列任务:
轮换计划文件用于为要显示的广告编录信息,这些信息包括单击广告后的重定向信息、要显示的广告的大小、要显示的图象、广告的注释,以及表明特定广告被选中的频率的数字。在 ASP 网页中调用 Ad Rotator 组件的方法时,组件会使用此文件来选择要显示的广告。
轮换计划文件用星号 (*) 分成两节。第一节提供了所有广告的公共信息,第二节则列出了每个广告的特定数据。若要测试轮换计划文件,您可以使用 Microsoft.com 上的一些图像作为广告图像。下列列表概述了轮换计划文件的结构:
您需要为每个广告提供下列信息:
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 MyAdRot.txt。
REDIRECT AdRotRedirect.asp
WIDTH 250
HEIGHT 60
BORDER 0
*
http://www.microsoft.com/windows/images/bnrWinfam.gif
http://www.microsoft.com/windows
Microsoft Windows
2
http://www.microsoft.com/office/images/office_logo.gif
http://www.microsoft.com/office
Office 2000
3
用户单击广告时,用 ASP 编写的 Ad Rotator 重定向文件可以在显示广告之前,捕获某些信息,并将这些信息写入一个文件。
要使其生效,x:\InetPub\Wwwroot\Tutorial 文件夹必须为 IUSR_ComputerName 和 IWAM_ComputerName 帐号授予读/写的访问权限。您也可以使用本教程单元 1 第 3 课中的代码将此信息写入一个 Microsoft Access 数据库。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 AdRotRedirect.asp。
<%@ Language=VBScript %>
<html>
<head>
<title>AdRotRedirect file</title>
</head>
<body>
<%
'创建一些变量。
dim strLogFile
'获取 Web 目录的物理路径,这样我们就可以知道此路径确实存在。
'ASP Server 对象有许多有用的方法。
strLogFile = Server.MapPath(".")&
"\AdRotLog.txt"
'设置一些用于处理文件的常量。
Const cForAppending = 8
Const
cTristateUseDefault = -2
'创建一个 FileSystemObject 对象,
'此对象使您能够对系统中的文件和文件夹进行访问。
Set fsoObject =
Server.CreateObject("Scripting.FileSystemObject")
'打开指向此文件的句柄。
'True 表示如果此文件不存在,则创建此文件。
Set tsObject =
fsoObject.OpenTextFile(strLogFile, cForAppending, True)
'记录刚刚单击广告的用户的数据。
'我们已经使用过 ASP Request 对象的 Write 方法。
'ASP Request 对象的 ServerVariables 集合可以保存
'向 Web 服务器发出的每个请求的大量有关数据。
tsObject.WriteLine "--------------------"
tsObject.WriteLine
Date & ", " & Time
tsObject.WriteLine
Request.ServerVariables("LOGON_USER")
tsObject.WriteLine
Request.ServerVariables("REMOTE_ADDR")
tsObject.WriteLine
Request.QueryString("url")
tsObject.WriteLine
Request.ServerVariables("HTTP_REFERER")
tsObject.WriteLine
Request.ServerVariables("HTTP_USER_AGENT")
tsObject.Close
'使用 ASP Response 对象的 Redirect 方法
'重定向到广告客户的网站。
'AdRotator 组件调用 AdRotRedirect.asp 时,
'会自动将广告客户的 URL 传入到 QueryString 中。
Response.Redirect Request.QueryString("url")
%>
</body>
</html>
包含文件可以存储那些要用于多个 ASP 或 HTML 文件的代码。将 Ad Rotator 代码放入包含文件中的一个简单函数将非常有用。利用 Ad Rotator 包含文件,您在希望显示一个广告时,只需要从任何 ASP 或 HTML 文件进行一次函数调用即可。您也可以将包含文件中的代码放入每一个要显示广告的 ASP 文件中。但是,这种情况下,如果需要修改此代码,就必须修改每一个 ASP 文件,而不是仅仅在一个包含文件中进行修改。
在本示例中,您将创建一个 Ad Rotator 包含文件,其中包含一个函数,名为 GetAd。此函数随机选择将显示在 ASP 网页上的广告。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 AdRotatorLogic.inc。
<%
Function GetAd()
dim objLoad
'创建一个 AdRotator 组件的实例。
Set
objLoad = Server.CreateObject("MSWC.AdRotator")
'设置 TargetFrame 属性(如果有)。如果网页使用框架,
'将在这个框架中打开此 URL。
'如果 HTML 网页没有找到这个 TARGET 名称,
'则将在新窗口中打开此 URL。
objLoad.TargetFrame = "TARGET=new"
'设置一个其他的 AdRotator 属性。
objLoad.Border = 1
'从文本文件获取随机广告。
GetAd = objLoad.GetAdvertisement("MyAdRot.txt")
End
Function
%>
若要测试建立在 Ad Rotator 组件基础之上的应用程序,您需要一个 ASP 网页用来调用所创建的 Ad Rotator 包含文件中的函数。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 DisplayAds.asp。通过在浏览器地址栏中键入 http://localhost/Tutorial/DisplayAds.asp,可以在浏览器中查看此示例的效果。
<%@ Language=VBScript %>
<html>
<head>
<title>显示一个广告</title>
</head>
<body>
<font
face="MS Gothic">
<h2>显示一个广告</h2>
<comment>包括您创建的文件以获取广告。</comment>
<!--#include File =
"AdRotatorLogic.inc" -->
<comment>调用包含文件中的函数。</comment>
<%=GetAd()%>
</font>
</body>
</html>
在浏览器中,您应该看到下列结果:
显示一个广告
在浏览器中单击“刷新”按钮大约 20 次,观察广告的变化。单击此广告,看看 AdRotRedirect.asp 如何将您重定向到广告用户的网站。打开 AdRotLog.txt 查看单击广告时记录的信息。
了解人们请求(或点击)网页的次数可能会对您很有帮助。高流量的站点可以为您带来更多的广告收入。一些网站使用此数据按单次点击向广告用户收取统一的费用。流量信息也可说明用户在站点中浏览导航的方式,告诉您应当将广告置于何处。至于那些几乎从不被人点击的网页,说明需要对其设计进行修改。
PageCounter 组件使用一个内部对象在服务器上记录网页的点击数。PageCounter 定期将所有信息保存在一个文本文件中,这样就不会因断电或系统故障而丢失任何统计数据。PageCounter 组件使用如下三种方法:
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 PageCounter.asp。通过在浏览器的地址栏中键入 http://localhost/Tutorial/PageCounter.asp,可以在浏览器中查看此示例的效果。
<%@ Language=VBScript %>
<html>
<head>
<title>网页计数器示例</title>
</head>
<body>
<font face="MS
Gothic">
<H3>网页计数器示例</H3>
<p>
<FORM NAME="PageCounter" METHOD="GET"
ACTION="PageCounter.asp">
<INPUT TYPE="CHECKBOX" NAME="reset"
VALUE="True">是否要重新设置此网页的计数器?<BR>
<INPUT
TYPE="SUBMIT" VALUE="提交">
</FORM>
</p>
<%
'设置 PageCounter 对象的实例。
Set MyPageCounter = Server.CreateObject("MSWC.PageCounter")
'增加此网页的计数器值。
MyPageCounter.PageHit
If Request.QueryString("reset") =
"True" Then
'重新设置此网页的计数器。
MyPageCounter.Reset("/Tutorial/PageCounter.asp")
End If
%>
此网页的点击数为
<%=MyPageCounter.Hits %><BR>
</font>
</body>
</html>
在浏览器中,您应该看到下列结果:
此网页的点击数为 1 网页计数器示例
单击浏览器中的“刷新”按钮或网页上的“提交”按钮,观察点击计数器值的增加过程。如果需要重新设置计数器,请选中以上复选框。
在本课中,您将使用 Visual Basic 创建简单的 COM 对象,此对象可以从 ASP 网页中进行调用。本示例需要 Visual Basic 带有 ActiveX 向导,64 位的平台不支持本示例,除非此 Visual Basic Runtime 是为 64 位平台开发的。您可以创建运行在 64 位平台上的 32 位 COM 对象,但必须从 32 位应用程序调用这个 32 位 COM 对象。因为 IIS 是 64 位平台上的 64 位应用程序,它无法调用 32 位对象。
假定您需要创建一个 Web 应用程序,而此应用程序需要的功能 VBScript 却不具备。此时,必须创建一个自定义过程,并且需要时能从应用程序中的任何 ASP 网页进行调用。
通常,这种解决方案对于封装自定义功能是足够的。然而,您可能要创建一个为数千用户提供服务的 Web 应用程序,而您的过程封装了不希望其他人看到的私有函数。此时,将功能封装为 COM 组件的形式应当是首选方案。组件提供的安全性和性能比脚本更高,因为它们是已编译的代码。组件还允许您使用由 Visual Basic、C++、Java 或其他兼容 COM 的语言提供的功能。
Visual Basic 的 ActiveX DLL 向导是创建 COM 组件最简便的方法。您也可以使用 Microsoft Visual C++ 创建 COM 组件,方法是通过 Active Template Library (ATL) 或自己编写全部代码,本示例使用 Visual Basic。
在本课程中,您将学习如何创建一个 Visual Basic 函数,并将其封装为组件。Visual Basic 包含许多不能用于 VBScript 的财务函数。本示例根据固定的利率以及定期、固定的付款来计算一笔投资的未来价值。
Option Explicit
'声明将由 Property 函数设置的全局变量。
Dim
gAnnualIntRate As Double
Dim gNumPayPeriods As Integer
Dim gPayment As
Double
Dim gPresentSavings As Variant '可选
Dim gWhenDue As Variant
'可选
Public Function CalcFutureValue() As Double
'用户在 ASP 网页中设置属性时,
'也就设置了要传递给 FV 函数的全局变量。
'如果想避免使用属性,
'可以将变量传递给 CalcFutureValue() 函数。
'CalcFutureValue 将成为组件中的一种方法。
Dim IntRatePerPeriod As Double
Dim
FullFutureValue As Double
If (gAnnualIntRate = Null) Or
(gNumPayPeriods = Null) Or (gPayment = Null) Then
CalcFutureValue = 0
Else
IntRatePerPeriod =
gAnnualIntRate / 100 / 12
FullFutureValue =
FV(IntRatePerPeriod, gNumPayPeriods, gPayment, gPresentSavings,
gWhenDue)
CalcFutureValue = Round(FullFutureValue,
2)
End If
End Function
Public Property Get
AnnualIntRate() As Double
'Get 函数以类似属性的形式
'返回全局变量的值。
'在 ASP 网页中,可以表述为 x = oASPTut.Rate。
AnnualIntRate =
gAnnualIntRate
End Property
Public Property Let AnnualIntRate(ByVal
vAnnualIntRate As Double)
'Let 函数在 ASP 网页进行调用(例如 oASPTut.Rate = 5)时
'设置全局变量
gAnnualIntRate = vAnnualIntRate
End Property
Public Property Get
NumPayPeriods() As Integer
NumPayPeriods = gNumPayPeriods
End
Property
Public Property Let NumPayPeriods(ByVal vNumPayPeriods As
Integer)
gNumPayPeriods = vNumPayPeriods
End
Property
Public Property Get Payment() As Double
Payment =
gPayment
End Property
Public Property Let Payment(ByVal vPayment As
Double)
gPayment = -(vPayment)
End Property
Public
Property Get PresentSavings() As Variant
PresentSavings =
gPresentSavings
End Property
Public Property Let
PresentSavings(ByVal vPresentSavings As Variant)
gPresentSavings =
-(vPresentSavings)
End Property
Public Property Get WhenDue() As
Variant
WhenDue = gWhenDue
End Property
Public Property
Let WhenDue(ByVal vWhenDue As Variant)
gWhenDue = vWhenDue
End
Property
本示例中的 ASP 网页使用表单读取用户数据,创建一个对象实例,并计算储蓄计划的未来价值。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 CalculateFutureValue.asp。通过在浏览器的地址栏中键入 http://localhost/Tutorial/CalculateFutureValue.asp,可以在浏览器中查看此示例的效果。
<%@ Language=VBScript %>
<%
Response.Expires = 0
Payment = Request.Form("Payment")
AnnualIntRate = Request.Form("AnnualIntRate")
NumPayPeriods =
Request.Form("NumPayPeriods")
WhenDue =
Request.Form("WhenDue")
PresentSavings =
Request.Form("PresentSavings")
%>
<HTML>
<HEAD><TITLE>计算未来价值</TITLE></HEAD>
<BODY>
<FONT
FACE="MS Gothic">
<H2 align=center>计算储蓄计划的未来价值</H2>
<FORM METHOD=POST
ACTION="calculatefuturevalue.asp">
<TABLE cellpadding=4
align=center>
<TR>
<TD>每月计划存入多少钱?</TD>
<TD><INPUT TYPE=TEXT
NAME=Payment VALUE=<%=Payment%>> (必填)</TD>
</TR><TR>
<TD>请输入年利率。</TD>
<TD><INPUT TYPE=TEXT NAME=AnnualIntRate
VALUE=<%=AnnualIntRate%>> (必填)</TD>
</TR><TR>
<TD>您要存几个月?</TD>
<TD><INPUT TYPE=TEXT NAME=NumPayPeriods
VALUE=<%=NumPayPeriods%>> (必填)</TD>
</TR><TR>
<TD>您将在每月的何时付款?</TD>
<TD><INPUT TYPE=RADIO NAME=WhenDue VALUE=1
<%If 1=WhenDue Then Response.Write"CHECKED"%>>月初
<INPUT TYPE=RADIO NAME=WhenDue VALUE=0 <%If 0=WhenDue Then
Response.Write"CHECKED"%>>月末 </TD>
</TR><TR>
<TD>此储蓄帐号里现在有多少钱?</TD>
<TD><INPUT TYPE=TEXT
NAME=PresentSavings VALUE=<%=PresentSavings%>> </TD>
</TR>
</TABLE>
<P align=center><INPUT
TYPE=SUBMIT VALUE="计算未来价值">
</FORM>
<%
If ("" = Payment) Or ("" =
AnnualIntRate) Or ("" = NumPayPeriods) Then
Response.Write "<H3 align=center>尚未输入有效值。</H3>"
ElseIf (IsNumeric(Payment)) And
(IsNumeric(AnnualIntRate)) And (IsNumeric(NumPayPeriods))
Then
Dim FutureValue
Set oASPTut
= Server.CreateObject("ASPTut.Finance")
oASPTut.AnnualIntRate = CDbl(AnnualIntRate)
oASPTut.NumPayPeriods = CInt(NumPayPeriods)
oASPTut.Payment = CDbl(Payment)
If Not "" = PresentSavings
Then oASPTut.PresentSavings = CDbl(PresentSavings)
oASPTut.WhenDue = WhenDue
FutureValue =
oASPTut.CalcFutureValue
Response.Write "<H3
align=center>未来价值 = $" & FutureValue &
"</H3>"
Else
Response.Write
"<H3 align=center>某些值不是数字。</H3>"
End If
%>
</FONT>
</BODY>
</HTML>
在浏览器中,您应看到下列结果:
计算储蓄计划的未来价值
尚未输入有效值。
在本课程中,您将使用 Microsoft® Visual J++® 创建 COM 对象,其功能与第 3 课中的 Visual Basic 组件相同。这些步骤需要使用 Visual J++ 6.0 或更高版本。
public class
ASPTut
{
}
public double CalcFutureValue(
double
dblAnnualIntRate,
double dblNumPayPeriods,
double
dblPayment,
double dblPresentSavings,
boolean
bWhenDue)
{
double dblRet, dblTemp, dblTemp2, dblTemp3,
dblIntRate;
if (dblAnnualIntRate == 0.0)
{
dblRet = -dblPresentSavings - dblPayment *
dblNumPayPeriods;
}
else
{
dblIntRate = dblAnnualIntRate / 100 / 12;
dblPayment =
-dblPayment;
dblPresentSavings =
-dblPresentSavings;
dblTemp = (bWhenDue ? 1.0 +
dblIntRate : 1.0);
dblTemp3 = 1.0 +
dblIntRate;
dblTemp2 = Math.pow(dblTemp3,
dblNumPayPeriods);
dblRet = -dblPresentSavings *
dblTemp2 - dblPayment * dblTemp * (dblTemp2 - 1.0) / dblIntRate;
}
return dblRet;
}本示例中的 ASP 网页使用表单读取用户数据,创建一个对象实例,并计算储蓄计划的未来价值。本示例使用 JScript,但您也可以从 VBScript 中调用 Java 组件。
将下列代码复制并粘贴到文本编辑器中,然后将此文件保存在 x:\Inetpub\Wwwroot\Tutorial 目录中,文件名为 CalculateFutureValueJava.asp。通过在浏览器的地址栏中键入 http://localhost/Tutorial/CalculateFutureValueJava.asp,可以在浏览器中查看此示例的效果。
<%@ Language=JScript
%>
<%
Response.Expires = 0;
Payment =
Request.Form("Payment");
AnnualIntRate =
Request.Form("AnnualIntRate");
NumPayPeriods
= Request.Form("NumPayPeriods");
WhenDue =
Request.Form("WhenDue");
PresentSavings =
Request.Form("PresentSavings");
%>
<HTML>
<HEAD><TITLE>计算未来价值 -
Java</TITLE></HEAD>
<BODY>
<FONT FACE="MS
Gothic">
<H2
align=center>计算储蓄计划的未来价值</H2>
<FORM
METHOD=POST
ACTION="calculatefuturevaluejava.asp">
<TABLE cellpadding=4
align=center>
<TR>
<TD>每月计划存入多少钱?</TD>
<TD><INPUT TYPE=TEXT NAME=Payment
VALUE=<%=Payment%>> (Required)</TD>
</TR><TR>
<TD>请输入年利率。</TD>
<TD><INPUT
TYPE=TEXT NAME=AnnualIntRate VALUE=<%=AnnualIntRate%>>
(Required)</TD>
</TR><TR>
<TD>您要存几个月?</TD>
<TD><INPUT
TYPE=TEXT NAME=NumPayPeriods VALUE=<%=NumPayPeriods%>>
(Required)</TD>
</TR><TR>
<TD>您将在每月的何时付款?
</TD>
<TD><INPUT TYPE=RADIO
NAME=WhenDue VALUE=1 <%if (1==WhenDue)
Response.Write("CHECKED")%>>月初
<INPUT TYPE=RADIO NAME=WhenDue VALUE=0 <%if (0==WhenDue)
Response.Write("CHECKED")%>>月末 </TD>
</TR><TR>
<TD> 此储蓄帐号里现在有多少钱?</TD>
<TD><INPUT
TYPE=TEXT NAME=PresentSavings VALUE=<%=PresentSavings%>>
</TD>
</TR>
</TABLE>
<P
align=center><INPUT TYPE=SUBMIT VALUE="计算未来价值
">
</FORM>
<%
if (("" == Payment)
|| ("" == AnnualIntRate) || ("" == NumPayPeriods)) {
Response.Write("<H3 align=center>尚未输入有效值。</H3>");
} else
{
AnnualIntRate =
parseFloat(AnnualIntRate)
NumPayPeriods = parseFloat(NumPayPeriods)
Payment = parseFloat(Payment)
if ("" != PresentSavings) PresentSavings =
parseFloat(PresentSavings);
if
((isNaN(Payment)) || (isNaN(AnnualIntRate)) || (isNaN(NumPayPeriods)))
{
Response.Write("<H3
align=center> 某些值不是数字。</H3>");
} else
{
var FutureValue,
Cents;
var oASPTut =
Server.CreateObject("MS.ASPTut.Java");
FutureValue = oASPTut.CalcFutureValue(AnnualIntRate, NumPayPeriods,
Payment, PresentSavings, WhenDue);
Response.Write("<H3 align=center>Future value = $" +
parseInt(FutureValue) + "</H3>");
}
}
%>
</FONT>
</BODY>
</HTML>
在浏览器中,您将看到下列内容,这些内容应与本单元第 3 课中使用 Visual Basic 组件产生的显示内容相同。
计算储蓄计划的未来价值
尚未输入有效值。