构建 SOA 组合业务服务,第 8 部分: 使用 WebSphere Portlet Factory 动态概要构建多个承租者的 Portlet

这篇文章是本系列文章的第 8 部分,主要介绍组合业务服务 (CBS) 的开发。CBS 提供了集成现有技术和产品以反映所需业务意图的功能,如可配置性。IBM WebSphere® Portlet Factory 是一种 Portlet 创建环境,它可以简化和加速 Portlet 的开发、部署、维护和重用。本文介绍了通过利用动态概要,如何使用 WebSphere Portlet Factory 在表示层中实现可配置性。

Ying Chun Guo (guoyingc@cn.ibm.com), 软件工程师, EMC

author photoYing Chun Guo 是 China Technology Institute 中国软件开发实验室的一名软件工程师。她目前从事组合业务服务 (CBS) 和面向服务的体系结构 (SOA) 方面的工作。



Mary Taylor (marytaylor@us.ibm.com), 高级软件工程师, IBM

Mary Taylor photoMary Taylor 是一名高级软件工程师。她在 Strategic Technology Architecture and Incubation 团队工作,目前正在进行一项 SOA CBS 试验。她感兴趣的领域包括 DB2 和 DataStage。



2007 年 9 月 13 日

引言

WebSphere Portlet Factory 的动态概要分析功能可以帮助开发人员从一个代码库创建多个、高度自定义的应用程序。使用这种动态概要分析功能,您可以在公共的概要集 中定义各种变量,并且共享环境中的多个承租者都可以对这个概要集进行配置。通过将这些经过配置的概要应用到 Portlet,以更改其外观、内容、以及 Portlet 的行为,就可以创建多个应用程序。在本文中,您将看到对第 1 部分中所描述的多个承租者场景的扩展。在第 8 部分中,您将了解如何为一个用于银行业务的组合应用程序中的多个承租者实现、管理和指定 WebSphere Portlet Factory 概要。本文对动态概要分析配置功能与 Portlet 所提供的基本配置功能进行了对比,并以此作为结束。

定义场景

图 1 中描述了 Jivaro 银行业务的用例,并以此展示了动态概要功能。

图 1. Jivaro 用例
Jivaro 用例

该场景的参与者包括:

  • Bank Provider Operations Administrator:对 Jivaro Bank 的银行概要具有配置权限的管理员。
  • Bank Administrator:每个托管银行中可以通过 Web 页面执行帐号操作的管理员。
  • Bank Customers:托管银行中具有通过 Web 页面查看其帐号信息的权限的客户。

帐号对象是这个场景中的主体。这个场景说明了 Jivaro 环境中的两个银行 Bank1 和 Bank2 如何在每个银行的门户中自定义公共帐号对象的显示外观。

实现场景

WebSphere Portlet Factory 运行时可以在门户服务器中作为公共的动态 Web 应用程序运行。在这个场景中,每个银行配置了一个概要,WebSphere Portlet Factory 使用这个概要来生成不同的 Portlet。当银行客户登录到他们的银行中时,门户服务器将选择他们的银行所对应的概要,以便为门户提供相应的参数。图 2 在左边和右边分别显示了两个不同的 Web 页面,它们是使用不同的概要并根据相同的代码生成得到的。请注意,其中的标签和可选项的值是不同的。Bank 001 将第六个字段标记为 Account Name,而 Bank 002 将第六个字段标记为 Branch。在 Account Type 字段中,Bank 001 提供了两种选择(savings 或 checking),而 Bank 002 提供了三种选择(savings、checking 和 external)。

图 2 中顶部的 Portlet 显示了 Banking Provider Operations Administrator 的配置功能。

图 2. 概要机制
概要机制

首先,Bank1 和 Bank2 可以使用 WebSphere Portlet Factory 创建 Portlet。这涉及到创建银行管理员管理银行中帐号信息所使用的 SubscriberAccount Portlet,以及银行客户查看其帐号信息所使用的 UserAccountsView Portlet。然后,您可以实现自定义 Portlet 所需的动态概要,在下面的部分中将对其进行介绍。

步骤 1:对这些 Portlet 进行概要分析

概要分析活动涉及到三个步骤:

  1. 使用 WebSphere Portlet Factory Designer 中的 Profile Set Manager 创建一个概要集。概要集是一个容器,它可以存储与该概要集相关联的概要所使用的一组参数。对于这个示例,创建一个名为“J2BWPFportletsConfigPS”的概要集,然后添加表示银行基本属性、Web 服务端点和高级配置参数的概要条目,如字段的显示/隐藏状态。
  2. 为每个银行创建一个概要。创建两个名为 bank1 和 bank2 的概要。
  3. 在这些概要中设置参数的值。下一个部分中将进行详细地描述。

