在 WebSphere Commerce 中创建有关扩展站点框架的解决方案

第 1 部分:使用命令层

WebSphere® Commerce 中扩展站点的作用是确保不同存储间的可共享资产。本教程深入分析使用存储路径资源的不同方式,该资源是 WebSphere Commerce 中一种已投入市场的框架。本教程引入了一种新概念,提供对共享资产子集的粒度级控制。另外,通过本教程,您还可以学习如何合理扩展一个 EJB 来使用 BeanFinderObject,以便您的 findBy 方法能包含共享查询。您还将了解如何更好地确保存储集合完全能够共享使业务取得成功所必不可少的所有资产,同时保持软件的可重用性且易于维护性。

Michael DJ Shields, 解决方案架构师, CrossView, Inc.

Michael Shields 的照片Michael Shields 在 CrossView®, Inc. 工作。他有 10 多年的时间在咨询和开发能最好地利用 WebSphere Commerce 的策略,以满足客户的业务需求。他还在使用 J2EE、PHP、Zend Framework、Adobe products、HTML、CSS、AJAX、jQuery、DOJO 和 JavaScript 开发交互式 Web 解决方案方面拥有超过 12 年的经验。Michael 持有 5 项专利,在 WebSphere Commerce Information Center 上发表了超过 12 篇教程,在 developerWorks WebSphere Commerce 专区 上发表了 10 篇教程。他持有超过 12 个技术认证,具有项目经理头衔(PMP)。



Quan Nguyen, 解决方案架构师, CrossView, Inc.

Quan Nguyen 的照片Quan Nguyen 在 CrossView, Inc. 工作。自 1999 年以来,一直专注于利用 WebSphere Commerce 咨询和开发电子商务解决方案。作为一名解决方案架构师,他拥有 10 多年的相关经验,致力于与主流 B2C 和 B2B 公司协作实现可靠的 WebSphere Commerce 策略,以满足其业务需求。



Raj Sanghvi, 解决方案架构师, CrossView, Inc.

Raj Sanghvi 的照片Raj Sanghvi 是 CrossView, Inc. 的一名解决方案架构师。他在针对不同子系统运作的 WebSphere Commerce 咨询方面拥有超过 6 年的经验。他在使用 J2EE、Oracle、HTML、XML 和 SOAP 进行软件开发方面拥有超过 10 年的经验。他持有超过 8 个技术认证,具有项目经理头衔(CAMP)。他拥有计算机科学硕士学位。



Amar Desai, 解决方案架构师, Ascendant Technology, an Avnet Technology Solutions Company

Amar Desai 的照片Amar Desai 是 Ascendant® Technology 的一名解决方案架构师。他使用 WebSphere Commerce 帮助了很多顶级零售、银行和餐饮公司具体化他们对电子商务空间的愿景。他酷爱运用最新的 Web 应用趋势,比如社会化商务、精准营销和移动商务。他是经过认证的 WebSphere Commerce 开发人员和管理员。



2011 年 2 月 16 日

引言

本教程介绍一种高级方法来使扩展站点中的新资产可重用、可伸缩,且符合 WebSphere Commerce 扩展站点框架的设计宗旨。教程首先介绍扩展存储路径模型的一些基本场景。然后创建引入新实体 bean 的新业务资产,从而了解如何将其与扩展站点框架相集成。完成这一切之后,您将了解控制粒度级子资产的新概念,这些子资产属于更高级别的共享资产组。

目标

在本教程中,您将了解扩展站点存储路径模型、特殊的 EJB 扩展功能和对共享资产子集的粒度级控制。

先决条件

大部分 WebSphere Commerce 部署已经纳入了扩展站点模型。如果您的业务还没有涉及扩展站点模型,在学习了本教程中的技术之后您很可能会这么做。因此,您要将扩展站点部署到开发箱中并了解样例存储的基本原理。本教程中有些步骤需要您能够使用这些扩展站点框架,作为部署结果提供。本教程还快速回顾了如何设置一个基本的扩展站点环境。

系统要求

为实现本教程所列任务,您需要使用 WebSphere Commerce V6 或 V7。

持续时间

8 个小时


设置环境

部署扩展站点

先决条件

如果您已经有设置好的扩展站点环境,那么可以跳转到 创建商店 Example1,创建新商店来实现后面介绍的教程步骤。创建测试数据时,本教程使用 Example 的命名约定并附加一个计数器。在本教程中,计数器是 1。因此,所有需要名称的已创建元素都以 Example1 为标题。准备好这些之后,如果您选择创建多个场景,那么可以附加计数器以拥有多个托管商店,比如 Example1Example2Example3Example(n)

您需要部署一个可扩展站点实现,以便利用框架。WebSphere Commerce 已经奠定了实现业务资产共享的基础,因此部署好之后,您便可以轻松参与到本教程中来。要部署扩展站点,您需要:

  1. 以站点管理员身份登录到 WebSphere Commerce Administration Console,这会载入 Administration Console Site/Store Selection 页面。
  2. 检查 Site 并单击 OK 按钮。
  3. 选择 Store Archives 菜单,然后单击子菜单 Publish。Publish 页面显示 “Store Archives” 面板。
  4. 从扩展站点显示的下拉菜单中选择 ExtendedSites
  5. 检查 SAR 文件 ExtendedSitesOrganizationStructure.sar
  6. 单击面板右上方的 Next 按钮。Parameters 面板出现。
  7. 接受默认设置并单击面板右上方的 Next 按钮。Summary 面板出现。
  8. 接受默认设置并单击面板右上方的 Finish 按钮。
  9. 单击 web 页面对话框的 OK 按钮。
  10. 等待发布完成,之后单击 Refresh 确认 Publish Status 为 “完成”。

发布扩展站点中枢

扩展站点中枢(仅在发布了 ExtendedSitesHub.sar 之后可用)是一个电子商务站点,准卖家可以注册和建立专卖店。“Seller” 是在 WebSphere Commerce 中定义的一个角色,用于监督总体商店目标和管理,以及追踪商店销售情况。从扩展站点中枢上,卖家可以执行以下操作:

  • 从扩展站点中枢进行自我注册。如经批准,卖家可使用 Store Creation 向导创建一个商店。
  • 管理商店。功能包括改变商店外观、营销、产品管理,等等。
  • 执行组织和用户管理任务,比如创建其他商店管理员。

“渠道经理” 是在 WebSphere Commerce 中定义的另一个重要角色。渠道经理可以使用 WebSphere Commerce Accelerator 管理扩展站点中枢。

  1. 选择菜单 Store Archives,然后单击子菜单 Publish。Publish 页面显示 Store Archives 面板。
  2. 为 View 下拉列表选择 ExtendedSites(或选择默认的 Store Archives 视图,然后重新选择 Extendedsites Store Archives 视图)。
  3. 检查 SAR 文件 ExtendedSitesHub.sar
  4. 单击面板右上方的 Next 按钮。Parameters 面板出现。
  5. 确保参数设置如下:
    Store directory
    ExtendedSitesHub
    Store identifier
    Extended Sites Hub
    Organization
    Extended Sites Organization
  6. 单击面板右上角的 Next 按钮。Summary 面板出现。
  7. 接受默认设置并单击面板右上方的 Finish 按钮。
  8. 为 web 页面对话框单击 OK 按钮。
  9. 等待发布完成,然后单击 Refresh 确认 Publish Status 为 “完成”。

发布扩展站点目录资产商店:示例

  1. 选择菜单 Store Archives,然后单击子菜单 Publish。Publish 页面显示 Store Archives 面板。
  2. 为 View 下拉列表选择 ExtendedSites(或选择默认的 Store Archives 视图,然后重新选择 Extendedsites Store Archives 视图)。
  3. 检查 SAR 文件 ExtendedSitesCatalogAssetStore.sar
  4. 单击面板右上方的 Next 按钮。Parameters 面板出现。
  5. 确保参数设置如下:
    Store Directory
    ExampleCatalogAssetStore
    Store identifier
    Example Catalog Asset Store
    Organization
    Extended Sites Organization
    Sample data
    None
  6. 单击面板右上方的 Next 按钮。Summary 面板出现。
  7. 接受默认设置并单击面板右上方的 Finish 按钮。
  8. 为 web 页面对话框单击 OK 按钮。
  9. 等待发布完成,然后单击 Refresh 确认 Publish Status 为 “完成”。

发布扩展站点 B2BDirectStorefrontAssetStore:示例

  1. 选择菜单 Store Archives,然后单击子菜单 Publish。Publish 页面显示 Store Archives 面板。
  2. 为 View 下拉列表选择 ExtendedSites(或选择默认的 Store Archives 视图,然后重新选择 Extendedsites Store Archives 视图)。
  3. 检查 SAR 文件 B2BDirectStorefrontAssetStore.sar
  4. 单击面板右上方的 Next 按钮。Parameters 面板出现。
  5. 确保参数设置如下:
    Store directory
    ExampleStorefrontAssetStore
    Store identifier
    ExampleStorefrontAssetStore
    Organization
    Extended Sites Organization
    Catalog asset store
    Example Catalog Asset Store
  6. 单击面板右上方的 Next 按钮。Summary 面板出现。
  7. 接受默认设置并单击面板右上方的 Finish 按钮。
  8. 为 web 页面对话框单击 OK 按钮。
  9. 等待发布完成,然后单击 Refresh 确认 Publish Status 为 “完成”。

