使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 4 部分: 使 portlet 能够共享事件数据

多渠道 portlet 应用程序从不同的设备运行时会呈现相应的视图。这意味着,当您从桌面浏览器查看它时,portlet 呈现桌面版本。同样,当您从智能手机查看它时,则会看到移动版本的 portlet。本文是由五个部分所组成的系列文章的第 4 部分,将向您演示如何使用 IBM Rational Application Developer V8.0.4 或更高版本来启用 eventing(也称为事件处理),从而在 portlet 之间共享数据。

Gaurav Bhattacharjee, 技术负责人, Rational 应用程序开发人员门户工具团队, IBM

Gaurav Bhattacharjee 照片Gaurav Bhattacharjee 是印度德里的 IBM India Software Labs 的一位技术负责人。他在 IBM Software Group 中的 IBM 协作解决方案部门的 Rational 应用程序开发人员门户工具团队中工作。



2012 年 5 月 21 日

下载 IBM® Rational® Application Developer 试用版  |  在线试用 IBM® Rational® Application Developer
下载 IBM® WebSphere® Application Server 试用版  |  IBM® WebSphere® Application Server for Developers
下载 IBM® DB2® for Linux, UNIX, and Windows 试用版  |   IBM® DB2® Express-C(免费产品)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

Java Specification Request (JSR) 286 引入了基于事件的 portlet 协调。JSR 286 使 portlet 可以发送和接收事件。有些 portlet 可以定义要发布的事件,而另一些 portlet 则定义哪些 portlet 可以接收这样的事件。IBM® Rational® Application Developer 提供了工具,为 portlet 创建这样的事件。在这一部分中,您将了解如何在 Rational Application Developer 中为 portlet 启用事件处理。这些基于事件的 portlet 在运行时被连接在一起,以创建 portlet 之间的连接。本教程是一个由五部分所组成的系列中的第 4 部分,重点是为现有 portlet 启用事件,创建基于事件的新 portlet,以及将两个基于事件的 portlet 连接在一起,使它们可以共享数据。

  • 第一个 portlet 是 Deals portlet,它用作一个 Event Publisher(事件发布者)portlet,也就是说,它将发送一个事件,以传输数据。
  • 第二个 portlet 是 ContactInformation portlet,它用作一个 Event Subscriber(事件订阅者)portlet,接收一个事件并调用一个方法处理交换的数据。

以下是事件流程:

  1. Deals portlet 发布一个事件,将 Contact Name 传递给 ContactInformation portlet。
  2. ContactInformation portlet 接收一个事件,调用一个方法(例如 Contact Name)来处理数据。
  3. 根据 Contact Name 调用一个适当的 SDO 方法,以便从 CONTACT_PERSON DB2 表中提取信息。

创建一个新的 portlet

为了在两个 portlet 之间启用 eventing(事件处理),第一步是创建一个新的 portlet:

  1. 右键单击 DealsProject 并选择 New > Portlet
  2. 输入 ContactInformation 作为 portlet 的名称。
  3. 此外,请确保 portlet 的类型被设置为 Faces Portlet。(参见图 1)
图 1. 新的 Portlet 的创建页面
新的 portlet 的创建窗口
  1. 单击 Next,确保已选中 Generate a custom portlet class 选项,如图 2 所示。
图 2. 生成一个自定义 portlet 类的选项
还将显示 Package prefix 和 Class prefix 字段
  1. 单击 Finish

这将创建一个名称为 ContactInformationView.jsp 的 JSP,以及一个名为 ContactInformationPortlet.java 的 portlet 类。现在,您有两个 portlet,您可以使它们支持事件处理(在 JSR 中称为 eventing)。


使源 portlet 能够发布一个事件

按照以下步骤使 Deals portlet 能够发布事件:

  1. 打开 DealsView.jsp 文件。
  2. 在 Palette 视图,找到 Portlet 抽屉中的 Event Source Trigger
  3. 单击 Event Source Trigger 并将它拖动到 Contact Name 列中的 Name 表达式上面,如图 3 所示。
图 3. 将事件源触发器拖动到 JSP 中
在 JSP 中插入事件源触发器

这将调出图 4 中的 Insert Event Source Trigger 对话窗口。

图 4. Insert Event Source Trigger 对话窗口
事件源触发器插入窗口
  1. 单击 New Event 按钮以新建一个要发布的事件。
  2. 在打开的 "Event – Enable this portlet to Publish events" 对话窗口中,在 Event Name 中输入 ContactId,如图 5 所示。
图 5. 事件创建对话窗口
描述被发布的事件
  1. 单击 Finish 以填充图 6 中的 Insert Event Source Trigger 窗口。
图 6. Event Source Trigger 对话窗口
触发事件的 UI 控件字段
  1. 在 Value to Send 字段中输入 #{vardealsInformationList.CONTACT_ID}
  2. 单击 Finish

NAME 字段会是超链接的字段,如图 7 所示。

