练习 1.2:两种 API 在概念方面的差别

在开始之前,应该先完成练习 1.1:导入资源

在此练习中,您将了解两个 portlet API 在概念方面的差别。

概述

IBM portlet API 最初是为 WebSphere Portal V4 开发的。对 JSR 168 portlet API 的支持是从 WebSphere Portal V5.0.2 才开始的。

JSR 168 portlet API 是标准化的 JavaTM portlet 规范, 是由 IBM 与 Sun 公司联合领导的一个小组开发的,同时还有主要门户网站服务器供应商的一些贡献。它的目的是解决不同供应商的门户网站服务器之间的 portlet 兼容性问题。最初的规范是在 2003 年 10 月获得批准的。

WebSphere Portal 支持这两种 API。它提供了两个门户网站容器: 用于 IBM portlet API portlet 的旧容器(以下称为 IBM portlet); 用于 JSR 168 portlet API portlet 的标准容器(以下称为 JSR 168 portlet)。在不同容器中运行的 portlet 可以存在于同一门户网站页面上。

门户网站容器为 portlet 提供了运行时环境。它支持 portlet 生命周期,由以下三个阶段组成:

请求处理阶段包含以下两个子阶段:

在了解特定的编码差别之前,您需要了解这两个 portlet API 之间的基本差别。

注意,您不必直接处理 portlet 部署描述符的源代码,下面对此进行了讨论。portlet 部署描述符编辑器为 portlet.xml 提供了图形用户界面,并且会为您更新源代码。

使用 IBM portlet API 的类实例和数据

最初装入 portlet 时,将使用 Web 部署描述符(web.xml)中的参数来对它进行初始化。这些参数是在 <servlet> 元素的 <init-param> 元素上定义的。可以使用 PortletConfig 对象的 getInitParameter() 方法来检索这些参数。获得的 portlet 是一个抽象 portlet

在使用 portlet 之前,portlet 部署描述符(portlet.xml)中的参数会被装入 PortletApplicationSettings 对象或 PortletSettings 对象中。这些参数是在 <concrete-portlet-app> 元素的 <context-param> 元素以及 <concrete-portlet> 元素的 <config-param> 元素上设置的。

<concrete-portlet-app> 元素上的参数适用于 portlet 应用程序中的所有 portlet;可以使用 PortletSettings.getApplicationSettings() 方法来检索这些参数。getApplicationSettings() 方法将返回 PortletApplicationSettings 对象,而 PortletApplicationSettings.getAttribute() 可用来检索各个参数。<concrete-portlet> 元素上的参数适用于特定 portlet;可以使用 PortletSettings.getAttribute() 方法来检索这些参数。

抽象 portlet 与 PortletSettings 对象中的数据组合起来就被称为具体 portlet

将 portlet 放置在门户网站页面上时,就创建了 PortletData 对象。具体 portlet 与 PortletData 对象组合起来就被称为具体 portlet 实例。PortletData 对象将管理具体 portlet 实例的持久数据。 可使用 PortletRequest.getData() 和 PortletData.getAttribute() 方法来检索值,而使用 PortletData.setAttribute() 和 PortletData.store() 方法来存储值。 根据门户网站页面的作用域,这些数据仅限于一个用户或一个组。

具体 portlet 实例和 PortletSession 对象组合起来就被称为用户 portlet 实例

以下图例说明了刚才所讨论的对象。
IBM portlet API 中的 portlet 类和数据的逻辑表示

使用 JSR 168 portlet API 的类实例和数据

使用 JSR 168 portlet API 时,初始参数是在 portlet.xml 中使用 <portlet-preferences> 元素定义的。IBM portlet API 的 web.xml 中的 <init-param> 元素等同于 JSR 168 portlet API 的 portlet.xml 中的 <init-param> 元素。