创建商店 Example1

  1. 以站点管理员身份登录到 Accelerator。页面载入 “Select Store and Language” 选项。
  2. 选择商店名为 Extended Sites Hub
  3. 单击 OK 按钮。页面重新载入菜单项 Hub、Extended Sites、Reports 和 Help。
  4. 找到菜单项 Extended Sites 并单击,然后单击子菜单项 New Store
  5. 在 General 面板下,输入以下信息:
    Store unique identifier
    Example1
    Store display name
    Example1
    Store description
    Example1
    Notification recipient email
    <store email>
    Default store currency
    US Dollar
    Store organization
    Extended Sites Seller Organization
    (Previous versions) Store category
    (Previous versions) Electronics
  6. 单击右上方的 Next 按钮。
  7. 在 Store Type 面板下,输入以下信息:
    Store Type
    ExampleStorefrontAssetStore
  8. 单击右上方的 Next 按钮。
  9. 在 Catalog 面板下,输入以下信息:
    Catalog
    Example Catalog Asset Store
    (这假定已经创建了一个扩展站点目录资产商店。)
  10. 单击右上方的 Next 按钮。
  11. (上一版本)在 Fulfillment 面板下,输入 Fulfillment center nameExample1 并单击 Add
  12. 单击右上角的 Next 按钮。
  13. 在 Payments 面板下,输入希望使用的支付方式。
  14. 单击右上方的 Next 按钮。
  15. 在 Store Creation Summary 面板下,审查信息。
  16. 单击右上方的 Finish 按钮。页面重新载入 Store Creation Confirmation 页面。
  17. 出现 “Please wait while the store is being created...” 消息时请等待一段时间。
  18. 生成的消息显示 URL http://localhost/webapp/wcs/stores/servlet/StoreView?storeId=<store identifier>,其中 <store identifer> 是商店标识符的值。
  19. (可选)单击 Bookmark Store 按钮,将 Example1 商店添加到浏览器的书签中。
  20. 单击右上方的 Close 按钮。
  21. 找到菜单项 Extended Sites 并单击,然后单击子菜单项 View Stores
  22. 检查商店名 Example1。右边的菜单按钮现在启用 Resume 按钮。
  23. 单击 Resume 按钮,面板重新载入。
  24. 检查商店名 Example1。右边的菜单按钮现在启用 Open 按钮。
  25. 单击 Open 按钮。页面重新载入,以表明商店正在营业。

创建商店 Example2

  1. 以站点管理员身份登录 Accelerator。页面载入 “Select Store and Language” 选项。
  2. 选择商店名为 Extended Sites Hub
  3. 单击 OK 按钮。页面重新载入菜单项 Hub、Extended Sites、Reports 和 Help。
  4. 找到菜单项 Extended Sites 并单击,然后单击子菜单项 New Store
  5. 在 General 面板下,输入以下信息:
    Store unique identifier
    Example2
    Store display name
    Example2
    Store description
    Example2
    Notification recipient email
    <store email>
    Default store currency
    US Dollar
    Store organization
    Extended Sites Seller Organization
    (Previous versions) Store category
    (Previous versions) Electronics
  6. 单击右上方的 Next 按钮。
  7. 在 Store Type 面板下,输入以下信息:
    Store type
    ExampleStorefrontAssetStore
  8. 单击右上方的 Next 按钮。
  9. 在 Catalog 面板下,输入以下信息:
    Catalog
    Example Catalog Asset Store
    (这假定已经创建了一个扩展站点目录资产商店。)
  10. 单击右上方的 Next 按钮。
  11. (上一版本)在 Fulfillment 面板下,输入以下信息:Fulfillment center nameExample2,并单击 Add
  12. 单击右上方的 Next 按钮。
  13. 在 Payments 面板下,输入您希望的支付方式。
  14. 单击右上方的 Next 按钮。
  15. 在 Store Creation Summary 面板下,审查信息。
  16. 单击右上方的 Finish 按钮。页面重新载入 Store Creation Confirmation 页面。
  17. 出现 “Please wait while the store is being created...” 消息时请等待一段时间。
  18. 生成的消息显示 URL http://localhost/webapp/wcs/stores/servlet/StoreView?storeId=<store identifier>,其中 <store identifer> 是商店标识符的值。
  19. (可选)单击 Bookmark Store 按钮,将 “Example2” 商店添加到浏览器的书签中。
  20. 单击右上方的 Close 按钮。
  21. 找到菜单项 Extended Sites 并单击,然后单击子菜单项 View Stores
  22. 检查商店名 Example2。右边的菜单按钮现在启用 Resume 按钮。
  23. 单击 Resume 按钮。面板重新载入。
  24. 检查商店名 Example2。右边的菜单按钮现在启用 Open 按钮。
  25. 单击 Open 按钮。页面重新载入,以表明商店正在营业。

使用存储路径模型

先决条件

对于该部分,您需要有一个启动并运行的扩展站点环境。您将执行一些简单的 SQL 语句来核实和审查与扩展站点部署相关的数据。

扩展站点的宗旨是,让一个系统管理多个业务资产,以满足不断增长的业务需求。

随业务增长,有更多的商店被创建,具有互不相容的上市策略,每种策略都针对不同的客户群和不同的地理区域。

扩展站点能够让这些互不相容的商店之间共享公共业务资产。这将允许业务资产在所有商店之间共用。不需要复制所有必需的资产,每个站点只需选择其需要的那些资产即可。这样一来,扩展站点框架就简化了业务的主要宗旨。使业务资产在 IT 中更易于维护。

只有当驱动扩展站点框架的引擎是可以实现这一功能的公共代码存储库时,这才有意义。因此,驱动扩展站点系统的代码本身就是一种可重用的公共业务资产。这足以让企业自豪地宣布,其软件也是一种有价值的业务资产。它支持 IT 部署占据主动地位,如果成功就可予以重用,而不是处于被动,受到各种复杂状况的限制。

存储路径模型的设计宗旨是,确保公共代码存储库以商店关系和商店关系类型的途径与一组多变的规则进行交互。在这部分,您将通过一些步骤基本了解 WebSphere Commerce 中的存储路径模型。

存储路径基础知识

存储路径被用作一种机制,来了解哪些商店共享资产,而哪些商店不需要共享公共资产。顾名思义,从单一托管商店到资产商店的路径越高,能参与到资产共享中的商店就越多。如果您的存储路径一直通向资产商店,那么沿用这条路径的所有商店都共享该资产。

为获得对存储路径模型的基本了解,看一下在您的 WebSphere Commerce 实例上运行的数据库。

  1. 确保测试环境已启动
  2. 从数据库上,准备执行一条 SQL 语句。例如,使用工具包打开浏览器,输入以下 URL: http://localhost/webapp/wcs/admin/servlet/db.jsp
  3. 从数据库上,执行以下查询:
    清单 1. 数据库查询:商店关系
    select * from STOREREL where STORE_ID = 
    (select STOREENT_ID from STOREENT where IDENTIFIER = 'Example1')

    Example1 是您希望检查数据的托管商店的名称。

在数据库上运行这条 SQL 语句的结果(清单 1)详细展示了商店关系。当您在部署扩展站点之后创建托管商店时,商店关系被填充。

何为商店关系?

商店关系是顾客在其中购物的商店以及与其他含有它希望重用的业务资产的商店的关系。最佳实践是,拥有需要共享的业务资产的商店属于资产商店 — 资产商店作为虚拟商店,目的在于囊括所有共享资产。

特别地,RELATEDSTORE_ID 列是与托管商店有关系的商店。当然,这是一种开放式表,支持各种不同组合的关系,但是最让人感兴趣的是,托管商店与资产之间的关系,或资产商店、资产和托管商店之间的关系。对于所有相关资产 — 那么从扩展站点框架角度来看,资产是什么?对于 “共享业务资产” 已有很多谈论。因此,需要更深入地了解这些资产。

共享资产

电子商务环境中的共享资产从少量 WebSphere Commerce 组件探索式地分类而来。因此,在查看 Store Relationship Types 时,它们根据第一眼便会想到的东西,即组件,予以组织。

例如,在部署有扩展站点实例的数据库上执行以下 SQL 语句:

  1. 确保测试环境已启动
  2. 从数据库上,准备执行一条 SQL 语句。例如,使用工具包打开浏览器,并输入以下 URL: http://localhost/webapp/wcs/admin/servlet/db.jsp
  3. 从数据库上,执行以下查询:
    清单 2. 数据库查询:商店关系类型
    select STRELTYP_ID,NAME from STRELTYP

检查该 SQL 语句的执行结果,结果表明,大量商店关系类型显示为不同类型的资产。等于 com.ibm.commerce.catalogSTRELTYP.NAME 表示与目录相关的资产,企业使用它来组织、销售和推广产品。

进一步看一下关于 com.ibm.commerce.catalog 分组资产的其中一个托管商店:

  1. 确保测试环境已启动
  2. 从数据库上,准备执行一条 SQL 语句。例如,使用工具包打开浏览器,并输入以下 URL: http://localhost/webapp/wcs/admin/servlet/db.jsp
  3. 从数据库上,执行以下查询:
    清单 3. 数据库查询:商店关系类型
    SELECT a.IDENTIFIER as hostedStore,b.IDENTIFIER as relatedStore,NAME 
    FROM STOREREL,STRELTYP,STOREENT a, STOREENT b 
    WHERE
    STRELTYP.STRELTYP_ID = STOREREL.STRELTYP_ID
    and STRELTYP.NAME = 'com.ibm.commerce.catalog'
    and a.STOREENT_ID = STOREREL.STORE_ID
    and b.STOREENT_ID = STOREREL.RELATEDSTORE_ID
    and a.identifier = 'Example1'

用于搜索目录商店关系类型的商店标识符是 Example1

检查这条 SQL 语句的执行结果,结果表明,托管商店、目录资产和本身就是相关商店的商店之间有关系。而且托管商店、目录资产和目录资产商店之间也有一个关系。这将允许您的托管商店不仅提供在其自身托管商店级别确立的产品,还可以提供在公共目录资产商店的共享级别确立的产品。因此,之前在电子商务环境中看作组件或数据集的对象,即目录,现在被看作是可由不同商店以不同方式重用的共享资产。

资产共享规则

基于目前为止在您的扩展站点环境中运行的 SQL 语句,有一些关于资产共享的规则。由于托管商店可以与其本身和/或其它商店和/或资产商店存在关系,那么可以实现以下要求:

表 1. 存储路径模型启用的要求
启用的要求关系级别数据示例
托管商店资产是独有的。托管商店仅有一个引用自身的条目。STOREREL 中的一个条目,其中 STORE_ID 和d RELATEDSTORE_ID 是托管商店。
托管商店资产可与资产商店共享。托管商店引用自身和资产商店。STOREREL 中的一个条目,其中 STORE_IDRELATEDSTORE_ID 是托管商店。STOREREL 中的一个条目,其中 STORE_ID 是托管商店,RELATEDSTORE_ID 是资产商店。
托管商店仅继承来自资产商店的资产。托管商店引用资产商店。STOREREL 中的一个条目,其中 STORE_ID 是托管商店,RELATEDSTORE_ID 是资产商店。
托管商店资产是独有的。托管商店无疑定义的级别。在资产的 STOREREL 表中没有条目。

STOREREL.sequenceSTOREREL.state 字段还对如何启用商店关系或排列其优先级提供粒度控制。欲了解更多信息,参见 商店之间的关系

小节结束语

掌握为您的环境提供的商店关系和商店关系类型很重要。通过一个简单的存储路径结构实现的这些需求的一个较大好处在于,支持该框架的软件很简单、可重用、可伸缩且功能很强大。这在本教程中会予以展示,在扩展存储路径模型来支持一些实际电子商务场景时会加以展示。


使用商店关系类型联属网络(affiliate networking)使用自定义商店关系类型

先决条件

在本教程的其余部分,您将开始向新资产引入对商店关系的自定义支持。大致顺序如下:

  1. 在数据库中,在新共享资产类型的 STRELTYP 表中填充一个新条目(com.dw.commerce.storepath.affiliate)。
  2. STOREREL 表中填充条目,用于根据新的 STRELTYP 条目定义商店关系。
  3. 修改生成 EJB 的方式,引入一种新的 finder 类型和 finder 方法来专门解决新资产的商店关系。
  4. 创建一个新的 databean 来获得商店关系类型填充的定义(STRELTYP 表)。这个 bean 纳入 STOREREL.sequence 字段施加的层次结构逻辑。

在该部分,您需要对数据库做更改,以作测试之用。而且您还需要使用 Accelerator。因此,确保您的访问是经过许可的,而且您拥有执行管理任务的适当访问控制功能。

理解如何利用商店关系类型最好的方法就是,放入实际环境中来使用它。那么您为何还要花时间来学习没有实际上下文的教程呢?对于本教程,“联属网络” 的概念是将新业务资产引入到扩展站点环境的一个好方法。联属网络可被设计为点缀商店流程的组织行为。它与电子商务引擎核心不相容,因此是本教程为了利用扩展站点框架而额外加入的。

在电子商务解决方案环境中,联属网络的一个目标是委托第三方提供商店销售量。组织表经过重用,以表示附属成员(affiliates)。但是,对于本教程,重用了一组替代表格来表示附属成员,比如 WebSphere Commerce 中的 VENDOR 表。

WebSphere Commerce 中的供应商大多意在作为在物流中心接收的商品源,或希望在物流中心接收的商品源。对于要用于商店关系的联属网络,例如,vendor 表就是处于这种目的而被重用的,且功能经过扩展,以将它们表示为附属成员。当然,如果您喜欢这个解决方案,可以稍后集成对这些供应商的引用,但是本教程仅侧重于阐述扩展站点的强大功能以及如何使代码可重用且整洁。如果处于确认目的,通过各种技术,包括点击流分析、点击率、联属网络营销服务和调查,来度量引用,那么通过关联标记为附属成员的 vendors 即可集成该引用。

注意:使用供应商表的联属设计仅供本教程作说明之用。如果已经为预期目的将供应商作为物流中心接收的商品源或希望物流中心接收的商品源,那么需要创建和标记新的供应商,以便不将其标记为物流中心。除非您创建不与驱动电子商务解决方案的主导引擎相冲突的新物流中心。

对于本教程,您只需填充最少的供应商数据,以便说明它们如何参与存储路径关系的扩展。

将附属成员创建为关系类型

附属成员可轻松整合到 WebSphere Commerce 提供的组织模型中。附属成员也可以向 WebSphere Commerce 中创建新的扩展表。供应商表是非常适合,因为它们在 Accelerator 中可得到轻松维护,也满足了本教程的说明目的。

您要同时在 Accelerator 中的目录资产商店级别和托管商店级别创建附属成员。

  1. 打开文件 WCDE Installation Directory/xml/tools/common/CommerceAcceleratorCPS.xml
  2. 搜索以下代码行:
    清单 4. Accelerator CommerceAcceleratorCPS 产品菜单元素
    <menuitem name="products"
                 enabled="true"
                 taskUsages="all"
                 users="catMgr">
    	.......
    </menuitem>
  3. 在产品菜单项中添加以下代码行,最好是在结尾处:
    清单 5. Accelerator CommerceAcceleratorCPS appending vendor menu sub-item
    <node  name="separator"
      url=""/>
    <node  name="vendors"
      url="$webapp_accelerator$NewDynamicListView?
       ActionXMLFile=inventory.VendorList&amp;cmd=VendorListView"
      users="catMgr mchMgr"/>
    <node  name="separator"
      url=""/>
  4. 保存文件 WCDE Installation Directory/xml/tools/common/CommerceAcceleratorCPS.xml。经更改后,可以在目录资产商店级别进行供应商数据维护。
  5. 重启开发环境服务器。
  6. 登录到 Accelerator 中并选择 Catalog Asset Store 作为商店。注意:确保您的工具管理员在该组织级别分配了 Category Manager 角色。
  7. 使用 Accelerator 创建一个供应商,进而创建一个目录资产商店级的附属成员。对于 name and addresscontact information 部分,创建一些可度量的内容,确保教程中的后续步骤能够得到合适的评估。例如,AffiliateAssetLevel1AffiliateAssetLevel2
  8. 选择 Stores 按钮,换成另一个商店,最好选择 Example1 作为您创建的第一个托管商店。注意:确保您的工具管理员在该组织级别分配了 Category Manager 角色。
  9. 使用 Accelerator 创建一个供应商,进而创建一个托管商店级的附属成员。对于 name and addresscontact information 部分,创建一些可度量的内容,确保教程中的后续步骤能够得到合适的评估。例如, AffiliateHostedLevel1AffiliateHostedLevel2

填充好附属成员之后,列出共享且特定于托管商店的附属成员,以便进行测试。

首次要使用的代码到

这将是您首次要使用的代码,不仅是为了理解存储路径关系的运作方式,而且将新组建的共享资产纳入到环境中。对于该部分,您要将新代码引入到 WebSphere Commerce 系统中,并了解如何在管理托管商店级资产和管理共享资产之间重用相同的代码库。

链接到本教程的 下载 部分,获取与本教程代码对应的压缩包。将 DWStorePathVendorViewBean.java 类和 DWStorePathVendorConstants.java 类安装到 src 目录下的 WebSphereCommerceServerExtensionsLogic 项目中,构建项目,重启服务器。

要获取列出供应商的代码,请遵循以下步骤:

  1. 选择一个您希望进行定制的托管商店页面,列出附属成员。例如,打开文件 WCDE Installation Directory/workspace/Stores/WebContent/ShoppingArea/CatalogSection/CategorySubsection/TopCategoriesDisplay.jsp
  2. 在文件 HTML 部分的主体将这些代码附加在 JSP 中:
    清单 6. JSP 附加 DWStorePathVendorViewBean 以列出附属成员
    <wcbase:useBean id="dwVendor" 
     classname="com.dw.commerce.common.storepath.beans.DWStorePathVendorViewBean" 
     scope="request" />
      <c:if test="${not empty dwVendor.vendorsList}">
       Affiliates:<br/>
       <c:forEach var="vendorsList" items="${dwVendor.vendorsList}" >
    	 <c:out value="${vendorsList.vendorId}" escapeXml="false" />
    	 <c:out value="${vendorsList.vendorName}" escapeXml="false" />
    	 <br/>
       </c:forEach>
      </c:if>
  3. 打开到托管商店页面的浏览器(例如,Hosted Store Example1),这与您刚才添加代码摘录的 JSP 文件(例如,TopCategoriesDisplay.jsp)相对应。注意:如果用户未登录到商店中,附属成员可能会抛出一个访问控制错误,然后可能需要应用一些其他角色。为显示该数据,可能需要暂时对用户应用站点管理员角色。不过,您可以载入粒度级访问控制,支持在将来重用供应商。
  4. 载入页面之后,您便可以看到在托管商店级别添加的那些供应商的附属成员。

您目前为止所做的就是仅显示属于托管商店级别的附属成员(供应商数据)。您还没有显示属于资产商店级别的附属成员(供应商数据),或者称为 共享 附属资产。对此进行验证的一种简单方式是,另设一家位于同一资产商店下的托管商店。您部署了一个公共资产商店,且在该商店下,您创建了托管商店 Example1 和托管商店 Example2

打开到另一个托管商店页面的浏览器(例如 Hosted Store Example2)。不访问共享资产,就不能在该商店中显示附属成员,因为没有为该级别填充附属成员(供应商数据)。您还没有为这些商店提供共享资产。无需担心,从这里开始您不必再修改代码来查看新创建的共享资产。现在所有共享资产都以商店关系被定义的方式得到支持。

填充附属成员的商店关系

