扩展WebSphere Portal V6个性化功能
定位应用程序对象
当运行一条规则时,规则引擎必须找到该应用程序对象的一个实例。通常,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 方法所使用的信息(比如用户名)。
在进行了远程或其他代价高昂的调用之后,可以将结果存储到应用程序对象的实例变量或者 WebSphere Dynamic Cache 映射中,然后在以后调用时重用该结果。
通过将大对象或频繁引用的值存储到 WebSphere Dynamic Cache 映射中,最小化应用程序对象(以及会话)中所存储的数据。
使用 BeanInfo 使您的应用程序对象具有更易于阅读的属性名,并隐藏那些程序员可以使用、而规则编写者不应该使用的属性。
如果您希望能够使用更新规则对这些属性进行操作,那么可以为您的属性实现 set 方法。
应用程序对象所使用的键应该嵌入到规则中,在具有规则库的情况下,请确保无法轻易地对该键进行更改。在创建使用应用程序对象和资源集合的规则之前请记住这一点。
当运行一条规则时,规则引擎必须找到该应用程序对象的一个实例。通常,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 方法所使用的信息(比如用户名)。
在进行了远程或其他代价高昂的调用之后,可以将结果存储到应用程序对象的实例变量或者 WebSphere Dynamic Cache 映射中,然后在以后调用时重用该结果。
通过将大对象或频繁引用的值存储到 WebSphere Dynamic Cache 映射中,最小化应用程序对象(以及会话)中所存储的数据。
使用 BeanInfo 使您的应用程序对象具有更易于阅读的属性名,并隐藏那些程序员可以使用、而规则编写者不应该使用的属性。
如果您希望能够使用更新规则对这些属性进行操作,那么可以为您的属性实现 set 方法。
应用程序对象所使用的键应该嵌入到规则中,在具有规则库的情况下,请确保无法轻易地对该键进行更改。在创建使用应用程序对象和资源集合的规则之前请记住这一点。
0
相关文章