图 7. 超链接的列
Contact Name 列包含链接的 NAME 字段

还要注意如何使用 Enterprise Explorer 视图中的 Publish 事件图标(蓝色箭头前面有一个黄色旗子)来装饰 Deals portlet 节点。该节点的下方列出了事件名称,如图 8 所示。

图 8. 事件装饰的节点
事件信息装饰的节点
  1. Save 文件。

现在,您需要创建一个 JavaServer Faces Managed Bean,以保存通过 eventing 在 portlet 之间交换的数据。

  1. 右键单击 Java Resources 节点,并选择 New > Class,如图 9 所示。
图 9. 创建一个新类
Java Resources 的两个下拉菜单
  1. 指定 Package 为 com.ibm,并指定 Name 为 ContactBean,如图 10 所示。
  2. 单击 Finish
图 10. 指定类名称
New Java Class 窗口中的 Java Class 视图
  1. 当创建 ContactBean.java 文件并在编辑器中打开它时,将其内容替换为清单 1 中的代码。
清单 1. 用以下代码替换 ContactBean.java file 的内容
      package com.ibm;

   public class ContactBean {
	long id;
	String picURL;
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getPicURL() {
		return picURL;
	}
	public void setPicURL(String picURL) {
		this.picURL = picURL;
	}
    }
  1. 打开 DealsView.jsp 文件。
  2. 在 Page Data 视图中,右键单击 Faces Managed Bean 并选择 New > Faces Managed Bean,如图 11 所示。
图 11. 创建一个 Faces managed bean
下拉菜单上的 Faces Managed Bean 选项
  1. 指定 Name 为 contactbean,并指定 Class 为 com.ibm.ContactBean,对于 Scope,可以从上下文菜单中选择 Session,如图 12 所示。
图 12. 指定 Faces Managed Bean 属性
指定 Bean 属性
  1. 单击 Finish

创建一个 SDO Relational Record

使 ContactInformation portlet 支持 eventing 是一个由两步组成的过程。首先,您需要使用 DB2 表 CONTACT_PERSON 创建一个 SDO Relational Record,然后,您需要使 ContactInformation 可以接收事件。

注:
服务对象(Services Data Object,SDO)的创建与事件支持无关。您要创建一个 SDO 是因为您的用例有这个需求。

按照以下步骤创建一个 SDO Relational Record:

  1. 在 Page Designer 中打开 ContactInformationView.jsp,并打开 Page Data 视图。
  2. 右键单击 SDO Relational Records,并选择 New > SDO Relational Record
图 13. SDO Relational Record 创建
创建一个 SDO Relation record
  1. 在 Add Relational Record 对话窗口中,提供 contactInformation 作为名称,并单击 Next
图 14. Add Relational Record 对话窗口
输入 Name 字段的 contactInformation
  1. 对于表,请选择 ADMINISTRATOR 架构下面的 CONTACT_PERSON 表,然后单击 Next(参见图 15)。
图 15. 选择表
Add Relational Record > Record Properties 视图
  1. 选择所有列,如图 16 所示,并单击 Finish
图 16. 选择所有列
将包含在结果中的列

如 17 所示,在 Page Data 视图中的 SDO Relational Records 节点下面已创建了一个新的 Relational Record。

图 17. 在 Page Data 视图中的 SDO 记录
节点的屏幕截图

生成 JSP 节点

现在,您已创建了 SDO Relational Record,您需要将 Relational Record 拖动到 portlet JSP,使它能够使用来自 CONTACT_PERSON 表的数据:

  1. contactInformation (CONTACT_PERSON) 节点拖动到 portlet JSP (ContactInformationView.jsp),以调用图 18 所示的 Insert Record 对话窗口。
图 18. Insert Record 对话窗口
Configure Data Controls 视图
  1. 取消选中列 CONTACT_ID 并单击 Finish

请注意在 portlet JSP 已生成的代码。


使目标 portlet 可以接收事件信息

现在您已创建并生成了代码,可以使用来自 CONTACT_PERSON 表的数据,您还需要完成最后一项工作:将 contact ID 传递给 ContactInformation portlet。这个 contact ID 用于从 CONTACT_PERSON 表提取某个特定人员的记录,在 ContactInformation portlet 中显示相关信息。回忆一下,Deals portlet 通过 ContactId 的名称发布一个事件,以传递 contact ID。现在您需要使 ContactInformation portlet 能够订阅该事件。

  1. 在 Enterprise Explorer 中找到 Portlet Deployment Descriptor 下面的 ContactInformation portlet。
  2. 右键单击 portlet,并选择 Event > Enable this Portlet to Process Event(参见图 19)。
图 19. 使 portlet 能够处理事件
在两个下拉菜单中的选择

这会调出 "Events – Enable this Portlet to Process events" 对话窗口。

  1. 从 Event Name 下拉菜单选择 ContactId,如图 20 所示。