在该部分,您要创建一个自定义商店关系类型。然后将该商店关系类型作为附属成员的指定资产,从而允许在托管商店级别显示资产级共享数据。

  1. 确保测试环境已启动
  2. 从数据库上,准备执行一条 SQL 语句。例如,使用工具包打开浏览器,然后输入以下 URL: http://localhost/webapp/wcs/admin/servlet/db.jsp
  3. 从数据库上,执行以下查询:
    清单 7. JSP 附加 DWStorePathVendorViewBean 以列出附属成员
    delete from streltyp where name = 'com.dw.commerce.storepath.affiliate';
    
    insert into streltyp (name,streltyp_id) 
    values ('com.dw.commerce.storepath.affiliate',5);
    
    insert into storerel (streltyp_id,relatedstore_id,store_id,sequence,state)
    values (
    (select streltyp_id from streltyp where name = 
    'com.dw.commerce.storepath.affiliate'),
    (select store_id from store where directory = 'Example1'),
    (select store_id from store where directory = 'Example1'),1,1)
    
    insert into storerel (streltyp_id,relatedstore_id,store_id,sequence,state) 
    values (
    (select streltyp_id from streltyp where name = 
    'com.dw.commerce.storepath.affiliate'),
    (select store_id from store where directory = 'ExampleCatalogAssetStore'),
    (select store_id from store where directory = 'Example1'),0,1)
  4. 在数据库上确认已执行的 SQL 语句,然后重启 WebSphere Commerce 测试服务器。
  5. 打开到托管商店页面的浏览器(例如 Hosted Store Example1),这与您刚才添加代码摘录的 JSP 文件(例如,TopCategoriesDisplay.jsp)相对应。注意:如果用户未登录到商店中,附属成员可能会抛出一个访问控制错误,然后可能需要应用一些其他角色。为显示该数据,可能需要暂时对用户应用站点管理员角色。不过,您可以载入粒度级访问控制,支持在将来重用供应商。

产生的行为就是,您可以看到资产商店级别和托管商店级别的附属成员数据都显示在页面上。您可以看出将视图仅限制于商店级别和不做代码更改而查看共享数据之间的区别。所需要的就是一个数据库条目,用于查看扩展站点实例上变更的行为。您在环境中引入的代码有一些额外的规则标记可供您设置,以便提供一个更加粒度级的显示。例如,您可以选择:

  • 仅显示托管商店级数据。
  • 一起显示托管商店级数据和资产商店级共享数据。
  • 仅显示资产商店级共享数据。

您也可以使用您定制的同一个 JSP 登录到环境中的其他托管商店。例如,如果您登录到了托管商店 Example2,也可看到属于资产商店级别的附属成员数据。在不改变代码的情况下,使用一组通用的代码,您支配了所有托管商店,以显示一个通用的共享数据集。

小节结束语

对于第一个定制练习,您定制了商店关系,以将新资产引入到扩展站点环境中。该练习的好处是,您有一组通用代码,可轻松显示商店级或资产商店级的共享数据。在下一节,您要创建一个新实体 bean 并了解如何将存储路径关系直接整合到 EJB 层。这为您提供了将自定义商店关系类型整合到不同应用层的灵活性。


控制 Entity Bean 层的共享资产

将新资产整合到扩展站点中

先决条件

在该部分,您要创建一个新实体 bean。一定要为工作做备份,做好恢复到备份的准备。如果在创建新实体 bean 时有任何步骤出错,一般最好从头开始。

注意:这些步骤来源于 WebSphere Commerce Information Center,创建一个新实体 bean。因此,如果您已经参考该页面创建了实体 beans,本教程中惟一的区别在于,有一步包含一个新的 EJB UserFinderDescriptor finder 类型 FinderHelper 方法。您可以跳过整节,继续下一节的内容,因为本节专门回顾如何添加一个 UserFinderDescriptor finder 类型的 FinderHelper 方法。

在将新资产包含到扩展站点时,它如何轻松整合到现有共享资产行为中?在理论上,您的资产归入现有商店关系类型中的其中一种,因为这些组件在 WebSphere Commerce 中已经是模块化的。即使从概念上讲,本着电子商务需求的本质,一个资产也可以在现有商店关系类型中找到合适的位置。一旦发现某个外键属于现有商店关系类型的数据,就会链接、选取和推出新资产。但是,对于本教程,了解如何将扩展站点整合到新建的资产中很重要,这样就能知道所有应用层的代码重用。对于 WebSphere Commerce 中的所有现有资产,了解扩展站点如何成功投入市场,对于您大有裨益。

对于本节的步骤,您要创建一个新表和新实体 bean。其中有一些特殊步骤,这不是创建一个实体 bean 的常见情形。特别地,要对实体 bean 创建一个扩展类,称为 BeanFinderObject 类。通过这个扩展类 BeanFinderObject,只需查看传递到 bean 中的存储路径,即可并入存储关系类型。另外,由于向扩展站点引入了新概念,您要创建所谓的更细粒度级控制的共享资产。这是因为即将创建的新表是一个与产品相关的表。产品数据已经是现有商店关系类型的一部分,这实际上被看作是现有目录资产的一部分。

创建这个实体 bean 时有些步骤是常规步骤的替代方案,以允许新实体 bean 通过一个特有的 SQL 联接语句变得可扩展。实体 bean 需要一个 UserFinderDescriptor finder 类型 FinderHelper 方法来实现商店关系查询的联接。在环境中创建新实体 bean 时,最安全的方式是在一个全新的工具包环境中执行这项任务。这是因为,WebSphereCommerceServerExtensionsData 项目遵循您采取的每一个步骤。如果您不能准确记得如何退回,那么最好重头开始进行。因此,我们建议您尝试使用 Information Center 主题中的步骤创建新实体 bean,这个主题是 创建一个新实体 bean,适应这种方法需要一些时间。如果您有勇气开辟这条新路,而无需练习如何创建实体 beans,那么这种激情将有助于您明确沿途采用的所有步骤。

创建表

要创建实体 bean 将新资产整合到扩展站点中:

  1. 确保测试环境已启动
  2. 从数据库上,准备执行一条 SQL 语句。例如,使用工具包打开浏览器,然后输入以下 URL: http://localhost/webapp/wcs/admin/servlet/db.jsp
  3. 从数据库上,执行以下查询:
    • (DB2®)
      清单 8. DDL:创建一个 DB2 表
      create table XCATENTRY_EXT (
      		CATENTRY_ID BIGINT NOT NULL, 
      		STOREENT_ID BIGINT NOT NULL, 
      		VENDOR_ID BIGINT NOT NULL, 
      		FIELD1 		INTEGER, 
      		FIELD2 		VARCHAR(128), 
        		FIELD3  	DECIMAL(20,5),
        		PRODUCT_TYPE	VARCHAR(128),
      		OPTCOUNTER SMALLINT NOT NULL;
      	
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT PK_XCATENTRYEXT
      	PRIMARY KEY
      	(CATENTRY_ID, STOREENT_ID, VENDOR_ID));
       
      ALTER TABLE XCATENTRY_EXT ADD (
       	CONSTRAINT FK_XCATENTRYEXT_CATENTRYID 
      	FOREIGN KEY (CATENTRY_ID) 
      	REFERENCES CATENTRY (CATENTRY_ID)
      	ON DELETE CASCADE);
      
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT FK_XCATENTRYEXT_STOREENTID 
      	FOREIGN KEY (STOREENT_ID) 
      	REFERENCES STOREENT (STOREENT_ID)
      	ON DELETE CASCADE);
      
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT FK_XCATENTRYEXT_VENDORID 
      	FOREIGN KEY (VENDOR_ID) 
      	REFERENCES VENDOR (VENDOR_ID)
      	ON DELETE CASCADE);
    • (ORACLE®)
      清单 9. DDL: 创建一个 Oracle 表
      create table XCATENTRY_EXT (
      		CATENTRY_ID NUMBER NOT NULL, 
      		STOREENT_ID NUMBER NOT NULL,
      		VENDOR_ID NUMBER NOT NULL, 
              FIELD1 		INTEGER, 
        		FIELD2   	VARCHAR2(128 BYTE),
        		FIELD3  	NUMBER(20,5),
        		PRODUCT_TYPE	VARCHAR2(128 BYTE),
      		OPTCOUNTER SMALLINT NOT NULL;
      		
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT PK_XCATENTRYEXT
      	PRIMARY KEY
      	(CATENTRY_ID, STOREENT_ID, VENDOR_ID));
       
      ALTER TABLE XCATENTRY_EXT ADD (
       	CONSTRAINT FK_XCATENTRYEXT_CATENTRYID 
      	FOREIGN KEY (CATENTRY_ID) 
      	REFERENCES CATENTRY (CATENTRY_ID)
      	ON DELETE CASCADE);
      
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT FK_XCATENTRYEXT_STOREENTID 
      	FOREIGN KEY (STOREENT_ID) 
      	REFERENCES STOREENT (STOREENT_ID)
      	ON DELETE CASCADE);
      
      ALTER TABLE XCATENTRY_EXT ADD (
      	CONSTRAINT FK_XCATENTRYEXT_VENDORID 
      	FOREIGN KEY (VENDOR_ID) 
      	REFERENCES VENDOR (VENDOR_ID)
      	ON DELETE CASCADE);
      	
      COMMENT ON TABLE XCATENTRY_EXT IS 'This table is an extension of the 
      	WCS out of the box CATENTRY table.';
      COMMENT ON COLUMN XCATENTRY_EXT.CATENTRY_ID IS 'Primary key for the table. 
      	Represents a catentry.';
      COMMENT ON COLUMN XCATENTRY_EXT.STOREENT_ID IS 'Primary key for the table. 
      	Represents a store entity.';
      COMMENT ON COLUMN XCATENTRY_EXT.VENDOR_ID IS 'Foreign key for the table. 
      	Represents vendor data representing affiliates.';
      COMMENT ON COLUMN XCATENTRY_EXT.FIELD1 IS 'Extendible field';
      COMMENT ON COLUMN XCATENTRY_EXT.FIELD2 IS 'Extendible field';
      COMMENT ON COLUMN XCATENTRY_EXT.FIELD3 IS 'Extendible field';
      COMMENT ON COLUMN XCATENTRY_EXT.PRODUCT_TYPE IS 'Extendible field for 
      	affiliate related product type recognition';
  4. 如果使用提供的 cloudscape URL,单击 Submit Query。您会看到一条消息,语句产生 0 次更新。