提示:为了确保多个 Portlet 能够使用相同的概要集,可以将它们集成到相同的 WebSphere Portlet Factory 项目中。同一个 WebSphere Portlet Factory 项目中的所有模型,可以共享相同的概要集。

步骤 1a:对基本属性进行概要分析

在 Jivaro Bank 中,每个银行都具有唯一的标识符和名称。需要将这些基本属性设置为可配置的参数。

  1. 打开名为 bankId 的 Variable builder。
  2. 单击 Initial Value 旁边的概要机制图标。
  3. 在 Profile Input 提示对话框中,选择 J2BWPFportletsConfigPS 作为 Profile Set Name,并且选择 bankId 作为 Profile Entry Name(请参见图 3)。
  4. 编辑条目的值。将 bank1 的概要设置为 001,并将 bank2 的概要设置为 002。
  5. 单击 OK。
图 3. 概要变量 bankId
概要变量 bankId

步骤 1b:对 Web 服务的端点进行概要分析

对于不同的承租者,Web 服务端点也有所不同。需要将这些端点指定为相应的参数。

  1. 打开 Web Service Call builder,然后单击 Advanced 以打开高级输入。
  2. 单击 Service URL (override) 旁边的概要机制图标。
  3. 在 Profile Input 提示对话框中,选择 J2BWPFportletsConfigPS 作为 Profile Set Name,并选择 accountQueryWithoutSelectorEP 作为 Profile Entry Name(请参见图 4)。
  4. 编辑概要 bank1 和概要 bank2 的条目值。
  5. 单击 OK。
图 4. 对服务端点进行概要分析
对服务端点进行概要分析

步骤 1c:对显示/隐藏状态进行概要分析

Bank1 需要 AccountName 和 Descriptionion 字段,而 Bank2 并不需要。通过显示/隐藏状态,可以对这个行为进行设置。

  1. 打开 Add Account Web 页面中的 Data Column Modifier builder。确保选中了 Manage Columns 旁边的复选框。
  2. 单击列表格中 AccountName 行左边的概要机制图标。
  3. 在 Profile Row of Inputs 提示对话框中,单击 Status 旁边的概要机制图标(请参见 图 5)。
  4. 在 Profile Input 提示对话框中,选择 J2BWPFportletsConfigPS 作为 Profile Set Name,并选择 account_AccountName_Enable 作为 Profile Entry Name(请参见图 6)。
  5. 编辑条目的值,设置显示 bank1 概要,并设置隐藏 bank2 概要。
  6. 单击 OK。
图 5. 概要行
概要行
图 6. 对显示/隐藏状态进行概要分析
对显示/隐藏状态进行概要分析

步骤 1d:对字段描述进行概要分析

WebSphere Portlet Factory 提供了配置字段描述的功能。AccountName 的描述可以作为一个示例。

  1. 打开 Add Account Web 页面中的 Data Column Modifier builder。确保选中了 Manage Columns 旁边的复选框。
  2. 单击列表格中 AccountName 行左边的概要机制图标。
  3. 当您看到 Profile Row of Inputs 提示对话框时,单击 Column Heading 旁边的概要机制图标(请参见图 5)。
  4. 在 Profile Input 提示对话框中,选择 J2BWPFportletsConfigPS 作为 Profile Set Name,并选择 account_AccountName 作为 Profile Entry Name(请参见图 7)。
  5. 编辑条目的值:将 Account Name 设置为 bank1 概要,并将 Branch 设置为 bank2 概要。
  6. 单击 OK。
图 7. 对字段描述进行概要分析
对字段描述进行概要分析

步骤 1e:对选项列表的值进行概要分析

还可以配置某个字段的可选值。AccountType 就是一个示例。

  1. 为该模型添加 Data Field Modifier builder。
  2. 将输入 Field Selector Tool 设置为 Select By Name,并将输入字段设置为 AccountType 在 Data Page 中的名称。
  3. 将输入 Field Behavior 设置为 Data Entry。将输入 Content Type 设置为 Select。将输入 Enumeration Options 设置为 Specify Below(请参见图 8)。
  4. 单击 Select Data 旁边的概要机制图标。这时将出现一个 Profile Input 提示对话框。选择 J2BWPFportletsConfigPS 作为 Profile Set Name,并选择 account_accountType 作为 Profile Entry Name(请参见图 9)。
  5. 编辑条目的值:将 bank1 概要设置为 SAVINGS、CHECKINGS,并将 bank2 概要设置为 SAVINGS、CHECKINGS、EXTERNAL。
  6. 单击 OK。