图 20. Enable this Portlet to Process events 对话窗口
视图标题:Describe the event being processed
  1. 单击 Finish

注意如何使用 Subscribe 事件图标(黄色旗子前面有一个绿色箭头)来装饰 ContactInformation portlet 节点下面的 ContactId 事件节点,如图 21 所示。

图 21. 装饰的事件节点
用事件信息装饰的节点

上一个操作也在 ContactInformationPortlet.java(ContactInformation portlet 的 portlet 类)中生成了一个 processEvent 方法。清单 2 显示了生成的代码。

清单 2. 生成的 processEvent 方法
public void processEvent(EventRequest request, 
			EventResponse response) throws 
			PortletException, java.io.IOException {	
     super.processEvent(request, response);
     FacesContext facesContext = FacesContext.getCurrentInstance();
     Event sampleEvent = request.getEvent();
     if(sampleEvent.getName().toString().equals("ContactId")) {
	 Object sampleProcessObject = sampleEvent.getValue();
	}
    facesContext.release();
   }

以该 portlet 为目标的每个事件都将调用 processEvent 方法,并带有一个 EventRequest 和 EventResponse 对象。

清单 3 修改了清单 2 中的代码,将业务逻辑添加到 processEvent 方法。

清单 3. 在 processEvent 方法中添加的自定义代码
    public void processEvent(EventRequest request, 
			    EventResponse response) throws 
			    PortletException, java.io.IOException {	
	super.processEvent(request, response);
	FacesContext facesContext = FacesContext.getCurrentInstance();
	Event sampleEvent = request.getEvent();
	if(sampleEvent.getName().toString().equals("ContactId")) {
	 Object sampleProcessObject = sampleEvent.getValue();
	 Application app = facesContext.getApplication();
	 ValueBinding binding = app.createValueBinding("#       
                              {contactbean}");
	 ContactBean mybean =(ContactBean) binding.getValue 
                            (facesContext);
	 mybean.setId(Long.parseLong(sampleProcessObject.toString()));
	}

在该清单中,代码只获得一个 Faces managed bean (ContactBean) 实例 ,ContactBean 是您之前创建的。该实例包括由 Deals portlet 通过 eventing 传输的 contact ID。ContactBean 的实例本身存储在一个会话变量中,所以它可以跨 portlet 重用,用于不同的请求。


将 portlet 连接在一起

为了在事件调用中交换数据,您需要将 portlet 连接在一起,使它们能够交换数据。

  1. 在项目上执行 Run on Server 操作,就像您之前所做的操作一样。图 22 显示显示在浏览器中的 portlet。
图 22. 在浏览器中显示的两个 portlet
在浏览器中的 Deals 和 Contact Information portlet
  1. 现在,要将 portlet 连接在一起,请在 Actions 菜单上单击 Edit Page 选项,如图 23 所示。
图 23. Edit Page 选项
在 Actions 下面选中的 Page Edit

注:
只有当主题是包括在 IBM® WebSphere® Portal v7.0 中的 PageBuilder 主题时,才会显示 Edit Page 选项。对于任何自定义主题,您可以通过使用门户管理控制台的连接工具将 portlet 连接在一起。

  1. 右键单击在 Deals portlet 窗口左上角的下拉菜单的小箭头符号(如图 24 所示),并选择 Edit Wiring 菜单项。
图 24. 选择 Edit Wiring 选项的图标
选择 Edit Wiring 的图标
图 25. Edit Wiring 选项
在下拉菜单上选中的 Edit Wiring
  1. 选择 Edit Wiring 菜单项,打开图 26 中显示的 Wiring 界面。该界面显示可以连接在一起的可用事件。在该界面中,可以找到您之前创建的事件。
  2. 在 Wiring 界面中,选择 Deals 图标下面的 {http://DealsProject/}/ContactIdpublisher 事件,该图标位于 Select content to send 标题下面。
  3. 选择 ContactInformation 图标下面的 {http://DealsProject/}/ContactIdsubscriber 事件,该图标位于 Select a widget to receive content 标题下面。
  4. 单击 Done
图 26. Wiring 界面
Wiring 工具
  1. 单击 Save & Exit 按钮。
  2. 现在单击 Deals portlet 中的每个 Contact Names,您将看到相关信息显示在 Contact Information portlet 中(图 27)。
图 27. 支持事件的 portlet 共享数据
连接的 portlet 共享数据

本系列的后续文章

由五个部分组成的本系列文章的第 4 部分到此就结束了。第 5 部分将演示如何创建可以从 IBM® Connections 提取数据的 portlet。


下载

描述名字大小
本系列的场景和用例scenarios_use_cases_sample.zip5MB

参考资料

学习

获得产品和技术

讨论

条评论

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=Rational
ArticleID=816953
ArticleTitle=使用 Rational Application Developer 8.0.4 创建多渠道复合 portlet 应用程序,第 4 部分: 使 portlet 能够共享事件数据
publish-date=05212012