创建实体 Bean

  1. 有了在数据库中创建的表,现在便可以创建新实体 bean 了。一个实体 bean 囊括有关表格的信息。在本教程中,这个表是 XCATENTRY_EXT。总而言之,创建一个实体 bean 需要以下几步:
    1. 创建 bean。
    2. 设置 bean 的隔离级别。
    3. 设置 bean 的安全身份。
    4. 在 bean 中设置方法的安全角色。
    5. 删除和添加一些方法。
    6. 添加 FinderHelper 方法。
    7. 将表映射到 Entity Bean。
    8. 创建一个 Access Bean。
    9. 生成部署代码并重新生成 Access Bean。
  2. 要创建名为 XCATENTRY_EXT 的新实体 bean:
    1. 在 Rational® Application Developer 中,切换到 Enterprise Explorer 视图。
    2. 扩展 EJB Projects > WebSphereCommerceServerExtensionsData
    3. 右键单击 Deployment Descriptor: WebSphereCommerceServerExtensionsData 并选择 New > Enterprise Bean
    4. 在 Create an Enterprise Bean 窗口中:
      1. 选择 Entity bean with container-managed persistence (CMP) fields
      2. 在 Bean name 字段中,输入 XCatentryExt
      3. 在 Source folder 字段中,保留默认值,ejbModule
      4. 在 Default package 字段中,输入 com.dw.commerce.extension.objects
      5. 从 CMP Version 列表中,选择 1.x
      6. 单击 Next
    5. 在 Enterprise Bean Details 窗口中,为 XCATENTRY_EXT 表中的列添加新 CMP 属性:
      1. 选择默认的 CMP 属性 id: java.lang.Integer 并单击 Remove
      2. 单击 Add
        1. 在 Name 字段中,输入 catentryId
        2. 在 Type 字段中,输入 java.lang.Long

          您必须使用 java.lang.Long 数据类型,而非 long 数据类型,因为您试图映射到的 catentryId 列是 BIGINT 或 NUMBER。

        3. 选择 Key Field 复选框,指明该字段是数据库表的主键。
        4. 单击 Apply
        5. 在 Name 字段中,输入 storeentId
        6. 在 Type 字段中,输入 java.lang.Long

          您必须使用 java.lang.Long 数据类型,而非 long 数据类型,因为您试图映射到的 storeentId 列是 BIGINT 或 NUMBER。

        7. 选择 Key Field 复选框,指明该字段是数据库表的主键。
        8. 单击 Apply
        9. 在 Name 字段中,输入 vendorId
        10. 在 Type 字段中,输入 java.lang.Long

          您必须使用 java.lang.Long 数据类型,而非 long 数据类型,因为您试图映射到的 vendorId 列是 BIGINT 或 NUMBER。

        11. 选择 Key Field 复选框,指明该字段是数据库表的主键。
        12. 单击 Apply
        13. 在 Name 字段中,输入 field1
        14. 在 Type 字段中,输入 java.lang.Integer

          您必须使用 java.lang.Integer 数据类型,而非 integer 数据类型。

        15. 确保选中 Access with getter and setter methods 复选框。选中该选项,便可为所有字段自动生成 getter 和 setter 方法。
        16. 取消选中 Promote getter and setter methods to remote interface 复选框。Make getter read-only 复选框便不再可用。取消选中 promote getter and setter methods to remote interface 选项可降低开销、提高性能。由于未将 getter 和 setter 方法推广到远程接口,因此客户端无法访问这些方法。CopyHelper Access Beans 不使用远程接口,而是对远程接口上不存在的 CMP 字段包含 getters 和 setters 方法。

          CopyHelper Access Beans 内的方法将数据写到一个哈希表中,而该表在 commitCopyHelper() 被调用时更新数据库。哈希表可以记录多个数据库变更,然后在一次事务中更新数据库,这不同于每次变更需要一次事务的远程方法。一个名为 refreshCopyHelper() 的方法与 commitCopyHelper() 的功能刚好相反。refreshCopyHelper() 方法从数据库写入哈希表。取消选中该框可确保哈希表得到使用,从而导致性能提升。
        17. 单击 Apply
        18. 在 Name 字段中,输入 field2
        19. 在 Type 字段中,输入 java.lang.String

          您必须使用 java.lang.String 数据类型,而非 string 数据类型。

        20. 确保选中 Access with getter and setter methods 复选框。
        21. 取消选中 Promote getter and setter methods to remote interface 复选框。
        22. 单击 Apply
        23. 在 Name 字段中,输入 field3
        24. 在 Type 字段中,输入 java.lang.BigDecimal
        25. 确保选中 Access with getter and setter methods 复选框。
        26. 取消选中 Promote getter and setter methods to remote interface 复选框。
        27. 单击 Apply
        28. 在 Name 字段中,输入 productType
        29. 在 Type 字段中,输入 java.lang.String

          您必须使用 java.lang.String 数据类型,而非 string 数据类型。

        30. 确保选中 Access with getter and setter methods 复选框。
        31. 取消选中 Promote getter and setter methods to remote interface 复选框。
        32. 单击 Apply
        33. 可选:在 Name 字段,输入 optCounter
        34. 可选:在 Type 字段中,输入 short
        35. 取消选中 Access with getter and setter methods 复选框。
        36. 单击 Apply,然后单击 Close 关闭窗口。
      3. 确保未选中 Use the single key attribute type for the key class 复选框,然后单击 Next。不选择该复选框,便可以确保创建一个关键字分类,并确保与其他 beans 的一致性。
    6. 在 EJB Java Class Details 窗口中:
      1. 要选择 bean 的超类,单击 Browse
      2. 在 Type Selection 窗口中,在 “Select a class using: (any)” 字段中,输入 ECEntityBean,然后单击 OK
      3. 单击 Add 指定远程接口需要扩展的接口。
      4. 在 Type Selection 窗口中,在 “Select an interface using: (any)” 字段中,输入 Protectable,然后单击 OK 选择 com.ibm.commerce.security.Protectable。该接口主要用于保护访问控制下的新资源。
      5. 单击 Next
      6. 取消选中 Add bean to Class Diagram
      7. 单击 Finish
  3. 设置新 bean 的隔离级别:
    1. 扩展 EJB Projects > WebSphereCommerceServerExtensionsData > Deployment Descriptor : > WebSphereCommerceServerExtensionsData > Entity Beans > XCatentryExt
    2. 双击 XCatentryExt bean 打开其部署描述符。
    3. 单击 Access 选项卡。
    4. 在 Isolation Level 文本框旁边,单击 Add
    5. 在 Add Isolation Level 窗口中,选择 Read committed,然后单击 Next
    6. 从 Beans found 列表中,选择 XCatentryExt bean,然后单击 Next
    7. 从 Methods found 列表中,选择 XCatentryExt,以选择其所有方法,然后单击 Finish
    8. 保存工作,并让编辑器继续处于打开状态。
  4. 设置 bean 的安全身份:
    1. 确保 Access 选项卡仍然开着。
    2. 在 “Security Identity (Method Level)” 区域,单击 Add
    3. 选择 Use identity of EJB server,然后单击 Next。“Use identity of EJB server” 字段确保所有 EJB beans 运行于同一安全身份之下。
    4. 从 Beans found 列表中,选择 XCatentryExt bean,然后单击 Next
    5. 从 Methods found 列表中,选择 XCatentryExt,以选择其所有方法,然后单击 Finish
    6. 保存工作,并让编辑器继续处于打开状态。
  5. 接下来,为 bean 中的方法设置安全角色:
    1. 在 Deployment Descriptor 编辑器中,选择 Assembly 选项卡。
    2. 在 Method Permissions 区域,单击 Add
    3. 选择 Security Roles 以及 WCSecurityRole,然后单击 Next。这是 WebSphere Commerce 中所有 EJB beans 的默认安全角色。
    4. 从 beans found 列表中,选择 XCatentryExt 并单击 Next
    5. 在 Method elements 页面,单击 Apply to All,然后单击 Finish
    6. 保存工作。
  6. 下一步是删除与由 Rational Application Developer 生成的实体上下文相关的一些字段和方法。删除这些字段是因为,ECEntityBean 基类自身提供对这些方法的实现。要删除生成的实体上下文字段和方法:
    1. 在 J2EE Navigator 视图中,扩展 WebSphereCommerceServerExtensionsData 项目。
    2. 扩展 Entity Beans > XCatentryExt,然后打开 XCatentryExtBean 类。
    3. 在 Outline 视图中:
      1. 选择 myEntityCtx 字段,并从弹出菜单中选择 Delete
      2. 选择 getEntityContext() 方法,并从弹出菜单中选择 Delete
      3. 选择 setEntityContext(EntityContext) 方法,并从弹出菜单中选择 Delete
      4. 选择 unsetEntityContext() 方法,并从弹出菜单中选择 Delete
    4. 保存工作。让 XCatentryExtBean 类开着。
  7. 将新的 getCatentryId 方法、getVendorId 方法和 getStoreentId 方法添加到企业 bean:
    1. 查看 XCatentryExtBean 类的源代码。
    2. 将以下方法添加到该类的结尾:
      清单 10. XCatentryExtBean Key getters
      public java.lang.Long getCatentryId() {
         return catentryId;
      }
      public java.lang.Long getStoreentId() {
         return storeentId;
      }
      public java.lang.Long getVendorId() {
         return vendorId;
      }
    3. 将新方法添加到远程接口。在 Outline 视图中,右键单击 getCatentryId 方法、getVendorId 方法和 getStoreentId 方法,并选择 Enterprise Bean > Promote to Remote Interface。完成这一步之后,方法旁边显示一个小的 “R” 图标,表示它已经被推广到远程接口。
    4. 保存工作。
    5. 关闭 XCatentryExtBean 类。
  8. WhereClauseFinderDescriptor finder 类型 FinderHelper 方法添加到 XCatentryExtHome 接口中。FinderHelpers 方法支持您编写自己的查找程序,您可能不知道其中的主键,但是需要在其他列上进行选择。一个 FinderHelper 方法包含 bean 的 finder 方法使用的 SQL 语句。会为每个 EJB bean 创建一个 findByPrimaryKey() 方法,但这通常还不够,因为您可能不知道主键。

    将 findByCatentryId FinderHelper 方法添加到 XCatentryExtHome 接口:

    1. 在 EJB Deployment Descriptor 编辑器中,单击 Bean 选项卡。
    2. 在 Beans 面板中,选择 XCatentryExt bean。
    3. 单击 Finders 文本框旁边的 Add
    4. 在 Name 字段中,输入 findByCatentryId
    5. 单击 Parameters 文本框旁边的 Add
      1. 在 Name 字段中,输入 catentryId
      2. 在 Type 字段中,输入 java.lang.Long
      3. 单击 OK
    6. 从 Return Type 列表中选择 Enumeration,然后单击 Next
    7. 从 Finder type 列表中,选择 WhereClauseFinderDescriptor。在该字段中,指定查找器中 select 语句的 where 子句。您必须提供 EJB FinderHelper 方法中一条选择语句的 where 子句。您不需要提供完全的 select 语句,因为 EJB 容器管理表。
    8. 在 Finder statement 字段中,输入 T1.CATENTRY_ID = ?,然后单击 Finish。当 FinderHelper 运行时,将要运行的 SQL 语句是 "select ... FROM XCATENTRY_EXT T1 WHERE T1.CATENTRY_ID = ? "。“?” 由提供给 findByCatentryId(String) 的 “String” 的动态值替换。
    9. 保存工作。

    将一个 findByStoreentId FinderHelper 方法添加到 XCatentryExtHome 接口:

    1. 在 EJB Deployment Descriptor 编辑器中,单击 Bean 选项卡。
    2. 在 Beans 窗格中,选择 XCatentryExt bean。
    3. 单击 Finders 文本框旁边的 Add
    4. 在 Name 字段中,输入 findByStoreentId
    5. 单击 Parameters 文本框旁边的 Add
      1. 在 Name 字段中,输入 storeentId
      2. 在 Type 字段中,输入 java.lang.Long
      3. 单击 OK
    6. 从 Return Type 列表中,选择 Enumeration, then click Next.
    7. 从 Finder type 列表中,选择 WhereClauseFinderDescriptor。在该字段中,指定查找器中 select 语句的 where 子句。您必须提供 EJB FinderHelper 方法中一条选择语句的 where 子句。您不需要提供完全的 select 语句,因为 EJB 容器管理表。
    8. 在 Finder statement 字段中,输入 T1.STOREENT_ID = ?,然后单击 Finish。当 FinderHelper 运行时,将要运行的 SQL 语句是 "select ... FROM XCATENTRY_EXT T1 WHERE T1.STOREENT_ID = ? "。“?” 由提供给 findByStoreentId(String) 的 “String” 的动态值替换。
    vendorId 字段可能还有一个 FinderHelper 方法。
  9. 现在添加一个 UserFinderDescriptor finder 类型。有了这个 FinderHelper 方法,您就可以扩展实体 Bean 的 FinderHelper 方法。扩展即意味着要包含一个 BeanFinderObject。这是本教程的一个关键步骤,将实体 Bean 链接到扩展站点行为。BeanFinderObject 支持一个特殊的存储路径关系查询。

    将一个 findByCatentryIdVendorIdStorePathId FinderHelper 方法添加到 XCatentryExtHome 接口:

    1. 在 EJB Deployment Descriptor 编辑器中,单击 Bean 选项卡。
    2. 在 Beans 窗格中,选择 XCatentryExt bean。
    3. 单击 Finders 文本框旁边的 Add
    4. 在 Name 字段中,输入 findByCatentryIdVendorIdStorePathId
    5. 单击 Parameters 旁边的 Add
      1. 在 Name 字段中,输入 catentryId
      2. 在 Type 字段中,输入 java.lang.Long
      3. 单击 OK
      4. 在 Name 字段中,输入 storeentId
      5. 在 Type 字段中,输入 java.lang.Long
      6. 单击 OK
      7. 在 Name 字段中,输入 vendorId
      8. 在 Type 字段中,输入 java.lang.Long
      9. 单击 OK
    6. 从 Return Type 列表中,选择 Enumeration,然后单击 Next
    7. 从 Finder type 列表中,选择 UserFinderDescriptor。在该字段中,指定查找器中 select 语句的 where 子句。
    8. 在 Finder statement 字段中,它现在应该已为所有条目禁用。
    9. 保存工作。
    现在您已经创建了一个 UserFinderDescriptor finder 类型 FinderHelper 方法,稍后您要创建一个 BeanFinderObject 并将其命名为 XCatentryExtBeanFinderObject.java,以供 finder 方法 findByCatentryIdVendorIdStorePathId 获取。
  10. 接下来使用中间相遇映射将 XCATENTRY_EXT 表映射到 XCatentryExtBean 实体 bean。

    要创建映射:

    1. 打开 Data 透视图,切换到 Data Definition 视图。
    2. 导航到以下目录:WebSphereCommerceServerExtensionsData > ejbModule > META-INF
    3. 选择 META-INF,并从弹出菜单中选择 New > Database Definition
    4. (DB2)(Oracle)在 Database name 字段中,输入开发数据库的名称。没有默认的数据库名称。(Cloudscape)默认数据库名称为 mall

      注意:在 Database name 字段中输入的名称未使用。在创建一个数据库定义时,创建 XMI 文件,以供稍后用于生成部署代码。这些 XMI 文件独立于数据库名称。

    5. 从 Database vendor type 列表中,选择以下类型之一:
      • (DB2)(Cloudscape)
        • (WebSphere Commerce Professional)(WebSphere Commerce Enterprise)DB2 Universal Database V8.2
        • (WebSphere Commerce - Express)DB2 Universal Database Express V8.2
        • DB2 Universal Database for iSeries V4R5
      • (Oracle)Oracle 9i or Oracle 10g,具体取决于目标数据库。
    6. 单击 Finish。如果要求确认是否创建 /WebSphereCommerceServerExtensionData/ejbModule/META-INF/backends/databaseType 文件夹,单击 Yes
    7. 导航到以下目录:WebSphereCommerceServerExtensionsData > ejbModule > META-INF > backends > databaseType > databaseName,其中 databaseType 是您在上一步中选择的数据库类型,而 databaseName 是您的开发数据库的名称。
    8. 选择 databaseName,并从弹出菜单中选择 New > Schema Definition
    9. 在 Schema name 字段中,输入 NULLID 并单击 Finish。将 NULLID 作为模式名,是因为这为 EJB beans 提供在任何模式下工作的灵活性。如果用 NULLID 以外的某个值填充模式名,EJB bean 仅对使用某个模式创建的表有效。
    10. 右键单击 NULLID 并选择 New > Table Definition
    11. 在 Table name 字段中,输入 XCATENTRY_EXT 并单击 Next
    12. 将以下列添加到表定义中:
      列名列类型关键列
      CATENTRY_ID
      • (DB2) BIGINT
      • (Oracle) NUMBER
      • (Cloudscape)根据目标数据库选择 BIGINTNUMBER
      已选中
      STOREENT_ID
      • (DB2) BIGINT
      • (Oracle) NUMBER
      • (Cloudscape)根据目标数据库选择 BIGINTNUMBER
      已选中
      VENDOR_ID
      • (DB2) BIGINT
      • (Oracle) NUMBER
      • (Cloudscape)根据目标数据库选择 BIGINTNUMBER
      已选中
      FIELD1INTEGERClear
      FIELD2
      • (DB2) VARCHAR(128)
      • (Oracle) VARCHAR2(128 BYTE)
      • (Cloudscape)选择 VARCHAR(128)
      Clear
      FIELD3
      • (DB2) DECIMAL(20,5)
      • (Oracle) NUMBER(20,5)
      • (Cloudscape)选择 DECIMAL(20,5)
      Clear
      PRODUCT_TYPE
      • (DB2) VARCHAR(128)
      • (Oracle) VARCHAR2(128 BYTE)
      • (Cloudscape)选择 VARCHAR(128)
      Clear
      OPTCOUNTERSMALLINTClear
    13. 单击 Finish
    14. 切换到 J2EE 透视图,并在 Enterprise Explorer 视图中选择 EJB Projects > WebSphereCommerceServerExtensionsData
    15. 选择 WebSphereCommerceServerExtensionsData,并从弹出菜单中选择 EJB to RDB Mapping > Generate MapUse an existing backend folder 单选按钮是预选选定的。单击 Next
    16. 选择 Meet In The Middle 并单击 Next
    17. 选择 Match By Name 并单击 Finish
    18. 在 Enterprise Beans 窗格中,突出显示 XCatentryExt bean。在 Tables 窗格中,突出显示 XCATENTRY_EXT 表。
    19. 将 XCatentryExt bean 中的字段映射到 XCATENTRY_EXT 表中的列,方法是从 bean 的弹出菜单中选择 Match By Name
    20. 保存文件,并让映射编辑器开着。
  11. 要启用乐观锁定:
    1. 在部署描述符中启用乐观锁定:
      1. Enterprise Explorer view 中,导航到 EJB Projects > WebSphereCommerceServerExtensionsData > Deployment Descriptor : > WebSphereCommerceServerExtensionsData
      2. 打开部署描述符以供编辑。
      3. Bean 选项卡中,选择 XCatentryExt bean。
      4. 在右下窗格中,滚动到 Concurrency Control 区域。
      5. 选择 Enable optimistic locking
      6. 保存更改。
    2. 设置 optcounter 字段的乐观谓词值:
      1. 在映射编辑器中,Map.mapxmi 文件应当还开着。
      2. Overview 区域,在 Enterprise Beans 窗格中,选择 optcounter : short
      3. 选择 Properties 视图,并从 OptimisticPredicate 列表中选择 true
    3. 保存更改。
  12. 创建一个访问 bean:
    1. 有以下两种方式:
      • 要么选择 File > New > Access Bean
      要么遵从以下步骤:
      • 右键单击 WebSphereCommerceServerExtensionsData 项目并选择 New > Others...
      • 从 New 向导中,选择 EJB> Access Bean
    2. 单击 Next
    3. 选择 Copy helper 并单击 Next
    4. 选择 XCatentryExt bean 并单击 Next
    5. 从 Constructor Method 列表中,选择 findByPrimaryKey(com.dw.commerce.extension.objects.XCatentryExtKey) 并单击 Finish
    6. 在 EJB Deployment Descriptor Editor 中,在 Overview 选项卡中,滚动到 JNDI - CMP Connection Factory Binding 区域,在 JNDI name 字段中,输入与数据库类型匹配的值:
      • jdbc/WebSphere Commerce Cloudscape DataSource demo
      • (DB2) jdbc/WebSphere Commerce DB2 DataSource demo
      • (i5/OS) jdbc/WebSphere Commerce iSeries DataSource demo
      • (Oracle) jdbc/WebSphere Commerce Oracle DataSource demo

        确保 JNDI 名称后面无空格。如有空格,会在创建绑定时出错。

    7. 保存更改。
  13. 生成部署代码并重新生成 XCatentryExtAccessBean。代码生成实用程序分析 beans,以确保符合 Sun® Microsystems EJB 规范,并确保遵从特定于 EJB 服务器的规则。此外,对于每个选定的 bean,代码生成工具为本地和远程接口生成本地和 EJBObject(远程)实现和实现类,以及 JDBC persister 类和 CMP beans 的 finder 类。它还生成 Java™ ORB、存根和 RMI/IIOP 访问所需的绑定类,以及本地和远程接口的存根。

    要生成部署代码:

    1. 导航到 EJB projects > WebSphereCommerceServerExtensionsData
    2. 选择 WebSphereCommerceServerExtensionsData 项目。
    3. 从项目的弹出菜单中,选择 Deploy
    4. 生成部署代码之后,Rational Application Developer 重新构建工作空间。完成工作空间的构建之后,确保在 Problems 视图中无任何错误。
  14. 要重新生成 XCatentryExtAccessBean:
    1. 在 Enterprise Explorer 视图中,导航到 EJB Projects > WebSphereCommerceServerExtensionsData > Deployment Descriptor: > WebSphereCommerceServerExtensionsData
    2. 从部署描述符弹出菜单中,选择 Access Beans > Regenerate Access Beans
    3. 在 “Select access beans to regenerate” 窗口上,单击 Deselect All
    4. 仅选择 XCatentryExtAccessBean
    5. 单击 Finish
    6. 保存所有文件。

