商务参考体系结构:企业对消费者 第 6 章:解决方案指南
Microsoft Corporation
2001年5月
摘要:本章概要介绍了解决方案实现组件,其中包括:应用程序的高级图形表示法、关于 PASP 文件和 XSLISAPI 过滤器如何发挥作用的说明、ConsolidatedRetail.com 应用程序中每种主要组件类别的说明。
简介
参考体系结构应用程序包含许多自定义的 ASP 文件和代码组件。本章后面的章节将详细介绍这些文件的源代码。图 6-1 直观清晰地显示了解决方案的各个组件及其相互关系。当阅读本指南的其余部分和查看源代码时,可将该图作为基本参考资料。
图 6-1:参考体系结构应用程序组件
正如您从该图中所看到的那样,用户使用浏览器(在此为 Internet Explorer 5)来访问该应用程序。网站中的 ASP 文件作为预处理的 ASP(PASP 脚本)实现,并使用 Commerce Server 2000 提供的可编程对象(如 ProductCatalog、AuthManager、UserProfile 和 OrderGroup)将数据发送到 SQL Server 2000 中的 Commerce Server 站点数据库和从该站点数据库检索数据。下订单或查看购物篮内容之类的业务流程通过 Commerce Server 管道实现。管道调用自定义 COM+ 排队组件来处理电子邮件消息传送功能。每一网页的输出都用 XML 表示,然后由 XSLISAPI 2.1 过滤器截取,而 XSLISAPI 2.1 过滤器将相应的 XSL 样式表应用到内容,将内容作为 HTML 呈现。
本章的下一节将说明 PASP 文件和 XSLISAPI 过滤器是如何发挥作用的,并提供了一个简单示例作为参考。然后,本章会介绍每个主要组件类别在 ConsolidatedRetail.com 应用程序中是如何实现的。我们的讨论采用了逻辑推理的方式,首先介绍 Web 服务,然后介绍 Commerce Server 对象,继而讨论管道组件。
PASP 文件和 XSLISAPI 过滤器
Active Server Page (ASP) 通常用于生成 Web 解决方案的表示逻辑。在 ConsolidatedRetail.com 站点中,使用它们的方法略有不同。在该站点,大多数 ASP 文件是作为预处理的 ASP(即 PASP 文件)实现的。PASP 文件将 XML 写入响应对象,它由 XSLISAPI 过滤器截取和处理。PASP 文件中的脚本用于调用 Commerce Server 2000 对象中的业务逻辑;而由 XSLISAPI 过滤器来处理表示形式。
XSLISAPI 过滤器对从 PASP 文件生成的 XML 输出进行语法分析,并检查 <?xml-stylesheet...?> 处理说明。如果该处理说明包含引用 XML 配置文件的 server-config 属性,则 XSLISAPI 过滤器读取该配置文件,以确定应将哪个 XSL 样式表应用于从 PASP 文件生成的 XML 输出。
XML 配置文件包含有关应将哪个样式表应用于特定客户程序类型的信息,如以下代码示例所示:
<?xml version="1.0" ?>
<server-styles-config>
<!-- 对于 WML 1.1 浏览器 -->
<device target-markup="WML1.1">
<stylesheet href="mypage-WML11.xsl"/>
</device>
<!-- 对于 IE 4.0 浏览器 -->
<device browser="IE" version="4.0">
<stylesheet href="mypage-IE5.xsl"/>
</device>
<!-- 对于 IE 5.0 浏览器 -->
<device browser="IE" version="5.0">
<stylesheet href="mypage-IE5.xsl"/>
</device>
</server-styles-config>
IIS 只要检查随页请求发送的超文本传输协议 (HTTP) 请求标头,就可以识别客户程序。IIS 使用 WINNT\System32\Inetsrv 文件夹中 Browscap.ini 文件的条目,可以识别许多普通浏览器。XSLISAPI 应用程序在名为 Browscap-add.ini 的文件中为 WAP 电话之类的设备提供附加条目,用户应将该文件复制并追加到 Browscap.ini 文件。
简单示例
以下简单示例说明如何使用 XSLISAPI 过滤器来呈现由 PASP 文件生成的 XML 输出。
注意 该示例旨在帮助您理解 XSLISAPI 过滤器的功能。它并不说明 ConsolidatedRetail.com 站点中的任何实际页。
假定用户使用 Internet Explorer 5 请求名为 Myproducts.pasp 的页。系统将对该文件中的脚本进行解释,然后通过以下响应对象返回下列 XML:
<?xml version="1.0">
<?xml-stylesheet type="text/xsl"
server-config="productconfig.xml"
href="csproducts.xsl"?>
<productlist>
<product productname="widget"/>
<product productname="wrench"/>
</productlist>
现在,XSLISAPI 过滤器将对该 XML 进行语法分析,读取 xml-stylesheet 处理说明,该说明包含以下三个属性:
type:指要应用的样式表的类型(在此为 XSL)。
server-config:指 XML 配置文件,它定义要用于特定客户程序的样式表。
href:指在 server-config 文件中没有列出相应的样式表时,客户程序将下载并应用的默认样式表。
然后,XSLISAPI 过滤器读取指定的 server-config 文件 (Productconfig.xml),该文件包含以下条目:
<device browser="IE" version="5.0">
<stylesheet href="products-ie5.xsl"/>
</device>
由于 IIS 已根据请求标头识别客户端浏览器为 Internet Explorer 5.0,现在,XSLISAPI 应用程序会将 Products-ie5.xsl 样式表应用于从 Myproducts.pasp 检索到的 XML。
假定 Products-ie5.xsl 样式表包含以下 XSL 代码:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<HTML>
<TITLE>产品目录</TITLE>
<BODY>
<TABLE>
<xsl:for-each select="productlist/product">
<TR><TD>
<xsl:value-of select="@productname"/>
</TD></TR>
</TABLE>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
该样式表将应用于从 Myproducts.pasp 得到的 XML 数据,从而生成以下 HTML,该 HTML 将发送到浏览器:
<HTML>
<TITLE>产品目录</TITLE>
<BODY>
<TABLE>
<TR><TD>小机械</TD></TR>
<TR><TD>扳手</TD></TR>
</TABLE>
</BODY>
</HTML>
显然,在 ConsolidatedRetail.com 之类的实际电子商务解决方案中,由 PASP 文件生成的 XML 以及用于呈现该 XML 的 XSL 样式表要远比该简单示例复杂得多。不过,原理是相同的。
网站文件
此处介绍一些 ASP 和 PASP 页以及相应的 XSL 文件,它们在 ConsolidatedRetail.com 零售站点的用户界面中经常用到。如前文所述,该应用程序所用的许多 ASP 脚本都是作为 PASP 脚本来实现的,该 PASP 脚本将 XML 输出提交给 XSLISAPI 过滤器。一些常规的 ASP 脚本还用作非显示脚本,接受来自其它页的贴子。
每个 PASP 页都有一个相关的<页名>-config.xml 文件,XSLISAPI 过滤器使用该文件来确定要用于特定客户程序类型的相应样式表。在本实现方案中,只提供了<页名>-ie5.xsl 文件,以使用与 Microsoft Internet Explorer 5.5 兼容的 HTML 形式来呈现页。为使输出能用于其它浏览器或设备,可以创建其它 XSL 文件。
初始化页和包含文件
ConsolidatedRetail.com 站点使用以下初始化脚本和包含文件:
Global.asa:Global.asa 是一种 Web 应用程序初始化脚本,它定义在 Web 应用程序的生存期中发生关键事件时要采取的措施。
/include/Site_Const.asp:该文件定义了许多常量,站点上的所有页都包含该文件。
/include/Common.asp:该文件定义一些函数,这些函数用于呈现 XML 标记形式的数据。站点上的所有 PASP 页都使用该文件来生成将传送给 XSLISAPI 过滤器的 XML。
/include/Profile.asp:该文件包含执行以下操作的所有函数:验证用户身份、给用户注册或注销用户、检索或更新用户的个人配置文件。
/include/basket.asp:该文件提供用户创建和维护购物篮(即在浏览产品目录期间累积订单)时所需的函数。
/include/UI_layout-IE5.xsl:该 XSL 样式表提供表示逻辑,用于呈现站点中各页的标准布局形式。所有页专用的 XSL 文件都包含该样式表,以确保站点呈现出统一的外观和行为。
目录浏览页
ConsolidatedRetail.com 零售站点使用以下与目录相关的页:
Default.asp:该页将用户重定向到站点的主页 (Index.pasp)。由于 Default.asp 是 ASP 应用程序的传统起始页名,所以将其置于此处,以将所有对 Default.asp 的请求重定向到应用程序的真正起始页。
Index.pasp:Index.pasp 是应用程序的默认起始页。当您只输入站点名而没有附加路径信息时,就会显示该页。当任务完成或出现错误时,若干其它页也会重定向到该页。
Category.pasp:该页为特定的页生成 XML,在这一特定的页中,用户可以查看给定产品目录特定类别中的产品和子类别。
Product.pasp:该页为特定的页生成 XML 内容,在这一特定的页中,可以显示产品目录中有关单个产品及其所有变体的详细信息。
SearchResults.pasp:当用户在产品搜索框中输入搜索标准时,该页接收输入内容,然后搜索与关键词匹配的产品,并将相匹配的产品列表返回给用户。
用户身份验证和配置文件管理页
ConsolidatedRetail.com 零售站点使用以下用户身份验证和管理脚本:
Registration.pasp:使用该页,用户可以在站点注册。
Login.pasp:使用该页,已注册的用户可以登录到站点。
ForgotPasswd.pasp:通过该页,用户能够请求站点用电子邮件将口令发送给自己。
Acct.pasp:该页显示当前已登录的用户的帐户详细信息。
UserProfile.pasp:在该页,用户可以编辑自己的配置文件。
AddressBook.pasp:在该页,用户可以查看并更新地址簿,其中包含发货地址和付款地址。
订单管理页
ConsolidatedRetail.com 零售站点使用以下订单管理页:
orderhistory.pasp:该页检索和显示当前用户的订单历史记录,允许用户查看自己在该站点购买的所有商品。
orderhistorydetail.pasp:该页显示用户的订单历史记录中特定订单的详细信息。
Basket.pasp:该页显示当前用户的购物篮内容,具体而言,就是与用户当前会话相关的 OrderGroup 对象中包含的产品。
Ordersummary.pasp:尽管该页的显示结果与 basket.pasp 页的显示结果大不相同,但是该页的脚本以及由脚本生成的 XML 内容却与 basket.pasp 页非常相似。
Shipping.pasp:当用户单击购物篮页的“结帐”链接或单击任何页顶部的“结帐”链接时,都将调用该页。用户在该页可以指定订单的发货地址。
ShippingMethod.pasp:在该页,用户可以选择订单的发货方法。
MultiShipping.pasp:在该页,用户可以为同一订单中的多个项目指定不同的发货地址。
ThankYou.pasp:在该页,通过运行一系列的 Commerce 管道进程,完成本应用程序的 Commerce Server 部分的订单处理工作。
Commerce Server 对象
本解决方案的另一重要特性在于将 Commerce Server 2000 可编程对象用于业务处理。任何能识别 COM 的客户程序(如 ASP 脚本)都可使用这些对象,以便检索站点数据库中的数据或执行验证用户身份之类的任务。在第 7 章中介绍站点提供的功能时,将详细探讨这些对象的用途。在这里,只简单介绍一下 ConsolidatedRetail.com 应用程序中使用的几个关键 Commerce Server 对象。
实用程序和配置对象
电子商务站点是一种相当复杂的应用程序,要求能提供各种信息和功能。为了简化电子商务解决方案的开发,Commerce Server 2000 提供了很多对象,它们可用于管理站点配置信息以及提供整个站点都可使用的一般功能。
事实上,Commerce Server 解决方案中所用的许多对象都是 Dictionary 对象或 SimpleList 对象。这些都是通用对象,可用来维护名称/值对的集合。例如,在 ConsolidatedRetail.com 应用程序中,Dictionary 对象用于存储站点所用管道的集合。有关 Dictionary 和 SimpleList 对象的详细信息,请参考 Commerce Server 2000 文档。
ConsolidatedRetail.com 应用程序在整个站点中使用以下实用程序和配置对象:
AppConfig:这是 Commerce Server 应用程序配置对象,它提供可用于检索站点配置情况的方法。其中包含 Options 字典对象,该对象可用于存储站点的各种配置选项。在 ConsolidatedRetail.com 站点中,选项字典用于存储数据源连接字符串和其它配置信息。
DataFunctions:这是定义数据格式的对象,存放有关站点区域设置、货币和其它与数据相关的问题的信息。该对象还提供处理数据类型特有任务的方法,如删除字符串中的空格或将数据从一种类型转换成另一种类型。
GenID:这是实用程序对象,用于生成全局唯一标识符 (GUID)。当需要提供唯一 ID 来标识指定项目时,这些标识符非常有用。
AppFramework:这是用于简化 HTML 窗体处理的实用程序对象。
MessageManager:该对象用于存储多语种错误消息,以供管道组件使用。
CacheManager:该对象用于管理站点的数据高速缓存。如果将目录、发货方法、用户配置文件等数据进行高速缓存,可显著提高系统性能。
DictionaryXMLTransforms:该对象使用特定的 XDR 架构,实现 Dictionary 对象的内容与 XML 两者之间的相互转换。
有关 AppConfig、DataFunctions、GenID、AppFramework、MessageManager、CacheManager 和 DictionaryXMLTransforms 对象的详细信息,请参考 Commerce Server 2000 文档。
目录对象
能够从与站点相关的目录检索产品信息,这是电子商务站点中的网页必须完成的常见任务之一。Microsoft® Commerce Server 2000 支持在单个站点中使用多个目录。您可以用嵌套的类别将目录组织成一个分层结构,可以定义目录的任何级别(包括根)上的产品。另外,您还可以在分层结构中的任何位置,将任何类别或产品与其它类别或产品关联起来。例如,可将“软件”类别中名为 Windows® 2000 Server 的产品与“书”类别中名为 The Windows 2000 Server Administrators Guide 的产品关联起来。这样就能轻松地创建到相关产品或类别的链接,创造交叉销售的机会。图 6-2 显示了 Commerce Server 2000 支持的目录结构。
图 6-2:Commerce Server 2000 目录结构
使用 Commerce Server Business Desk,您既可以从头开始创建目录,也可以从 XML 或 CSV 文件导入目录。有关如何使用 Business Desk 管理目录的详细信息,请参考 Commerce Server 2000 文档。
Commerce Server 中的另一项目录支持功能是您可以创建“目录集”。目录集是指一个或多个目录的集合,基于用户配置文件中的属性而将这些目录分配给特定用户类。例如,您可以创建一个目录集,其中包含一些价格可打折的目录,以便为参与忠实客户计划的用户提供优惠。对于未分配目录集的用户,Commerce Server 站点包含为匿名用户提供的默认目录集以及为通过了身份验证的用户提供的默认目录集。
通过以下 Commerce Server 自动化对象可以提供对目录数据的程序访问:
CatalogManager:该对象代表整个目录管理系统。
CatalogSets:通过该对象可以访问站点中定义的目录集。
ProductCatalog:该对象代表特定目录。
Category:该对象代表目录中的类别。
Product:该对象代表产品。
上述对象提供了浏览站点的整个目录分层结构的方法。这些对象提供的许多方法和属性都返回 ADO 记录集,其中包含目录、类别或产品数据。
对于任何目录数据,必须先使到站点数据源的连接初始化,才能访问它们。通常,要完成此操作,必须调用 CatalogManager 对象的 Initialize 方法,将到站点数据库的 ADO 连接字符串或站点名作为参数传送。
有关 CatalogManager、CatalogSets、ProductCatalog、Category 和 Product 对象的详细信息,请参考 Commerce Server 2000 文档。
用户管理对象
Commerce Server 提供了若干对象,用于在用户与站点交互时管理用户信息和状态。这些对象包括:
AuthManager:该对象用于处理与安全性相关的功能,允许用户进行身份验证并登录,提供标识特定用户所作请求的方式。
ProfileService:该对象用于连接到数据源,那里存储着与站点的已注册用户相关的配置文件信息。
ProfileObject:该对象用于封装特定用户的配置文件数据,并可用于设置或检索以下值:“姓名”、“电话号码”、“电子邮件地址”或其它任何需要跟踪的用户属性。
有关 AuthManager、ProfileService 和 ProfileObject 对象的详细信息,请参考 Commerce Server 2000 文档。
购物篮对象
当用户找到需要购买的产品时,允许用户将产品放入购物车或购物篮是网站的平常之举。事实上,购物篮概念只是软件对象的比喻说法,它代表用户在访问过程中选择的项目集合。
Commerce Server 2000 提供了以下对象用于购物篮的管理。
OrderGroup:该对象代表购物篮。
OrderForm:该对象代表购物篮中的项目集合。OrderForm 对象是作为 Dictionary 对象实现的,它包含订单的总体信息,而 SimpleList 对象则包含代表购物篮中单个项目的项目 Dictionary 对象。Addresses SimpleList 对象用于存储地址 Dictionary 对象的集合,代表与订单相关的发货地址和付款地址。
有关 OrderGroup 和 OrderForm 对象的详细信息,请参考 Commerce Server 2000 文档。
管道
Commerce Server 2000 解决方案一般使用管道来处理业务。管道由一系列 COM 组件组成,这些组件将对 OrderForm 之类的业务对象进行操作。管道中的组件以及调用这些组件的顺序,在管道配置文件 (*.pcf) 中指定。您可以将管道视为一种生产线,其中每个组件执行特定的任务,然后再将业务对象传送给下一个组件。
ConsolidatedRetail.com 使用名为 PAGBasket.pcf、Total.pcf 和 Final.pcf 的三个管道。有关对它们的引用存储在应用程序级的 MSCSPipelines 字典变量中,分别为 PAGBasket、PAGTotal 和 PAGFinal。这些管道执行的特定进程将在以后讨论站点的功能时介绍。
管道组件
管道中的组件是实现 IPipelineComponent 接口的 COM 组件。该接口提供 Execute 方法,可以将字典对象传送给该方法。将 OrderForm 之类的业务对象依次传送给管道中每个组件的 Execute 方法,就可以实现业务流程。
Commerce Server 提供了大量可用于电子商务站点的管道组件。这些对象用于将折扣应用到订单、征收税金、安排发货等等。此外,您还可以创建自定义的管道组件来执行特定任务。ConsolidatedRetail.com 站点包含以下两个自定义管道组件:
PersistUtility:该自定义管道组件用于将 OrderGroup 对象的非持久性属性复制到持久性属性。通常,以下划线开头的 OrderGroup 对象属性都是临时值,在管道处理结束时,会毁坏这些值。由于本应用程序会将订单窗体导出到 Commerce Server 领域外,因此,需要保留一些通常被丢弃的 OrderGroup 值,以便提供外部处理时的上下文。PersistUtility 会将一些带下划线的属性复制到不带下划线的名称中,这样在管道处理完成后,这些值仍然存在着。
PipelineQueue.QueueEMail:该自定义管道组件从订单窗体中获取数据,将这些数据转换成 XML,然后使用 QueuedEMailer.CMailer 组件(将在“自定义业务组件”一节中介绍)将电子邮件消息发送给用户。
自定义业务组件
您可以创建一些自定义业务组件,给解决方案添加其它自定义功能。ConsolidatedRetail.com 站点就包含一个自定义业务组件:QueuedEMailer.CMailer。QueuedEMailer.CMailer 是一个自定义的 COM 组件,用于给用户发送电子邮件。进行订单确认或忘记口令时,需要使用该组件。该组件作为 COM+ 排队组件实现,通过消息队列可异步调用其方法。这样,用户会话不必等到电子邮件处理完毕即可继续,从而缩短了响应时间。
总结
本章简要介绍了参考体系结构应用程序中的主要代码类别,同时提供了一些实际代码片段作为参考。此时,您应该对代码的构成方法有了一个基本概念。
下一章将详细介绍 ConsolidatedRetail.com 应用程序的每一层,同时提供一些伪代码和实际代码示例来说明处理流程。