图 8. Data field modifier builder
Data field modifier builder
图 9. 对选项列表的值进行概要分析
对选项列表的值进行概要分析

步骤 2:创建一个 Portlet 以用于配置

在这个部分中,您将创建一个 Portlet,以便对在步骤 1 中创建的概要集 J2BWPFportletsConfigPS 中的概要条目值进行管理。WebSphere Portlet Factory 提供了一套 API 以创建、更新和删除概要。使用这些 API,您可以创建 Portlet 以公开您希望自定义的值,并且为设置这些值提供相应的用户界面。

步骤 2a:添加自定义变量

可以通过 Web 页面来显示和更新概要条目的值。要做到这一点,您需要为存储所选择的概要和概要条目的值创建相应的变量。您已经为所选择的概要名称创建了一个名为 SelectedProfile 的字符串变量。为了在变量和概要条目之间保持简单的映射,在对变量进行命名时,在概要条目名称的前面加上前缀 pfvar_。图 10 中显示了一些示例变量。

图 10. 示例变量
示例变量

步骤 2b:使用概要分析 API 开发 Helper 类

图 11 显示了用于概要分析的主要类和方法。使用 ProfileSetStorageManager 以通过名称获得概要集,并保存概要集。使用 ProfileSet 以获得其概要。使用 Profile 和 ProfileValue 以获得概要条目的值。

图 11. 概要分析 API
概要分析 API