小节结束语

在该节中,您使用一个特殊步骤,即附加 UserFinderDescriptor finder 类型 FinderHelper 方法,创建了一个实体 bean。这个 UserFinderDescriptor finder 类型 FinderHelper 方法允许您额外创建一个 BeanFinderObject 类,该类扩展实体 bean,以包含存储路径关系类型查询以及表数据查找器。


使用 BeanFinderObject 扩展新资产

先决条件

如果您已经有了新创建的实体 bean,本节有一个审查步骤,可使用一个新的 UserFinderDescriptor finder 类型 FinderHelper 方法更新这个实体 Bean。如果您还没有可包含 BeanFinderObject 类的实体 bean,那么查看上一步创建一个新实体 bean。

本教程引入了附属成员的概念,目的在于通过使用商店关系和商店关系类型定制扩展站点。本节要将一个自定义存储路径关系查询引入到一个新建资产中。如果您使用的实体 Bean 有一个 UserFinderDescriptor finder 类型 FinderHelper 方法,那么与实体 bean 使用相同命名约定的 BeanFinderObject 类会被自动执行。例如,如果实体 bean 名为 XCatentryExt,那么 XCatentryExtBeanFinderObject 将是该类的名称。

添加一个新的 UserFinderDescriptor finder 类型 FinderHelper 方法