可以将这些初始参数设置为只读参数,但是可以在运行时在“配置”方式下进行修改。只有管理员才能更改只读初始化参数。 在运行时期间修改时,可以调用验证器类。在 <portlet-preferences> 元素上也设置了验证器类的名称。PortletPreferences 对象通过 RenderRequest.getPreferences()、PortletPreferences.getValue() 和 PortletPreferences.getValues() 方法使这些参数可用于 portlet。 <portlet-preferences> 元素等同于 IBM portlet API 中的 <config-param> 元素加上 PortletData 对象。

一个 PortletPreferences 对象和一个 portlet 组合起来就被称为一个 portlet 实体portlet 窗口被定义为 portlet 方式(编辑和查看)、portlet 窗口状态(正常、最大化和最小化)和显示参数的组合。 对于给定的 portlet,一个门户网站页面可以包含多个 portlet 窗口,每个 portlet 窗口都与特定的方式、状态和一组显示参数相关联。

以下图例说明了刚才所讨论的对象。
JSR 168 API 中的 portlet 类和数据的逻辑表示

Portlet 生命周期

这两个 portlet API 的生命周期都由初始化阶段、请求处理阶段和销毁阶段组成。请求处理阶段又分成两个子阶段:操作处理阶段和内容显示阶段。在请求处理中讨论了请求处理阶段的详细信息。下面列示了在每个阶段中所调用的特定方法。

IBM portlet API 生命周期方法

init(PortletConfig)
使用 portlet 时就会调用 init() 方法。PortletConfig 参数提供了对 PortletContext 对象的访问。
initConcrete(PortletSettings)
initConcrete() 方法用来初始化具有 PortletSettings 对象的具体 portlet。
service(PortletRequest, PortletResponse)
当 portlet 需要显示它的内容时就会调用 service() 方法。在一个 portlet 的生命周期中将多次调用 service 方法。服务将根据 portlet 的窗口状态而调用相应的方法(例如,doView() 和 doEdit())。在实现 portlet 类中通常不会覆盖 service 方法。
destroyConcrete(PortletSettings)
当停止使用 portlet 时就会调用 destroyConcrete() 方法。
destroy(PortletConfig)
当停止使用 portlet 时就会调用 destroy() 方法,从而提供一个位置来清除资源。

JSR 168 portlet API 生命周期方法

init(PortletConfig)
使用 portlet 时就会调用 init() 方法。PortletConfig 参数提供了对 PortletContext 对象的访问。
render(RenderRequest, RenderResponse)
当 portlet 需要显示它的内容时就会调用 render() 方法。它将根据 portlet 的窗口状态而调用相应的方法(例如,doEdit() 和 doView())。在实现 portlet 类中通常不会覆盖 render 方法。
processAction(ActionRequest, ActionResponse)
processAction() 方法要求将 ActionRequest 和 ActionResponse 对象作为参数。
destroy()
当停止使用 portlet 时就会调用 destroy() 方法,从而提供一个位置来清除资源。

请求处理

这两种 portlet API 都使用两阶段的请求处理。首先会处理操作(或事件),然后再调用显示阶段。在 IBM portlet API 中,将通过 actionPerformed() 方法来调用操作阶段,而通过 service() 方法来调用显示阶段。在 JSR 168 portlet API 中,将分别通过 processAction() 和 render() 方法来调用以上两个阶段。

这两种 API 之间存在的一个很大的差别是,JSR portlet API 在操作阶段和显示阶段使用不同的请求和响应对象,而 IBM portlet API 在这两个阶段中都使用相同的对象。通过使用 IBM portlet API,可以在事件处理期间对请求和响应对象设置属性,并在显示阶段检索值。通过使用 JSR portlet API,可以使用会话对象或者使用显示参数来传递属性值。

它们之间的另一个差别是,IBM portlet API 的 actionPerformed() 方法使用它的 ActionEvent 参数来获得对 PortletRequest 对象的访问权。而 JSR 168 portlet API 的 processAction() 方法具有 ActionRequest 和 ActionResponse 参数,它们将实现 PortletRequest 和 PortletResponse 接口。

现在,您可以开始进行练习 1.3:比较 JavaTM 类差别了。

使用条款 | 反馈
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.