使用这些 API,可以创建一个 Helper 类,以实现下列的函数(请参见 WPFPortlets.zip 中的 com.ibm.J2B.wpf.profile.ProfileCustomizeHelper)。

  • 从概要集获得概要的列表(请参见方法 getProfiles
  • 获得某个概要的概要条目值,并将它们赋值给 Web 应用程序中的相应变量(请参见方法 getVariables
  • 从 HttpServletRequest 中获得经过更新的概要条目值,并将其保存到概要集(请参见方法 saveProfile)。

步骤 2c:添加 Portlet 控件

在这个步骤中,您将为配置 Portlet 添加相应的控件以处理变量并调用函数。

  1. 添加一个链接的 Java™ 对象,并将类名设置为 Helper 类。
  2. 使用 html 表格来编辑页面布局。<span> 标记的名称必须与变量的名称相同(请参见清单 1)。
  3. 为标记 SelectedProfile 添加一个 Select builder。将 Select Data 设置为方法 getProfile 的返回值,并将 Selected Values 设置为变量 SelectedProfile。
  4. 添加一个 HTML Event Action Builder,指定当所选的概要发生变化时调用 getVariables 方法。
  5. 为其他命名标记添加 HTML 控件(如 Select 和 Text Input)以显示概要条目。将它们的值指定为相应的变量。
  6. 添加一个提交按钮,并指定当单击该按钮时调用 saveProfile 方法。
清单 1. HTML 代码
<body>
	<form name="myForm" method="post">
		<table>
			<tr>
				<td> Profile: </td>
				<td> <span name="SelectedProfile"></span> </td> 
			</tr>
			<tr>
				<td> BankId: </td>
				<td><span name="pfvar_bankId"></span></td>
			</tr>
			<tr>
				<td> BankName: </td>
				<td><span name="pfvar_bankName"></span></td>
			</tr>
			<tr>
				<td><span name="submitbutton"></span></td>
				<td></td>
			</tr>
		</table>
	</form>
</body>

步骤 3:创建一个自定义 Profile Selection Handler

当一个概要集中存在多个概要时,概要选择处理程序将决定应该使用哪一个概要。在 WebSphere Portlet Factory 中有一些预定义的处理程序,如 Explicit Handler 和 J2EE Role Handler。您可以定义您自己的选择处理程序。在这个场景中,您可以定义一个简单的自定义概要选择处理程序,通过该程序为每个银行关联一个单独的概要。

步骤 3a:实现处理程序类

SelectionHandler 类实现了 ProfileSelection 接口,而这个接口中包含方法 selectProfile()。这个方法可以从传递进来的、指定的配置文件集中选择一个配置文件,并返回它的名称。该处理程序类的源代码如清单 2 所示。

清单 2. 处理程序类的源代码
public class BankUserSelectorHandler extends SelectionHandlerBase {

	public String selectProfile(HttpServletRequest request,
			ProfileSet profileSet, String modelName, String explicitProfile,
			ModelInstanceCreator modelInstanceCreator) {

		String userid = "";
		try {

			userid = request.getRemoteUser();
			int index = userid.indexOf('@');
			if (index == -1) return ProfileSet.DEFAULT;

			String domain = userid.substring(index + 1);
			return domain;

		} catch (Exception e) {}

		return ProfileSet.DEFAULT;
	}
}

步骤 3b:创建处理程序定义

处理程序定义是一个 XML 文件,其中列出了用于实现这个概要选择处理程序的 Java 类,以及这个概要选择处理程序的属性。所有的处理程序定义都存储在 WEB-INF/config/selection_handlers 目录 中。这个示例场景中的处理程序定义文件如清单 3 所示。

清单 3. 处理程序定义文件
<Handler name="J2BBankProfileSelectionHandler">
  <Description>Handler for J2B WPF portlet</Description>
  <Selection class="com.ibm.J2B.wpf.handler.BankUserSelectorHandler" />
</Handler>

步骤 3c:为概要集设置概要选择处理程序

在创建了自定义概要选择处理程序之后,为概要集 J2BWPFportletsConfigPS 设置选择处理程序。

  1. 双击 WEB-INF/profiles/J2BWPFportletsConfigPS 概要集,以打开它。
  2. 在 Select Handler 选项卡中,从 Profile Selection Handler 选择框中选择您所创建的选择处理程序(请参见图 12)。
  3. 保存该概要集。
图 12. 设置概要选择处理程序
设置概要选择处理程序

与非WebSphere Portlet Factory 解决方案的比较

Portlet 的配置模式也提供了可配置性。但是 Portlet 配置模式中的参数和函数范围仅与一个 Portlet 相关。对于那些需要在多个 Portlet 中共享的参数,如银行 ID、银行名称和公共的 Web 服务端点,需要在每个 Portlet 中对其进行配置。使用 WebSphere Portlet Factory 动态概要,您可以开发一个集中式的 Portlet 以提供配置用户界面。共享的参数只需要设置一次,这将降低工作强度和出现错误的可能性。

如果不使用 WebSphere Portlet Factory,可以通过 JSP 和 Java 代码来实现 Portlet 的配置。您可以通过 Java API 获得配置参数的值。要提供更高级的配置,需要提供更复杂的代码,如配置某个字段的隐藏/显示状态,或者配置下拉列表中的可选值。使用 WebSphere Portlet Factory 动态概要,Web 应用程序的配置变得非常简单、且功能非常强大,无需编写代码就可以进行配置。

尽管 WebSphere Portlet Factory 提供了这些优点,但是对于 WebSphere Portlet Factory 的开发,没有像 JSP 和 HTML 开发那样的所见即所得 (WYSWYG) 工具。WebSphere Portlet Factory 提供了类似向导的构建程序,它们比 WYSWYG 工具要抽象一些。在使用 WebSphere Portlet Factory 进行 Portlet 开发的过程中,使用具有具体含义的构建程序名称是非常重要的。


结束语

本文描述了如何使用 WebSphere Portlet Factory 动态概要来实现可配置的用户界面。概要分析是 WebSphere Portlet Factory 中非常健壮的特性。概要包含一组参数(名/值对),可用于实现自定义 Portlet 的生成。使用概要,您可以从相同的模型、为不同的用户或者情况自动地生成 Portlet 的不同变体。您所遵循的这些步骤包含对 Portlet 进行概要分析、创建一个 Portlet 以配置概要条目值、创建一个自定义的概要选择处理程序、以及将概要集与这个选择处理程序关联起来。尽管通过编写代码可以创建相同的功能,但是 WebSphere Portlet Factory 提供了一套 Builder 以支持在不编写代码的情况下实现相应的功能。


下载

描述名字大小
Source code of this articlewpfportlets.zip340KB

参考资料

学习

获得产品和技术

  • 使用 IBM 试用软件开发您的下一个项目,可下载或索取 DVD 光盘。

讨论

条评论

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=SOA and web services, WebSphere
ArticleID=255084
ArticleTitle=构建 SOA 组合业务服务,第 8 部分: 使用 WebSphere Portlet Factory 动态概要构建多个承租者的 Portlet
publish-date=09132007