要更新现有实体 bean,例如,XCatentryExt:

  1. 在 Rational Application Developer 中,切换到 Enterprise Explorer view
  2. 扩展 EJB Projects > WebSphereCommerceServerExtensionsData
  3. 双击 Deployment Descriptor : WebSphereCommerceServerExtensionsData
  4. 在 EJB Deployment Descriptor 编辑器中,单击 Bean 选项卡。
  5. 在 Beans 窗格中,选择 XCatentryExt bean。
  6. 单击 Finders 文本框旁边的 Add
  7. 选择 Bean 选项卡。
  8. 将一个 UserFinderDescriptor finder 类型 FinderHelper 方法添加到 XCatentryExtHome 接口。

    有了这个 FinderHelper 方法,您就可以扩展实体 Bean 的 FinderHelper 方法。扩展即意味着要包含一个 BeanFinderObject。这是本教程的一个关键步骤,将实体 bean 链接到扩展站点行为。BeanFinderObject 支持一个特殊的存储路径关系查询。

    将一个 findByCatentryIdVendorIdStorePathId FinderHelper 方法添加到 XCatentryExtHome 接口:

    1. 在 EJB Deployment Descriptor 编辑器中,单击 Bean 选项卡。
    2. 在 Beans 窗格中,选择 XCatentryExt bean。
    3. 单击 Finders 文本框旁边的 Add
    4. 在 Name 字段中,输入 findByCatentryIdVendorIdStorePathId
    5. 单击 Parameters 文本框旁边的 Add
      1. 在 Name 字段中,输入 catentryId
      2. 在 Type 字段中,输入 java.lang.Long
      3. 单击 OK
      4. 在 Name 字段中,输入 storeentId
      5. 在 Type 字段中,输入 java.lang.Long
      6. 单击 OK
      7. 在 Name 字段中,输入 vendorId
      8. 在 Type 字段中,输入 java.lang.Long
      9. 单击 OK
    6. 从 Return Type 列表中,选择 Enumeration,然后单击 Next
    7. 从 Finder type 列表中,选择 UserFinderDescriptor。在该字段中,指定查找器中 select 语句的 where 子句。
    8. 在 Finder statement 字段中,它现在应该已为所有条目禁用。
    9. 保存工作。

现在您已经创建了一个 UserFinderDescriptor finder 类型 FinderHelper 方法,您稍后要创建一个 BeanFinderObject,并将其命名为 XCatentryExtBeanFinderObject.java,以供 finder 方法 findByCatentryIdVendorIdStorePathId 获取。

添加 BeanFinderObject

现在实体 Bean XCatentryExt 有了新的 UserFinderDescriptor finder 类型 FinderHelper 方法,实体在搜寻一个名为 XCatentryExtBeanFinderObject 的类。本教程附带一些代码,您可以使用它们来满足 XCatentryExtBeanFinderObject 类的要求,同时还有一些用于包含存储路径关系类型查询的特殊逻辑。

链接到本教程的 下载 部分,获取与本教程代码相对应的压缩包,确保将 XCatentryExtBeanFinderObject.java 类和 XCatentryExtSqlHelper.java 类安装到 ejbModule 目录下的 WebSphereCommerceServerExtensionsData 项目中,构建项目,重启服务器。

打开 XCatentryExtBeanFinderObject 类的代码。注意,该类扩展 JDBCFinderObject,被假定为扩展 VapEJSJDBCFinderObject,进而满足了实体 bean 的 WHERE 子句要求。XCatentryExtBeanFinderObject 类将调用 VapEJSJDBCFinderObject 方法,协助创建一个扩展 SQL 以供 bean 用来从 XCATENTRY_EXT 表获取数据。特别地,getMergedPreparedStatement 方法是从 VapEJSJDBCFinderObject 类调用的,该类包含实体 bean 用于获取数据的完整 SQL 语句。XCatentryExtBeanFinderObject 类创建 WHERE 子句,而实体 bean 本身处理 SQL 语句的其余部分。

本教程特别添加了一些内容,XCatentryExtBeanFinderObject 包含一些支持参数化 SQL 的额外逻辑。由于 XCatentryExtBeanFinderObject 将参数附加到 WHERE 子句,如果打算包含这些参数,那么它可能也是一条参数化 SQL 语句。如果打算做,就要做好。当将新参数添加到查询时,ArrayListarList 附加到该参数后面。所有参数化参量都被发送到 SQL 语句所在的 PreparedStatement。

与 XCatentryExtBeanFinderObject 相关的 SQL Helper 类拥有大部分代码。现在看一下所涉及的每个方法。

表 2. 与 XCatentryExtBeanFinderObject 相关的 SQL Helper 类
方法输入返回值说明
getStorePathInteger storeId, String storePathTypeInteger[]storePathType 是存储关系类型,在本例中为: com.dw.commerce.storepath.affiliate。 实用工具类和方法被调用: com.ibm.commerce.common.helpers.StoreUtil.
getStorePath(storeId,storePathType)
,这将返回与存储关系类型值的输入 storeId 相关的所有商店。
toInQueryClauseint(参数的个数)返回一个参数化 SQL IN 子句(例如,"IN(?,?)")这个方法调用自 CatalogSqlHelper.
toInQueryClause(nParameters)
。它很整洁,因为它使用 ? 作为参数化 SQL 语句的标记来返回查询。
setParametersInWhereClausePreparedStatement ps, int (1), ArrayListPreparedStatement输入是一个 PreparedStatement,它正确返回同一个 PreparedStatement 以及其他参数集,以表示一个参数化 SQL。这确保实体 bean 将 SQL 语句作为一个参数化 SQL 语句进行处理。

粒度设计方法

