扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
引言
IBM®WebSphere® Portal(以下称为 WebSphere Portal)包括一个以内容为目标的个性化业务规则引擎。从 WebSphere Portal Version 6 开始,您就可以轻松地将一条规则附加到 Portlet 或页面以指明该页面或 Portlet 何时应该是可见的。如果没有输入数据,那么规则将毫无意义;WebSphere Portal 中包括几个即时可用的对象,可用于访问门户用户数据库、Portlet 配置数据、请求、会话和规则中的日期信息。对于一个自包含的门户解决方案来说,通常这些内容就足够了。
随着公司门户规模的增大,大多数门户所有者都希望能够使用分散在整个组织范围的现有用户数据。尽管对于大多数常用的 LDAP 来说,WebSphere Portal 的用户数据库是可配置的,但是您的用户数据还可能位于遗留系统、各种关系数据库、仓库数据库、LDAP、专门的 CRM 软件数据库、以及许多其他位置。您可能还希望在规则中使用一些其他的、非用户数据。例如,如果您的业务不能满足某些关键的指标,您可能希望在执行仪表板中显示附加的 Portlet。本系列文章可以帮助您向编写业务规则的非技术用户公开外部信息。
|
系统要求
要完成本系列教程中的内容,您需要 Rational Application Developer V6.0.1.1 或更高版本、WebSphere Portal V6.0 或更高版本。
|
了解 Personalization 扩展
您可以使用下面两种机制之一将信息公开给规则引擎:应用程序对象 和资源集合。在这个部分中,您将看到应该在何时使用其中每种机制。
应用程序对象
应用程序对象允许您使用附加的“当前”信息来扩展 WebSphere Portal Personalization(以下称为 Personalization),例如:
应用程序对象的属性可以进行配置,可以在可见性规则中使用,或在选择规则中用作需要进行匹配的值。您可以使用所有这些信息来决定 Portlet 或页面何时是可见的,或者决定要在 Portlet 中显示哪些内容。通常来说,应用程序对象要比资源集合更容易实现,这是因为它们不需要对 Personalization 接口有更多的了解。
使用应用程序对象
应用程序对象是会话或请求中的 Java 对象。规则引擎根据您指定的键查找会话或请求中的对象。
规则编辑器将对应用程序对象的 Java 类进行自检,以确定在编辑器中显示哪些属性。例如,如果该对象是一个具有公开方法 getDiscountCode
的购物车,那么您将在规则编辑器中看到一个 discountCode
属性。可用的操作符可能因属性类型不同而有所不同。在某些情况下(如日期、时间和带时间戳的属性),将根据该属性的 Java 类型自动为输入字段提供一些专门的值。
您还可以为应用程序对象 Bean 实现一个 BeanInfo 类。如果是这样,那么 Personalization 将在规则编辑器中显示 BeanInfo 的显示名称。您还可以使用 BeanInfo 在规则编辑器中隐藏某些属性,只需要让您的 BeanInfo 不为这些属性返回 PropertyDescriptor
即可。
要更改这些示例类,可以添加您自己的 getter 或者 read 方法,它们用于获取您希望在规则中使用的数据。例如,在第二个教程中,您将建立一个 getter 方法,它可以用来从 Web 服务检索数据。在这个示例中,该应用程序对象用作 Web 服务中数据的 Facade。通常,Web 服务所公开的接口过于复杂,以至于编写规则的人很难直接使用。使用应用程序对象作为其他地方存储的数据的 Facade,这是一种比较常见的模式。
定位应用程序对象
当运行一条规则时,规则引擎必须找到该应用程序对象的一个实例。通常,Personalization 将根据您在 Personalization Portlet 中定义应用程序对象时指定的键来查找应用程序对象。例如,您可能在会话中使用键 "yourco.shoppingCart"
定义了一个购物车对象。然后在执行规则时,规则引擎将调用 session.getAttribute("yourco.shoppingCart")
以查找您的购物车实例,假定当规则运行时,该应用程序对象位于会话中。
图 1. 为购物车对象定义一个应用程序对象
在第一个教程中,您将实现 SelfInitializingApplicationObject
接口。通常,调用规则的代码需要确保会话中存在对应于预期键的对象。创建这样的代码有时是一件麻烦且容易出错的工作。如果该规则是 Portlet 上的可见性规则,那么调用该规则的代码位于门户服务器中,而您无法随意更改。您可能还希望为规则添加新的对象,而不需要修改所有的调用者。出现错误的一个常见原因是,在调用规则引擎之前忘了将应用程序对象放到会话中。如果使用 SelfInitializingApplicationObject
,那么就可以避免出现这样的错误。
在实现了 SelfInitializingApplicationObject
接口的情况下,如果当规则运行时没有找到应用程序对象,那么规则引擎将尝试实例化该对象。这个引擎将自动地为该对象构造的一个新的实例,然后调用其 init
方法,以便该对象能够有机会根据上下文对象对自己进行初始化。特别是,上下文包含了会话、请求和用户名,这样一来就可以在应用程序对象中使用会话、请求和用户名中的任何信息。
在 J2EE 环境中,Web 应用程序之间不能共享会话;因此,会话无法用于在 Portlet、Web 应用程序、或者甚至 Portlet 和控制页面可见性的规则之间进行信息通信。
教程中的代码还在 init
方法中将应用程序对象("this"
)存储到会话中。将应用程序对象存储到会话或请求中,这样做可以允许规则引擎稍后查找对象,而无需创建一个新的实例。在会话或请求中存储对象时所使用的键应该与在 Personalization Portlet 中定义该应用程序对象时所分配的会话键相匹配。可以不将对象存储到会话中,但在大多数情况下,这样做将提高性能。放到会话中的对象应该是线程安全的和可序列化的。如果将对象放到请求中,那么可序列化和线程安全并不是必需的,但是您需要在每次请求中创建这个类的一个新的实例,这可能会降低性能。
即时可用的应用程序对象
规则编辑器中的 Action Bean、Action Count、Browser Capability、Category Bean、Category Count、Date、Portlet Attributes、Request 和 Session 对象都实现为应用程序对象,并且它们使用了本文中所介绍的相同的公共接口。在安装的过程中,在一个隐藏目录中对这些对象进行了定义,但是它们与您编写的其他应用程序对象没有什么区别。
使用应用程序对象的最佳实践
SelfInitializingApplicationObject
和 Serializable
接口。
init
方法中调用 context.setSessionAttribute(myKey, this);
将您的应用程序对象存储在会话中,其中的 "myKey"
是您在为 Personalization 定义应用程序对象时使用的键。
init
方法中,使用应用程序对象中的实例变量或 WebSphere Dynamic Cache 映射来存储 getter 方法所使用的信息(比如用户名)。
资源集合
您可以使用资源集合来添加使用选择规则进行选择的、或进行查询的列表或数据集合。建议规则可以对资源集合中的项目做出建议。资源集合通常代表下列内容:
要创建一个资源集合,必须实现 资源、资源域 和资源管理器 这三个相关的概念。Personalization Javadoc 中定义了扩展 Personalization 时需要实现的接口,这个 Javadoc 位于您的 WebSphere Portal 安装中:
<wps>/doc/Javadoc/Personalization
例如,特定的路径可能为:
C:\ibm\PortalServer\doc\Javadoc\Personalization
。
使用资源
资源 表示数据源中的一个对象或者一行。资源类必须实现接口 com.ibm.websphere.personalization.resources.Resource
。
与应用程序对象非常相似,将对资源进行自检,以获得要在规则编辑器中显示的属性列表。资源还可以接受动态属性。只有那些在自检过程中找到的属性才会编码到该类中。要添加这些属性中的另一个,您必须重新编译资源类。动态属性是在规则编辑器中定义的属性。使用 WebSphere Portal 中的 Manage Properties 页面从资源集合添加和删除动态属性。当规则运行时,将使用动态属性名或查询中所包括的属性来调用 get(String propertyName)
方法。当我们介绍 Feeds 资源集合的来源时,您将会了解到有关这方面内容的更多信息。
您可以使用 Manage Properties 页面来添加和删除动态属性。
图 2. 编写一条规则以选择文档。
通常,大多数资源集合不支持动态属性。在我们的 Feeds 示例集合中使用它们为 ATOM Feed 支持扩展属性。也就是说,Feed 资源集合可以扩展为支持 ATOM Feed 扩展。您还可以使用一个应用程序对象来实现 Resource
接口以支持动态属性。
使用资源域
资源域 可以查找或创建资源实例。资源域必须实现 com.ibm.websphere.personalization.resources.ResourceDomain3
。在选择或建议规则运行时,引擎将调用资源域以定位资源。具体来说,引擎将调用 findResourcesByQuery
方法以运行选择或建议规则的查询。
以 com.ibm.websphere.query.base.Query
对象的形式,向 findResourcesByQuery
方法传递查询的抽象表示。资源域的首要任务是将查询对象转换为一组资源。这通常可以通过下面的方法来实现:使用回调(com.ibm.websphere.query.base.ISelectQueryCallback
)将查询对象转换为查询字符串,针对一个数据源执行查询,将结果包装在资源中并返回该资源。
创建资源管理器
只能针对用户资源集合使用资源管理器方法。资源管理器必须实现 com.ibm.websphere.personalization.resources.ResourceManager3
。本系列文章关注于内容资源集合,并没有讨论资源管理器接口的方法。对于内容资源集合,可以不必实现这些资源管理器方法,在我们的 Feeds 资源集合中便是如此。
即时可用的资源集合
Portal User、Web Content 和 Documents 资源集合使用了本文中介绍的相同的公开接口。与那些即时可用的应用程序对象一样,在安装的过程中,在一个隐藏的文件夹中对这些资源集合进行了定义。它们被定义为与您可以创建的资源集合非常类似。
资源集合的最佳实践
|
本系列教程介绍
本系列中的第一个教程(第 2 部分)将介绍如何集成一个非常简单的自定义对象,以便您能够了解如何扩展 Personalization 功能。可以将它看作扩展 Personalization 的工作中的“Hello World”。对于您自己的解决方案,您可能发现其中有些地方需要进行修改,并且在这些地方您可以调用 Web 服务以集成其他数据源。
在这个 Hello World 教程中,您将:
在第二个教程(第 3 部分)中,您将构建一个比较复杂的自定义对象,该对象将进行 Web 服务调用以获取规则中使用的数据。除了采取与第一个教程中相同的步骤之外,对于第二个教程,您将实现一个 Personalization 应用程序对象以便从 Web 服务获取相应的数据。
前两个教程重点关注于集成用户数据,而第三个教程(第 4 部分)重点关注于扩展 Personalization 的内容源。在这个示例中,您将了解如何使用 ATOM Feed 作为 Web Content Management 的个性化内容源。
在第三个教程中,您将:
|
结束语
编写应用程序对象和资源集合的代码可能非常简单,也可能非常复杂。您所编写的代码的复杂程度,可能因您的对象中所引用的 API 和数据源的不同而有所不同。应用程序对象提供了相应的机制以使用附加的“当前”信息(如当前用户信息、当前业务统计信息、当前日期信息、当前天气条件,等等)对引擎进行扩展。资源集合允许从外部内容源选择内容的列表。在正确使用的情况下,应用程序对象和资源集合都是可重用的组件,它们扩展了 Personalization 规则引擎。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者