Java™Specification Request(JSR)286 规格的 2 版本,使 portlets 发送和接受事件成为可能。事件能使 portlets 相互之间进行交流。IBM® Rational® Application Developer V7.5 提供了一系列的工具,以定义事件,激活 portlets,并使用事件在它们之间传递数据。一个 portlet 可以处理交流的双方:
- 向其他 portlets 发送事件
- 从其他 portlets 那里接受和处理事件
事件的属性
每一个事件必须有一个名字,可能还要有其他属性:
- Name:事件独一无二的名字。该事件名必须是一个完整的 QName,跟在 XML 规格中定义的名字一样,它由一个名字区(例如,http://www.ibm.com)和本地区(例如,sampleEvent)组成。你可以为多个事件使用相同的名字区,只需将其宣布为默认的名字区,然后为每一个事件只指定本地区。
- Description:(可选项)对事件所做的描述。
- Value type:(可选项)随事件一起传递的值的 Jazz 类名。
- Alias:(可选项)事件名字区特定的名字。
按照如下步骤,创建一个 portlet 程序,该程序集成了事件和公共赋值变量,以便在 portlets 之间进行交流:
- 创建一个 JSR 286 portlet 项目和 portlets。
- 在 portlet 部署描述器(PDD)中创建一个事件定义。
- 添加事件作为 portlet 支持的发布或者处理的事件。
- 编辑 portlet 类中的过程行为或者事件代码,以发布或者处理事件。
- 向服务器发布 portlet 项目。
- 将 portlets 集中到一起。
通过使用 Rational Application Developer V7.5 提供的工具,可以极大地简化这些任务。
在本文中,范例的 portlet 程序展示了 JSR 286 的事件的实用性。传递java.lang.String数据。它由二个 portlets 组成:
- Senderpottle用于发送事件。
- receiverportlet 用于接收并处理事件。
- my-event05本文用户定义的一个事件。
创建 JSR 286 portlet 项目和 portlets
Rational Application Developer 中的 Portlet Project 向导,支持对 JSR 286-compliant portlet 项目的创建。
按照以下步骤创建 portlet 项目:
- 点击 File > New > Portlet Project 以打开向导。
- 指定细节信息,如图 1 所示:
- 对于目标运行时环境,选择 WebSphere Portal v6.1。
- 对于 portlet API,选择 JSR 286 Portlet。
- 对于 portlet 类型,选择 Basic Portlet.
图 1. JSR 286 portlet 项目创建向导
接下来的一步,是向你创建的 portlet 程序添加需要的 portlets 。既然文章在范例程序中涉及到了二个 portlets,那么你就可以向 portlet 项目添加这些 portlets (见于图 2 ):
- 右击 portlet 部署描述器并选择 New > Portlet。
- 输入 portlet 名为 receiver,然后点击 Finish。
图 2. Portlet 创建向导
在 portlet 部署描述器中创建一个事件定义
使用 Rational Application Developer 中包含的事件向导创建事件。按照以下方法创建三个事件:
- 在 Project Explorer 中展开 portlet 项目。
- 右击 portlet 部署编辑器并选择 Event。
如图 4 所示,在 Event 下有两个可用的选项:
- 对 Publish Event 激活该 Portlet
- 对 Process Event 激活该 Portlet
图 4. 事件选项
添加事件作为 portlet 公布事件
当你选择第一个选项时会执行这些操作,该选项就是“对 Publish Event 激活该 Portlet”。
- 向 portlet 程序添加事件定义
- 添加事件作为 portlet 支持的公布事件
- 编辑 processAction() 或者 processEvent() 方法以公布事件
当你选择其他的选项,也就是“对 Process Event 激活该 Portlet”时,执行以下的操作:
- 如果该事件定义尚未存在,那么就向 portlet 程序添加事件定义
- 向 portlet 添加作为支持处理的事件
- 编辑 processEvent() 方法以处理事件
接下来的一步是使用向导来创建事件。按照以下方法,激活 sender 以公布 my-event05 事件:
- 右击 portlet 部署描述器下面的 sender。
- 选择 Event > Enable this Portlet to Publish events。该操作将会打开向导。
- 指定细节信息,如图 5 所示:
- 对于 Event 名字,选择 my-event05。
- 对于 Value 类型,指定 String。
图 5. 激活 portlet 以公布事件的向导
- 点击 Finish。
该向导将会对 portlet 部署描述器做出以下两个更改:
- 向 portlet 程序添加事件定义
- 添加事件作为 portlet 支持的公布事件
列表 1 所示的代码,显示了事件向导是怎样编辑 portlet 部署描述器代码的。
列表 1. 部署描述器代码更改
<?xml version="1.0" encoding="UTF-8"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" id="com.ibm.portletevent.SenderPortlet.918deca672"> <portlet> <portlet-name>sender</portlet-name> <display-name xml:lang="zh">sender</display-name> <display-name>sender</display-name> <portlet-class>com.ibm.portletevent.SenderPortlet</portlet-class> <init-param> <name>wps.markup</name> <value>html</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>zh</supported-locale> <resource-bundle>com.ibm.portletevent.nl.SenderPortletResource</resource-bundle> <portlet-info> <title>sender</title> <short-title>sender</short-title> <keywords>sender</keywords> </portlet-info> <supported-publishing-event> <name>my-event05</name> </supported-publishing-event> <supported-publishing-event> <name>ok</name> </supported-publishing-event> </portlet> <portlet> <portlet-name>receiver</portlet-name> <display-name xml:lang="zh">receiver</display-name> <display-name>receiver</display-name> <portlet-class>com.ibm.portletevent.ReceiverPortlet</portlet-class> <init-param> <name>wps.markup</name> <value>html</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>zh</supported-locale> <resource-bundle>com.ibm.portletevent.nl.ReceiverPortletResource</resource-bundle> <portlet-info> <title>receiver</title> <short-title>receiver</short-title> <keywords>receiver</keywords> </portlet-info> <supported-processing-event> <name>my-event05</name> </supported-processing-event> <supported-processing-event> <name>ookpp</name> </supported-processing-event> <supported-publishing-event> <name>ookpp</name> </supported-publishing-event> </portlet> <filter-mapping> <filter-name>lll</filter-name> <portlet-name>sender</portlet-name> <portlet-name>receiver</portlet-name> </filter-mapping> <filter-mapping> <filter-name>go</filter-name> <portlet-name>sender</portlet-name> <portlet-name>receiver</portlet-name> </filter-mapping> <default-namespace>http://portletevent/</default-namespace> <event-definition> <name>my-event05</name> <value-type>java.lang.String</value-type> </event-definition> <event-definition> <name>ok</name> <value-type>java.lang.String</value-type> </event-definition> <event-definition> <name>ookpp</name> <value-type>java.lang.String</value-type> </event-definition>
</portlet-app> |
编辑 portlet 类的过程操作代码,以发布事件
processAction()方法会得到编辑以发布事件,如列表 2 所示。
列表 2. 对 processAction()事件所做的编辑
public void processAction(ActionRequest request, ActionResponse response) throws PortletException, java.io.IOException { if( request.getParameter(FORM_SUBMIT) != null ) { // Set form text in the session bean SenderPortletSessionBean sessionBean = getSessionBean(request); if( sessionBean != null ) sessionBean.setFormText(request.getParameter(FORM_TEXT)); } //Initialize the fields in the class as per your requirement java.lang.String sampleObject = new java.lang.String("aaaa"); response.setEvent("my-event05", sampleObject); } |
|
你必须编辑事件向导生成的代码,以满足你的需求。因为 my-event05 携带的String数据就是我们使用事件交换信息的所在。
列表 3. 发送 OrderIDType 的代码
String order_id = “你想要发送的数据”; if (order_id!=null) response.setEvent("my-event05", order_id); |
向导会编辑 portlet 部署描述器下面的 portlet,如图 6 中所示。在 sender 节点下,会出现 my-event05 事件。
图 6. Project Explorer
添加 portlet 支持的处理事件
接下来,receiver 需要接受事件。换句话说,receiver portlet 现在需要处理发布的事件了。
按照以下步骤,激活 portlet 以处理事件:
- 展开 Portlet Deployment Descriptor 节点。
- 右击 receiver并选择 Event > Enable this Portlet to Process Event。
图 7. 过程事件选项
“Enable this portlet to process events”向导会打开,如图 8 所示。
图 8. 对 Process 事件窗口激活 Portlet
- 对于 Event Name,选择 my-event05,它已经使用事件发布向导得到声明了。你不能在这里编辑事件定义,但是你可以在 portlet 部署描述器中手动编辑它。
- 点击 Finish 以完成这个过程:
Receiver portlet 的 portlet 部分如列表 4 所示得到编辑。
列表 4. 对 Receiver portlet 所做的更改
<?xml version="1.0" encoding="UTF-8"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" id="com.ibm.portletevent.SenderPortlet.918deca672"> <portlet> <portlet-name>sender</portlet-name> <display-name xml:lang="zh">sender</display-name> <display-name>sender</display-name> <portlet-class>com.ibm.portletevent.SenderPortlet</portlet-class> <init-param> <name>wps.markup</name> <value>html</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>zh</supported-locale> <resource-bundle>com.ibm.portletevent.nl.SenderPortletResource</resource-bundle> <portlet-info> <title>sender</title> <short-title>sender</short-title> <keywords>sender</keywords> </portlet-info> <supported-publishing-event> <name>my-event05</name> </supported-publishing-event> <supported-publishing-event> <name>ok</name> </supported-publishing-event> </portlet> <portlet> <portlet-name>receiver</portlet-name> <display-name xml:lang="zh">receiver</display-name> <display-name>receiver</display-name> <portlet-class>com.ibm.portletevent.ReceiverPortlet</portlet-class> <init-param> <name>wps.markup</name> <value>html</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>zh</supported-locale> <resource-bundle>com.ibm.portletevent.nl.ReceiverPortletResource</resource-bundle> <portlet-info> <title>receiver</title> <short-title>receiver</short-title> <keywords>receiver</keywords> </portlet-info> <supported-processing-event> <name>my-event05</name> </supported-processing-event> <supported-processing-event> <name>ookpp</name> </supported-processing-event> <supported-publishing-event> <name>ookpp</name> </supported-publishing-event> </portlet> <filter-mapping> <filter-name>lll</filter-name> <portlet-name>sender</portlet-name> <portlet-name>receiver</portlet-name> </filter-mapping> <filter-mapping> <filter-name>go</filter-name> <portlet-name>sender</portlet-name> <portlet-name>receiver</portlet-name> </filter-mapping> <default-namespace>http://portletevent/</default-namespace> <event-definition> <name>my-event05</name> <value-type>java.lang.String</value-type> </event-definition> <event-definition> <name>ok</name> <value-type>java.lang.String</value-type> </event-definition> <event-definition> <name>ookpp</name> <value-type>java.lang.String</value-type> </event-definition>
</portlet-app> |
在 portlet 类中编辑事件代码以处理事件
如列表 5 所示,processEvent()方法也得到了更改,该方法对处理接受的事件负责。
列表 5. 对 processEvent( ) 方法所做的更改
public void processEvent(EventRequest request, EventResponse response) throws PortletException, java.io.IOException {
Event sampleEvent = request.getEvent(); if(sampleEvent.getName().toString().equals("my-event05")) { Object sampleProcessObject = sampleEvent.getValue(); String kk=(String) sampleEvent.getValue(); System.out.println(kk); } } |
你需要从 sender portlet 向 receiver portlet 发送 一个java.lang.String。因此,你需要编辑 processEvent() 方法,如列表 6 中的粗体代码所示。
列表 6. 对 processEvent( ) 方法所做的更改
Object sampleProcessObject = sampleEvent.getValue(); String kk=(String) sampleEvent.getValue();//此处是获取数据的时候了。
|
公布 portlet 项目
现在你就可以在 WebSphere Application Server V6.1 上发布 portlet 程序了:
- 右击 portlet 项目(见于图 11 )并选择 Run As > Run on Server。
图 11. 发布 portlet 项目
- 选择 WebSphere Portal V6.1 Server,如图 12 所示。
- 点击 Next,然后点击 Finish。
图 12. 选择你想要运行 portlet 程序的服务器
将 portlets 集中起来
入口服务器可用的布线工具,可以帮助你集中 portlets 之间的关系。
按照以下方式,访问布线工具:
- 为 portlets 所在的页面选择 Edit Page Layout。
- 选择 Wires 项。
- 对源 portlet,从下拉菜单中选择 sender,对于目标 portlet,选择 receiver(图 13)。对于事件名,为 Sending 和 Receiving 区域右击下拉箭头。
图 13. 在 portlet 程序中添加线以定义关系
- 点击加号然后点击 完成。
注:
1、 此例中只介绍了从一个protlet向另一个protlet利用事件传递一个String的方法,如果你想在protlet间进行一对多或是多对一的事件发送与接收只需在第三步:添加事件作为 portlet 支持的发布或者处理的事件就可以了。
2、 在事件的传输过程中事件所携带的数据信息不只有String一种,只要是可序列化类型的数据都可在被发送。
3、 此例只是在同一页面间的不同protlet之间进行事件的发送与接收,在不同页面间的protlet间事件发送与接收方法本人正在研究。