获得 XCatentryExtBeanFinderObject 之后,您可以轻松调用 XCatentryExtAccessBean,并调用 UserFinderDescriptor finder 类型 FinderHelper 方法,findByCatentryIdVendorIdStorePathId。这被看作是一个更粒度级的数据共享,因为已经假定 CatentryId 通过商店关系类型 com.ibm.commerce.catalog 完成了共享过滤。因此,调用附属商店关系类型 com.dw.commerce.storepath.affiliate 的目的是,在商店关系类型 com.ibm.commerce.catalog 已经过滤了 catentry 对象之后过滤共享资产。在某种程度上,如果您仅希望处理某个托管商店能够共享的目录资产,那么这对您很有益。如果您需要同时过滤目录资产和附属资产,那么可以简单地在 XCatentryExtBeanFinderObject 类中的 where 子句中包含另一个字查询,这个类是 findByCatentryIdVendorIdStorePathId 方法所在地。

通过一个 Test 命令调用 findByCatentryIdVendorIdStorePathId 方法

如果您之前没有使用过实体 beans,请遵循 WebSphere Commerce Information Center 中的教程,创建新业务逻辑,了解如何将新实体 beans 包含到 WebSphere Commerce 环境中。

清单 11 中的代码片段展示如何实例化并将数据从 XCatentryExtAccessBean 拉到控制器命令中。

清单 11. 调用 XCatentryExtAccessBean findByCatentryIdVendorIdStorePathId
XCatentryExtAccessBean xcatExt = new XCatentryExtAccessBean();
Long longCatEntryId = new Long(catEntryId);
Long longVendorId = new Long(vendorId);
Long longStoreentId = new Long(storeentId);
try { 
	XCatentryExtAccessBean prodAB = null;
	for(Enumeration productList = 
	  xcatExt.findByCatentryIdVendorIdStorePathId(
	    longCatEntryId,longStoreentId,longVendorId); 
		productList.hasMoreElements(); )
	{
		prodAB = 
		  (XCatentryExtAccessBean)productList.nextElement();
		if (prodAB!=null)
		{
			// trace out prodAB.getXXX();
		}
	}
}
catch (FinderException e) {
	// trace exception and throw
}

小节结束语

在该部分,您额外采取了几个步骤来将新实体 bean 包含到 WebSphere Commerce 环境中。联属营销意在提供一个向第三方的委托,以鼓励提高商店产品流量。您创建的这个表有一些可扩展字段:FIELD1FIELD2FIELD3。您可以使用这些字段阐明产品委托协议,附属成员将该协议用作销售产品的动因。例如,对于一个给定产品,您可以指定,如果附属成员为扩展站点环境中的所有商店销售产品,则可以获得所售价格的 5% 的佣金。但是对于某个托管商店,您可以设置更高的佣金额度。商店关系表 STOREREL 有一个顺序列,允许您设定商店关系的共享优先级。您可以通过不同方式为不同需求使用该列,而让代码通用于所有商店。

使用嵌入实体 bean 的存储路径关系查询,可轻易实现这些共享和托管级别的委托,使用一段通用代码来驱动引擎。您甚至可以更进一步寻找一种扩散性方法来重用 Replenishment Advisement 表(RARADETAIL),通过这种方式跟踪销售您产品的附属成员销售活动。因此,设计细则需要进行要求和差距分析,因为在特定业务场景中有多种方式可以实现这一目的。

这个新资产,即联属网络,很轻松便被定制到 WebSphere Commerce 中,通过存储路径关系类型重用扩展站点框架。在使用 WebSphere Commerce 这样的一流软件时不要太过被动,本教程不仅阐述如何重用扩展站点框架,而且探寻各种方法来重用软件的所有组件,以满足未来业务用户群的需求。联属网络是组织行为发展中的下一步,可能还是您推进电子商务策略的下一步。不管您的新资产是什么,现在您知道如何将它们集成到扩展站点框架中。


回归测试

先决条件

该部分回顾本教程前面的所有步骤。这种组织安排是为了让您有一个入手点一览单,便于您测试新资产以及它们如何受到扩展站点框架的影响。

该部分包含一个对回归测试的简况,以便确认将新资产引入了扩展站点。这里的构想是,创建大量托管商店、大量商店关系条目以及大量附属成员。回归测试需要测试这些实体的所有可能的组合,并测试它们之间没有任何交互的情况。

要执行回归测试,确保商店和数据均已设置妥当。因此,要完成本教程的这个部分,您需要通览整个教程,确保已经采取了必要的步骤满足先决条件。这里有个快速清单,用于检查执行成功的回归测试所需的步骤均已到位:

托管商店
确保创建了托管商店。在该回归测试场景中,您需要设置三个托管商店。参见 创建商店 Example1 创建其他托管商店。
测试数据
确保为每个商店和资产商店设置了附属成员数据。参见 创建附属成员 来创建附属成员数据。
STOREREL 条目
确保输入了正确的商店关系条目。参见 填充附属成员的商店关系,根据每个测试添加商店关系。您需要根据所测试的商店和所执行的测试对 SQL 语句进行调整。例如,如果您查看回归真值表(表 3),Store 列是 SQL 语句中的 store_id 字段数据。Related Store* 列被看作是 SQL 语句中的 relatedstore_id 字段数据,您要为表 3 中所列的回归测试的每一行调整该 SQL 语句。
表 3. 对所有场景执行回归测试
商店测试测试路径相关的资产商店数据Store 1 相关数据Store 2 相关数据Store 3 相关数据
Store 1存储路径默认测试 1-查看的结果:Affiliate 2--
存储路径测试 1数据库条目:STOREREL
查看的结果:Affiliate 1
---
存储路径测试 2-数据库条目:STOREREL
查看的结果:Affiliate 2
--
存储路径测试 3数据库条目:STOREREL
查看的结果:Affiliate 1
数据库条目:STOREREL
查看的结果:Affiliate 2
--
Store 2存储路径默认测试 2--查看的结果:Affiliate 3-
存储路径测试 4数据库条目:STOREREL
查看的结果:Affiliate 1
---
存储路径测试 5--数据库条目:STOREREL
查看的结果:Affiliate 3
-
存储路径测试 6数据库条目:STOREREL
查看的结果:Affiliate 1
-数据库条目:STOREREL
查看的结果:Affiliate 3
-
Store 3存储路径默认测试 3----

上面的交互点表现为:

商店测试
该列与您在浏览器中打开的托管商店相对应,目的在于测试每个场景的结果。
数据库条目
这是数据库中用于定义店头排和店头列之间的商店关系的条目。
查看的结果
根据商店关系行,预期在测试中显示的任何条目都会在这里显示。

小节结束语

根据这个真值表的结构,您测试的每个商店为您提供预期结果。您可以将该页打印出来,跟踪所显示的每个商店、商店关系和数据集的测试结果,这对您来说大有裨益。在对所有可能场景执行了回归测试之后,您就可以开始将商店关系模型纳入到与定制到 WebSphere Commerce 的新资产相关的所有需求中。


结束语

定制 WebSphere Commerce 来满足业务逻辑首先需要明确您处理的是什么资产。将业务资产归类也意味着要找出与已经在 WebSphere Commerce 中定义的那些商店关系类型的共同点。以下是已经在一个经过上市部署的扩展站点中定义的商店关系类型:

  • com.ibm.commerce.businessPolicy
  • com.ibm.commerce.campaigns
  • com.ibm.commerce.catalog
  • com.ibm.commerce.command
  • com.ibm.commerce.hostedStore
  • com.ibm.commerce.price
  • com.ibm.commerce.referral
  • com.ibm.commerce.segmentation
  • com.ibm.commerce.URL
  • com.ibm.commerce.view
  • com.ibm.commerce.inventory
  • com.ibm.commerce.storeitem
  • com.ibm.commerce.channelStore
  • com.ibm.commerce.propertyFiles
  • com.ibm.commerce.currency.conversion
  • com.ibm.commerce.currency.format
  • com.ibm.commerce.currency.supported
  • com.ibm.commerce.currency.countervalue
  • com.ibm.commerce.measurement.format
  • com.ibm.commerce.contract
  • com.ibm.commerce.promotion
  • com.ibm.commerce.shipping.shipmode
  • com.ibm.commerce.shipping.shipjurisdiction
  • com.ibm.commerce.shipping.calculation

如果您觉得您的业务逻辑在处理不属于上市商店关系类型的资产,那么您可以创建一个自定义商店关系类型。

清单 12. 商店关系类型条目示例
insert into streltyp (name,streltyp_id) 
values ('com.dw.commerce.storepath.affiliate',5);

这个新商店关系类型可能与其他商店关系类型不相容,或者可以将它们看作是另一个商店关系类型的资产子集。您可以创建新的商店关系类型来对现有 WebSphere Commerce 资产提供更粒度级的控制。这样一来,您就无需编写特定于某个商店的代码,而是有一个公共代码库,可供任何商店基于它们在商店关系条目中的参与度而加以使用。如果您将一个商店关系类型的资产与属于另一个资产集的资产一同调用,那么您可能需要过滤返回的结果,方法就是,检查返回的商店标识符值,如果商店标识符属于另一个商店关系,那么忽略该值。例如,如果您仅确定商店级的附属成员的资产,但是资产商店级别上定义了目录商店关系类型,那么您可能需要检查返回的相关的商店标识符值,以确保没有冲突。

您可以使用一个简单的实用工具类来获取某个给定商店关系类型和商店标识符的所有相关的商店标识符。该工具类就是 com.ibm.commerce.common.helpers.StoreUtil.getStorePath(storeId,storePathType)。一个商店标识符值数组返回。数组的索引与 STOREREL 表上的序列值一致。如何使用该数据,这取决于您。要么使用所有值根据商店标识符外键查找对应的资产,要么基于一些条件规则使用数组上的具体索引。

在处理实体 beans 时,您可以基于商店关系直接将子查询附加到 EJB UserFinderDescriptor finder 类型 FinderHelper 方法中。具体方法是包含一个实体 bean 选取的、用于合并 SQL 语句的 BeanFinderObject 类。


下载

描述名字大小
样例存储路径和 BeanFinderObject 类StorePathNBeanFinderObject.zip10KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=627183
ArticleTitle=在 WebSphere Commerce 中创建有关扩展站点框架的解决方案
publish-date=02162011