Porlat 事件传递

关键概念

事件

JavaSpecification RequestJSR286 规格的 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 之间进行交流:

  1. 创建一个 JSR 286 portlet 项目和 portlets
  2. portlet 部署描述器(PDD)中创建一个事件定义。
  3. 添加事件作为 portlet 支持的发布或者处理的事件。
  4. 编辑 portlet 类中的过程行为或者事件代码,以发布或者处理事件。
  5. 向服务器发布 portlet 项目。
  6. 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 项目:

  1. 点击 File > New > Portlet Project 以打开向导。
  2. 指定细节信息,如图 1 所示:
    1. 对于目标运行时环境,选择 WebSphere Portal v6.1
    2. 对于 portlet API,选择 JSR 286 Portlet
    3. 对于 portlet 类型,选择 Basic Portlet.


1. JSR 286 portlet 项目创建向导

接下来的一步,是向你创建的 portlet 程序添加需要的 portlets 。既然文章在范例程序中涉及到了二个 portlets,那么你就可以向 portlet 项目添加这些 portlets (见于图 2 ):

  1. 右击 portlet 部署描述器并选择 New > Portlet
  2. 输入 portlet 名为 receiver,然后点击 Finish

 


2. Portlet 创建向导

portlet 部署描述器中创建一个事件定义

使用 Rational Application Developer 中包含的事件向导创建事件。按照以下方法创建三个事件:

  1. Project Explorer 中展开 portlet 项目。
  2. 右击 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 事件:

  1. 右击 portlet 部署描述器下面的 sender
  2. 选择 Event > Enable this Portlet to Publish events。该操作将会打开向导。
  3. 指定细节信息,如图 5 所示:
    1. 对于 Event 名字,选择 my-event05
    2. 对于 Value 类型,指定 String


5. 激活 portlet 以公布事件的向导

  1. 点击 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 以处理事件:

  1. 展开 Portlet Deployment Descriptor 节点。
  2. 右击 receiver并选择 Event > Enable this Portlet to Process Event


7. 过程事件选项

 “Enable this portlet to process events”向导会打开,如图 8 所示。


8. Process 事件窗口激活 Portlet

  1. 对于 Event Name,选择 my-event05,它已经使用事件发布向导得到声明了。你不能在这里编辑事件定义,但是你可以在 portlet 部署描述器中手动编辑它。
  2. 点击 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 程序了:

  1. 右击 portlet 项目(见于图 11 )并选择 Run As > Run on Server


11. 发布 portlet 项目

  1. 选择 WebSphere Portal V6.1 Server,如图 12 所示。
  2. 点击 Next,然后点击 Finish


12. 选择你想要运行 portlet 程序的服务器


 

portlets 集中起来

入口服务器可用的布线工具,可以帮助你集中 portlets 之间的关系。

按照以下方式,访问布线工具:

  1. portlets 所在的页面选择 Edit Page Layout
  2.  
  3. 选择 Wires 项。
  4. 对源 portlet,从下拉菜单中选择 sender,对于目标 portlet,选择 receiver(图 13)。对于事件名,为 Sending Receiving 区域右击下拉箭头。


13. portlet 程序中添加线以定义关系

  1. 点击加号然后点击 完成

注:

1、 此例中只介绍了从一个protlet向另一个protlet利用事件传递一个String的方法,如果你想在protlet间进行一对多或是多对一的事件发送与接收只需在第三步:添加事件作为 portlet 支持的发布或者处理的事件就可以了。

2、 在事件的传输过程中事件所携带的数据信息不只有String一种,只要是可序列化类型的数据都可在被发送。

3、 此例只是在同一页面间的不同protlet之间进行事件的发送与接收,在不同页面间的protlet间事件发送与接收方法本人正在研究。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值