使用 Rational Application Developer 6.0 和 WebSphere Portal Server 5.1开发 JSF portlet

来源:互联网 发布:项目数据分析报告骗局 编辑:程序博客网 时间:2024/05/21 10:55
这是一篇有关使用IBM® Rational® Application Developer 6.0 (IRAD)进行门户开发的系列文章中的第一部分,该系列共有两部分组成。该部分主要是功能性的介绍。你将同时了解到在IRAD中有关的基本 JavaServerFaces (JSF)和 IBM® WebSphere® Portal Server的特性。最后,该篇文章将介绍如何使用JSP快速的创建复杂的Web页,然后在Java Specification Request (JSR) 168 portlet 中显示这些网页。

简介

JavaServerFaces (JSF)是一种在Java Community Process(SM)中相对比较新的规范定义。JSF1.0规范描述了一种Client-Server(C/S)用户接口的快速开发框架.此外, portals和portlet已经成为实现复杂和常用Web接口的一种流行的选择。从这个处理的过程来看,JSR 168是一种工业规范,它描述了实现portlet的标准方法。

这篇文章将会介绍如何构建一个基于Portal的客户关系管理(CRM)的应用程序。它将阐述如何使用IRAD所提供的特性去实现如下的功能:

  • 构建JSR 168 portlet
  • 使用JSF开发portlet 视图
  • 使得portlet行为能相互协作
  • 在portlet中传递用户定义的 JavaBeans
  • 响应其他的portlet,转换 portlet 视图

该 系列文章由两部分组成。这篇文章给出了IRAD工具的总的概览以及描述了将会在该系列文章中用到的场景。然后将重点放在基本的portlet 和 JSF开发上。在第二部分中,你将会看到通过使portlet行为相互协作来实现复杂的用户接口。这两篇文章都采用指南的形式,同时也建议你阅读下面的说 明或是浏览所提供的示例代码。你可以从文章后面下载部分下载示例代码。



回页首

JSF和portlet开发工具

IRAD提供了支持便利的portal和 JSF开发工具。

IRAD的portal和portlet开发工具包括:

  • 新的Portal项目向导: 创建一个新的Portal项目后,你可以使用附加的工具――比如New Theme向导和Portal设计器――创建新的外观和主题,并对它们进行相应的规划。Rational Application Developer 6.0仅支持对WebSphere Portal Server 5.0的portal开发。
  • 新的Portlet向导:该向导帮助我们开发和单元测试那些写入IBM 标准 portlet API中的portlet。
  • 新的Portlet (JSR 168)向导:该向导帮助我们开发和单元测试写入JSR 168 标准 API 中的portlet。创建一个新的portlet项目,你可以使用附加的工具――如portlet开发描述编辑器――开发和单元测试你的portlet。
  • 支持portlet单元测试和远程服务环境:该功能更有利于你进行测试和调试。IRAD支持WebSphere Portal Server 5.0 和 5.1单元测试环境,同时也支持远程服务的测试和调试。

支持JSF开发的工具包括:

  • Faces Portlet option 创建Portlet (JSR 168)向导
  • New Faces JSP wizard 提供JavaServer Pages (JSP)
  • Page designer 带有相关支持视图(Palette, Page Data, 和 Properties)

通 过将portal和JSF技术结合起来,你就可以迅速的为WEB构建复杂的用户接口。在该篇文章中,你需要将注意力集中在使用JSF视图开发JSR 168 portlet。接下来需要注意的是如何使用IRAD提供的工具来创建一个简单的客户关系管理(CRM)浏览应用程序,在这里可以叫做 CRMBrowser。



回页首

一个简单的CRM应用程序

该 系列文章的各部分中使用的例子都是基于一个场景,在该场景中,一个呼叫中心代理需要检索某一特定客户的信息。这个示例应用程序包括两个portlet(见 图1)――Summary portlet和Detail portlet。该代理首先在Summary portlet中浏览客户信息,然后点击该portlet中的链接,就可以看到在Detail portlet中的附加的信息。

Portlet 都符合JSR 168 规范。Portlet视图由JSF来实现的。Summary portlet通过属性登记器与 Detail portlet进行通信。


图1. CRMBrowser应用程序接口
The CRMBrowser application interface

开发这个应用程序,你必须完成两个步骤:

  1. 开发两个portlet分别显示汇总信息和详细信息,然后为这两个portlet创建JSP视图以显示正确的数据。
  2. 使得这两个portlet 之间能从一个portlet传递信息到另一个portlet,这样在Summary Portlet汇总的执行动作才会改变Detail Portlet中的视图。

该系列文章中的这一部分把重点放在实现第一阶段。你将会学到如何使用和选择IRAD的portal和JSF工具创建portlet和portlet视图。

该系列文章的第二部分注重portlet行为协作的更加高级的方面。你将会了解到如何在portlet之间进行复杂数据类型的传递,以及如何在目标portlet中交互数据以响应源数据的变化。



回页首

开发CRMBrowser

要想开发CRMBrowser应用程序,你必须完成下面高级步骤:

  1. 使你的IRAD工作区具有校正能力。
  2. 开发portlet。
  3. 开发 portlet 视图。
  4. 使portle相互协作用以传递数据(在第二部分中需要这么操作)。

让我们具体得看看每个步骤是如何实现。

工作区准备

使用IRAD的 portal工具时,你必须确保在产品安装时就选择了Portal Tools的高级特性。安装完后,你必须使这个portal具有工作区的性能。需要做以下几步:

  • 点击 Window > Preferences > Workbench-Capabilities (见图 2)
  • 扩展Web Developer (advanced) 结点
  • 选中Portal Development复选框

开发具有协作性并且符合JSR 168 规范的portlet包括设计和编辑XML schema (XSD)和WSDL文件。Rational Application Developer提供了优秀的绘图工具,它使操作WSDL 和 XSD文件更加简单。


图2 通过参数对话框设置工作台的性能
Enabling workbench capabilities via the Preferences dialog

启动WSDL和XSD工具

  • 点击Window > Preferences > Workbench-Capabilities
  • 展开 Web Services DeveloperXML Developer两个节点
  • 选择Web Services DevelopmentXML Development节点

当你下次打开WSDL和XSD文件的时候,它们将会在相应的编辑器中显示,在这种编辑器中,你能够像看图一样浏览文件的内容。

既 然已经启动了右边工作台里的功能,你需要连接WebSphere Portal Server5.1的单元测试环境。如果你还没有在你的机器上安装单元测试环境,你需要拿到用于多平台的WebSphere Portal Server 5.1安装CD(或者去下载),然后运行安装程序——可以参见本文后面的资源部分。确定你安装时选择了测试环境这项(如果在安装的过程中碰到任何问题,请参见WebSphere文档——可以在本文后面的资源里找到)

安装完portal server的单元测试环境后,我们需要确保工作台也已经知道:

  1. 在工作台菜单中点击Window > Preferences
  2. 2.在参数对话框中,展开Server 节点选择Installed Runtimes 这个分支 (见图 3).
  3. 点击Add 按钮启动添加新的服务器运行时环境的向导。

图3.通过参数对话框增加另一个运行时环境
Adding another runtime via the Preferences dialog box
  1. 从列表框中选择WebSphere Portal v5.1(如图4所示)

图4. 根据新服务器运行时环境向导添加新的运行时环境
Adding a new runtime with the New Server Runtime wizard
  1. 点击下一步
  2. 输入Portal服务器以及基础应用服务器的路径(见图5)。 注意:这些路径对于不同的机器可能是不同的。
  3. 点击完成

图5 输入portal和基于应用的服务区域
Entering the portal and base application server locations

现在你已经启动WebSphere Portal 5.1的单元测试环境中的工作台了,你可以准备开始开发应用程序了。

开发portlet

CRMBrower应用程序由两个协同的portlet组成——Summary portlet 和 Detail portlet。这节我们将来讨论使用IRAD工具构建这些portlet的步骤。

为你的portlet建一个项目

  1. IRAD工作台启动后,点击Window > Open Perspective > Web,切换到Web透视图
  2. 在项目浏览器视图中点击Dynamic Web Projects ,并点击右键打开上下文菜单。
  3. 点击New > Portlet Project (JSR 168) 。这就开始了新Portlet项目(JSR168)的向导。如图6所示。
  4. 输入CRMBrowser作为名称CRMBrowser作为Name
  5. 清除Create a portlet 这个选项,你将可以单独创建portlet以便可以通过portlet的命名规则来更好地进行控制。
  6. 点击Show Advanced 按钮。
  7. Target Server 列表中选择WebSphere Portal v5.1单元测试环境
  8. 接受其他项的默认值
  9. 点击Finish


图6. 新Portlet项目(JSR168)的向导
The New Portlet Project (JSR 168) wizard

你现在已经在工作台创建了一个叫CRMBrowser的项目。相应的EAR项目CRMBrowserEAR也已经创建了。

创建你的portlet

  1. 在项目导航器视图中选择CRMBrowser这个项目。
  2. 右键点击展开上下文菜单,点击 New > Portlet。进入如图7所示的新增Portlet的向导。新建 > Portlet。进入如图7所示的新增Portlet的向导。
  3. 在向导的第一页中,选择单选框 Faces portlet (JSR 168)Faces portlet (JSR 168)
  4. 点击 Next


图7. 在新增Portlet向导中选择portlet的类型
Selecting the portlet type in the New Portlet wizard

  1. 在portlet设置页面,按照图8的设置,改变设置中Portlet Name, Description以及Code Generation Options


图8. 对Summary Portlet进行设置
Portlet settings for the Summary portlet

重复同样的步骤来创建详细portlet,只是由以下不同:

  • 在新建portlet向导的第二页中使用DetailPortlet作为portlet的名称。
  • 在向导第三页改变视图的名称指向/CustomerDetailView.jsp

现在,看看你项目的结构。这个portlet项目,就像项目浏览器视图中展示的那样,包含一个代表portlet部署描述符的图标。如果你展开这个树节点,你将看到两个代表新增portlet的图标。(见图 9)


图9 JSR 168 Portlet项目的结构
Structure of the JSR 168 Portlet project

Web内容的文件夹包含2个JSP文件——每个portlet一个视图。双击其中一个视图在页面设计中打开它。可以看到产生的JSP实质上都是空白的。你现在可以用JSF把它们变成一个复杂的浏览器。

开发Portlet视图

我们这两个portlet总共将显示三个视图:

  • Summary portlet将显示CustomerSummaryView.jsp。这个JSP页面将显示如下所示的客户信息摘要。
    • 客户唯一的ID号码
    • 客户的 first name
    • 客户的 last name
    • 这个客户与呼叫中心人员讨论的问题列表

    呼叫中心人员可以点击高亮显示的客户ID号或者问题的ID号进行链接。相应的,Detail portlet将显示一个视图,展开显示所选择客户详细信息。

  • Detail portlet显示两个视图。
    • CustomerDetailView.jsp页面显示客户的详细信息(诸如电话号码和地址),作为附加信息对Summary portlet补充
    • IssueDetailView.jsp显示关于特定问题的扩展的信息(如描述,状态,产品ID)

    Detail portlet将基于用户在Summary portlet视图中选择内容显示其详细信息

现在可以准备开发portlet视图了。由于JSF框架是根据模型-视图-控制器(MVC)模式设计的,我们应该首先考虑视图中要显示什么数据。这个阶段,你可以开发你自己的simply bean担当你视图的模型或者根据本文引入有用的代码。

JavaResources > JavaSource 文件夹包含com.ibm.sample.crmbrowser.beans这个包。在这个包里,你可以找到所有用于CRMBrowser视图的bean。

首先,你需要创建CustomerSummaryView.jsp。com.ibm.sample.crmbrowser.beans.Customer bean 作为该视图的模型。这个bean定义了很多的属性:

  • firstNamelastName,和customerId提供了字符串值,这个值将会存于汇总控制中并在网页中显示出来。
  • detailInfoCustomerDetailInfo)包含了附加的连接信息,在这个视图中没有显示出来,但是会作为一个属性传递到Detail portlet中。
  • issuesjava.util.ArrayList)包含了关键对象的列表,每个列表包含了一个分离的交互,而在过去的话客户需要通过呼叫中心进行交互。它将会显示在一张表格中,每个id代表一个动作的链接。

建立SummaryJSP页面

按照以下步骤建立CustomerSummaryView的JSP:

  1. 在项目浏览器视图中,双击CustomerSummaryView.jsp使它在 Page Designer 中打开。你会发现在主工作台左下脚的页面日期视图
  2. 右键点击新建 New > Java Bean(见图10)。将进入如图11所示的新增Java Bean的向导。

图10.添加一个新的JavaBean到Page Data视图
Adding a new JavaBean to the Page Data view
  1. 键入customerSummary作为bean的名字,和com.ibm.sample.crmbrowser.bean.Customer(你所选择创建的所有类型的全值属性名称 )作为所需
  2. 点击Finish。你现在已经添加了一个JavaBean的实例 到page data。

图 11. 添加JavaBean向导
The Add JavaBean wizard
  1. 在Page data视图中打开customerSummarybean并且改变所包含的结果特性的类型(如图十二)。要执行此操作必须通过右击所包含的类型的图标。点击Change Contained Type,进入com.ibm.sample.crmbrowser.beans.Issue作为对话框中元素的类型。

图 12. 转换所包含的结果特性类型
Changing the contained type for the issues property

产生用户接口控制

在下一阶段,你将利用这个bean的定义来产生所需用户的接口控制。

  1. customerSummary bean从Page Data view拖到Page Designer的图中。该动作开始进入JavaBean向导(如图13)。

图 13. 插入JavaBean向导
The Insert JavaBean wizard

这个向导列出了customerSummary bean(和它所包含的其它bean)的特性,和通常显示给最终用户信息的页面控制器。

  1. 清空与customerDetailInfo相邻的校验栏(如图13)。我们在UI页面中将不能显示这个bean。
  2. 点击在Fields to display表格问题行中的最右边的按钮,去启动所插入的JavaBean――为这个bean设定数据控制器引导(如图14)。
  3. 除了issueIdshortDesc清空所有的文件 。在CustomerSummaryView.jsp页面上,我们将仅仅显示一个特定问题的值。
  4. 点击Finish两次来完成两者的向导。

图 14. 需要使用的配置将显示在Summary portlet issues列表中。
Configuring which fields will display in the Summary portlet issues list

IRAD JSF工具将产生如图15所示的表格


图 15. IRAD 的 JSF生成的表格
The form IRAD's JSF tooling generates

你可使用由Page Designer所提供的丰富的编辑函数,特性窗口,和调色板窗口,去精练页面的排版和外观。这篇文章将不会逐一详述具体如何操作,但是由许多关于Resources部分的信息。

完成你的页面,我们需要添加一些动作控制去驱动与Detail Portlet的交互。按照如下的步骤操作:

  1. 展开调色板窗口的Faces Components.
  2. 单击Command Hyperlink.
  3. 终止在customerId 输出域上的超链接。
  4. 重复上述步骤终止在issueId域上的超链接

图16显示了表单UI的结果。


图 16. CustomerSummaryView.jsp的UI定案
Finalized UI for CustomerSummaryView.jsp

开发 Customer Detail 和 Issue Detail 视图

为了开发另外两种窗口你必须重复与CustomerSummaryView.jsp同样的步骤。显示CustomerDetailView.jsp如下:

  1. 用页面设计软件打开。
  2. 添加com.ibm.sample.crmbrowser.beans.CustomerDetailInfo bean到页面数据窗口,正如你为 Summary视图所进行的操作。
  3. 把这个bean拖到Page Designer的视图中去产生UI。
  4. 允许这个工具为这个bean的所有域产生控制器

显现IssueDetailView.jsp页面,完成以下步骤:

  1. 在项目浏览器中选择CRMBrowser项目的WebContent文件夹。
  2. 点击右键并从上下文菜单中点击New > Faces JSP File.
  3. 在以下向导中键入IssueDetailView.jsp作为文件名。
  4. 点击Finish。Page Designer应该打开,显示最新的创建页面。
  5. 正如先前所描述的那样,添加com.ibm.sample.crmbrowser.beans.Issue bean到Page Data窗口。
  6. 拖这个bean到Page Designer的视图中。
  7. 允许这个工具为这个bean的所有域产生控制器。

为Detail portlet指定初始页面

现在你已经创建了你所需的三个视图。你已经创建了控制器,它们为终端用户显示数据即实例化JavaBean 特性,并且它们将再一次执行显示数据。剩下的步骤是编辑portlet调度描述符,并设置Detail Portle的初始视图。其操作如下:

  1. 在项目浏览器中选择 Portle调度描述符。
  2. 在Portlet调度描述符编辑器上双击打开它。
  3. 点击DetailPortlet连接到编辑器的Overview标签。
  4. 在portlet页面上向下滚动,显示Initialization列表。
  5. 编辑com.ibm.faces.portlet.page.view参数,并且设置使其显示CustomerDetailView.jsp (如图17)。
  6. 保存并退出编辑器。

图 17. Portle调度描述符编辑器中的详细描述初始化窗口。
Specifying the initial view in the portlet deployment descriptor editor


回页首

结束语

通过JSF 和 portal技术,你可以构建成熟的Web接口。IRAD提供了工具支持,从而帮助你快速地构建,单位测试,和配置你的应用程序。

第二部分将要讨论你如何能够协调portlet行为,因此你可以完全地执行Summary 到 Detail 的交互。




回页首

下载

描述 文件名称 文件大小  下载方法 Code supporting article crmbrowser.zip 2.6 MB  FTP 关于下载方法的信息 Get Adobe® Reader®

回页首

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文。

  • 在Developing JSF Applications using WebSphere Studio V5.1.1(developerWorks, January 2004)中的文章向你介绍使用JSF的网络开发

  • Trials and betas网页上获取Rational应用程序开发者的评估版。

  • 可以访问WebSphere downloads网页,得到WebSphere产品评估版

  • 可以访问documentation library网页,得到WebSphere Portal产品文件。

  • 在所有的IBM软件开发平台上,IBM Software Developer Platform homepage网页提供了详细化的信息。

  • 有关Rational产品技术的资源,访问developerWorks Rational 专区网页。你将找到技术性的文件,指导性的文章,教学,相关下载,产品信息,等等。有关Rational应用程序开发者特殊的信息,请访问RAD 技术资源网页。

  • 访问网页,可以找到更多相关的产品信息。

  • 通过加入developerWorks blogs,你可以参与开发者协会。

  • 在Rational Software Architect, Software Modeler, Application Developer and Web Developer forum网页上,你可以询问有关Rational应用程序开发者。

  • 可以在Rational开发者书店中购买 Rational books at discounted prices。


回页首

关于作者

 

Mikhail 是一名工作在 IBM 软件集团的软件工程师。









这是一篇关于使用IBM Rational Application Developer 6.0进行JSF (JavaServer Faces)和JSR (Java Specification Request)168开发的系列文章的第二部分(共两部分)。第一部分主要关注于JSF 和 JSR 168开发的基础产品特性并创建了两个portlet和三个CRMBrowser应用视图。在第二部分,你将会了解如何在JSR 168 portlet之间进行通信实现复杂的屏幕流。

简介

这是一篇关于使用IBM®; Rational® Application Developer 6.0(IRAD)进行portal开发的系列文章的第二部分(共两部分,第一部分见Resources部分)。除了理解这些功能性的知识外,你也可以学到有关包含在IRAD中基础的JavaServer™ Faces (JSF) 和 IBM ® WebSphere Portal Server 5.1特性。最后,这篇文章将会讨论如何去实现:

  • 通过WSDL (Web Services Description Language) 将portlet属性展现给WebSphere Portal Server 属性代理。
  • 在portlet之间传递复杂的、用户定义的数据列。
  • 重写由IRAD产生的portlet类的行为,从而转换基于其它portlet传递过来的数据的 portlet视图。

 

使用混合型技术开发协作性portlet,这些技术包括以下几个重要步骤:

  1. 设计portlet之间如何相互影响,也就是说,描述两个portlet之间怎样交换数据。
  2. 启动源portlet
  3. 启动目标portlet
  4. 启动发生在源portlet和目标portlet之间的不同的交互。
  5. 定义portlet之间的连接
  6. 通过WebSphere Portal Server 属性代理调用触发属性传输的事件.

 

首先,我接着第一部分开始,完成这些步骤实现我们CRMBrowser应用程序中的整个概要-细节的浏览功能.你可以从该篇文章的下载部分下载这些实例代码.



回页首

设计Portlet交互

在 定义如何在Summary 和Detail portlet之间启动交互之前,该篇文章将首先论述一下这些Portlet如何在运行期进行交互.不管你什么时候点击Summary Portlet中链接事件,它都会发送一个消息给 Detail Portlet,让它显示相应的实体和数据。

Summary portlet通过你所点击的事件链接向Detail portlet发送不同的数据.比如:当你点击customer id链接时,Summary portlet将向Detail portlet发送一个com.ibm.sample.crmbrowser.CustomerDetailInfo bean的实例.同样,如果你点击了issue id 链接,那么Summary portlet将会向这个Detail portlet发送一个com.ibm.sample.crmbrowser.Issue bean的实例.

要想让WebSphere Portal Server属性代理器知道两个portlet是如何进行交互的话,你必须在他们两个portlet之间定义一个wire。 使用WSDL(接下来会有更具体的介绍)来对这个连接进行描述。这个连接的源数据和目标数据必须是相同的;因此,要想把你的bean从Summary Portal传送到Detail Portal中,你必须定义一个额外的bean作为CustomerDetailInfo和Issue bean实例的持有者。com.ibm.sample.crmbrowser.ShowDetailMessage bean的实例将会在Summary portlet 和Detail portlet之间传输。通过你在CustomerSummaryView.jsp中所点击的链接,它将会很准确的容纳 CustomerDetailInfo bean或Issue bean中的一个实例。

接下来将描述如何配置这个连接来体现出这些语义,以及如何实现在portlet和源、目标JSP(JavaServer? Pages)中需要的java代码。



回页首

启动 Summary portlet 作为一个源

启动这个源portlet包括以下几个步骤:

  1. 使用WSDL定义这个源的属性和动作。
  2. 启动这个源的动作。
    1. 配置这个动作的控制属性从而触发源portlet和目标portlet之间的传递。
    2. 写一些动作句柄代码把正确的信息放入正确的portal编程模型对象中(比如:请求属性)。

JSR168 portlet可以通过属性代理交换属性达到相互协作。一个WSDL文件描述了那些源portlet发布(或传递)给属性代理的属性。在接下来的处理过程中,你将会了解到一些IRAD用来支持协作性portlet开发的工具。

 



回页首

使用 WSDL描述这个源

要想把我们的Summary portlet作为一个属性源,可以简单的右击Project Explorer 视图中的portlet来显示上下文菜单。如图1所示点击Cooperative > Enable Source。

图1、启动可协作性源的向导
Launching the Enable Cooperative Source wizard

可协作性源向导启动后(如图2所示),输入下面示例的值:

  • 数据类型(Data type)的名称
  • 这个新数据类型的命名空间(Namespace)
  • 你想将你的参数绑定到的(Bound to)位置。

图2、可协作性源向导

The Enable Cooperative Source wizard

这个参数(Parameter)术语涉及到这个值如何从源portlet传递到目标portlet中。

  1. None:这个设置表明你不会指定这个值传递的方式,因此属性代理将会使用这个默认行为。
  2. Render参数:仅支持字符型。这个字符串值将会绑定到RenderRequest>对象上。这个render参数可以在动作阶段设置并且在portlet生命周期的render阶段获得。但是它不能在动作阶段取得。
  3. Request参数:仅支持字符型。这个字符串值将会绑定到ActionRequest对象上,并且可以在portlet的生命周期的动作处理阶段得到。这个参数值在请求处理的结束时没有任何意义。(也就是说,当它离开了单个调用时不能持续)。
  4. Request属性:支持任何JavaBean™类型。这个bean将会绑定到ActionRequest对象上。生命周期方面和Request 参数一样。
  5. Session:支持任何JavaBean™类型。这个bean将会绑定到session对象并且将会在客户端和portal 服务器之间的HTTP session期间持续。

 

你将把属性值作为request的一个属性。这样你就可以使用复杂的Java类型在portlet之间传递信息,而不用通过在session中存储多余的信息而降低了服务性能。

可协作性源向导生成了一个WSDL文件(如图3所示),它为属性代理描述了这个portlet。注意到这个Summary portlet由一个特殊的图标标记着,表明这是一个属性源。这个WSDL文件包括以下几个部分:

  • 类型(Types):这部分描述了数据类型(使用XML schema),它们由源portlet产生。
  • 消息(Messages):这部分描述了可以通过portlet产生或引用的消息。
  • 端口类型(Port Type):这部分描述了属性代理看到的portlet抽象接口。
  • 绑定(Binding):这部分描述了如何实现这个抽象接口(端口类型)。

图3.由可协作性源向导生成的结果
Artifacts generated by the Enable Cooperative Source wizard



回页首

激活这个源的动作

这个可协作性源向导将会自动的产生一个表示消息的简单类型(见列表1)。你需要手动修改所产生的WSDL来描述一个复杂的类型(这是因为我们的portlet需要相互传递值――而不是简单的字符)。列表2显示了这个复杂类型的定义


列表1.生成的类型――这个类型描述了一个简单的字符值。

<xsd:schema targetNamespace="http://crmbrowser.sample.ibm.com">
<xsd:simpleType name="ShowDetailMessageType">
<xsd:restriction base="xsd:string"></xsd:restriction>
</xsd:simpleType>
</xsd:schema>

你需要改变这个简单的类型从而正确的描述这个Summary portlet将要发送给细节portlet的消息。这个WebSphere Portal Server Wiring工具稍后将会使用这个类型定义来定义在源和目标之间的一个连接。


列表2. 手动被修改的复杂类型

<xsd:complexType name="ShowDetailMessageType">
<xsd:all>
<xsd:element name="customerDetail"
type="tns:CustomerDetailType"
minOccurs="0" maxOccurs="1"/>
<xsd:element name="issueDetail"
type="tns:IssueType"
minOccurs="0" maxOccurs="1"/>
</xsd:all>
</xsd:complexType>
<xsd:complexType name="CustomerDetailType">
<xsd:all>
<xsd:element name="customerId" type="xsd:string" />
<xsd:element name="firstName" type="xsd:string" />
<xsd:element name="lastName" type="xsd:string" />
<xsd:element name="workPhone" type="xsd:string" />
<xsd:element name="homePhone" type="xsd:string" />
</xsd:all>
</xsd:complexType>
<xsd:complexType name="IssueType">
<xsd:all>
<xsd:element name="issueId" type="xsd:string" />
<xsd:element name="shortDesc" type="xsd:string" />
<xsd:element name="desc" type="xsd:string" />
<xsd:element name="openDate" type="xsd:string" />
<xsd:element name="status" type="xsd:string" />
</xsd:all>
</xsd:complexType>

在你的 WSDL中的这些复杂类型是属性代理定义一个连接用的元数据。他们应能够正确的描述从Summary portlet传递到Detail portlet中的bean的内容(目的是为了正确描述这些连接和他们所实现的功能)。然而,在WebSphere Portal Server 5.1中属性代理并不能在运行期执行校验来保证你所传递的bean与这些抽象的定义相对应。

除了类型定义以外,你需要对生成的绑定信息做一些修改。列表3中显示了工具所生成的默认的绑定,而列表4显示了你在制作可协作性行为时所做的手动的修改。


列表3.生成的绑定的信息

<binding name="Summaryportlet_Binding"
type="tns:Summaryportlet_Service">
<portlet:binding />
<operation name="Summaryportlet">
<portlet:action type="standard" />
<output>
<portlet:param
name="CustomerDetailType"
partname="CustomerDetailType_Output" boundTo="request-attribute" />
</output>
</operation>
</binding>


列表4.对绑定信息的手动修改(注意:手动修改的部分都用粗体表示)

<binding name="Summaryportlet_Binding"
type="tns:Summaryportlet_Service">
<portlet:binding />
<operation name="Summaryportlet">
<portlet:action
type="standard"
name="sendShowDetailResponse"
caption="Send.Detail.Response"
description="Send Detail Response"
/>
<output>
<portlet:param
name="detailInfo"
class="com.ibm.sample.crmbrowser.bean.ShowDetailMessage"
partname="ShowDetailType_Output"
boundTo="request-attribute"
caption="Detail.Info.Type"
description="Detail Info Type"
/>
</output>
</operation>
</binding>

生成的WSDL描述的关键变化包括以下几点:

  • 在操作元素中添加名称(name)属性
  • 在绑定的param元素中添加类(class)属性。(这个类属性指定了在portlet之间传递的Java类型)
  • 添加可选择标题(caption)和描述(description)属性(在使用WebSphere Portal Server 5.1提供的连接工具时很必要)。

 

在列表4中的标记的变化不是简单的格式上的变化,而是在制作portlet消息时本质上的变化。除了在列表3和列表4中 所强调的绑定部分的类型变化以外,也建议你修改文件中的消息和端口类型,从而给这些消息和操作提供更多描述性的名称。这在创建更复杂的用户接口包括它们之 间的多portlet和连接时有很大的帮助。

假如你选择采用这些变化,你将需要保证这个WSDL在匹配消息、端口类型和绑定部分(这该篇文章的下载部分提供的实例源中有所阐述)中的消息和操作名称时的合法性。

 

为完成启动你的源portlet,你需要再完成两步:

  1. 描述一个关键的动作参数,该动作触发了向属性代理的数据传输。
  2. 写动作实现代码将数据放入这个请求对象

 

第一步,先在页面设计器中打开CustomerSummaryView.jsp,并选择Customer Id指令超链接。如图4所示在属性视图中编辑动作的属性。

图4. 输入动作参数,该动作触发了通过WPS属性代理传输属性值。

Entering parameters for the action that will trigger property value transfer via the WPS property broker

你需要定义的关键参数是com.ibm.portal.propertybroker.action,这个值必须与操作绑定(列表4中的sendShowDetailResponse)的动作名称属性的定义的值相同

剩下的步骤包括将你的复杂类型――com.ibm.sample.crmbrowser.bean.ShowDetailMessage bean――放入请求对象中。接下来,通过点击在属性视图(如图5所示)中Quick Edit图标为Customer Info链接生成一个动作句柄方法。

图5.为CustomerId生成一个动作句柄代码
Generating the action handler code for CustomerId

如下面的列表5所示完成动作句柄的实现。


列表5.将CustomerDetailInfo放入请求对象中

public String doLink1Action() {

// Determine which action link has been clicked and dispatch the corresponding
// object to the property broker
ShowDetailMessage message = new ShowDetailMessage();
message.setCustomerDetail(getCustomerSummary().getCustomerD
etailInfo());
getRequestScope().put("detailInfo", message);

return "";

}

完成上述步骤后。你的Summary portlet能有效的作为一个属性源。尽管如此,假如你回到最初的应用场景中,这个Summary portlet可以向Detail portlet发送两个不同类型的消息。

 

  • 一个是当用户点击customerId链接时发送客户具体信息。
  • 另一个时当客户点击issueId链接时发送issue信息

 

因此本质上,你所要做的是为issueId链接产生动作句柄代码。

  1. 在页面设计器中选择链接
  2. 输入参数:
    • 1 – 为com.ibm.portal.propertybroker.action 输入同样的参数。
    • 2 –配置一个参数用来获取起源动作的链接的值
  3. 写一个动作句柄代码用com.ibm.sample.crmbrowser.bean.Issue bean的一个合适的实例定位com.ibm.sample.crmbrowser.bean.ShowDetailMessage bean ,然后存储这个bean作为这个请求的一个属性。

 

创建一个参数,它将会持有第2步所选择的论题的值:

  1. 在属性视图中点击 Add Parameter 按钮(如图5所示)。
  2. 在参数表剩下的列中输入issueId 的名称。
  3. 点击参数表的右侧的列中—在那个列中将会出现一个按钮。
  4. 点击按钮提示Select Page Data Object对话框。
  5. 导航在这个对话框中的对象,找到issues 列表(如图6所示)Issue对象中issueId 域。

 

图6.将issueId参数映射到一个变量上
Mapping the issueId parameter to a variable

这个变量将会传输选定的issueId到我们的动做句柄代码中。这个动作句柄代码(如列表6所示)使用这个参数来取得合适的Issue对象。


列表6.通过请求对象发送这个Issue

public String doLink2Action() {

// Type Java code that runs when the component is clicked
ShowDetailMessage message = new ShowDetailMessage();

String issueId = (String)getRequestParam().get("issueId");

if (issueId != null)
{
for (int i = 0; i <
getCustomerSummary().getIssues().size(); i++)
{
Issue issue =
(Issue)getCustomerSummary().getIssues().get(i);
if (issueId.equals(issue.getIssueId()))
{
message.setIssueDetail(issue);
getRequestScope().put("detailInfo",
message);
break;
}

}

}

return "";

}

完成这些步骤以后,你的Summary portlet可以作为一个属性源支持你应用设计。



回页首

启动 Detail portlet 作为目标

要想为属性值启动这个Detail portlet作为目标,你需要执行下面的几个步骤:

  1. 生成WSDL为WPS属性代理描述portlet接口。
  2. 重写所提供的portlet类,并实现processAction()方法。它可以处理来自于属性代理的动作请求,并重定位到相应的视图中。
  3. 修改生成的页面代码,当页面下载后初始化模型bean。

 



回页首

生成 WSDL

你将使用可协作性目标向导生成WSDL。启动这个向导,在Project Explorer视图中选择这个portlet,右击它,并点击Cooperative > Enable Target(这个步骤和启动协作性源很相似)。

 

可协作性源向导如图7所示。你需要填写下面一些值:

  • 数据类型(Data type):使用和可协作性源portlet完全一样的名称,生成WSDL以后,你还需要手动修改保证在目标WSDL中定义的类型与在源WSDL中的一样。
  • 命名空间(Namespace):同样,这个命名空间和在源中输入的一样。
  • 动作(Action):输入任意你想输入的名称。尽管你可以使用浏览按钮定位目标页的动作,这个方法在这种情况下并不推荐,因为目标porlet会动态的转换视图。建议在动作的名称前缀加上receive(并不强制要求)。
  • 参数:你可以使用任何名称来标识这个类型实例。你很可能使用类似与类型名称的名称帮助定位不同的类型实例。
  • 绑定(Bound to):在这个域中的值与启动源部分所描述的一样。生命周期方法也一样。这种情况下,你将会使用Request Attribute设置。这样保证你的消息(属性值)作为ActionRequest对象的属性传递给目标portlet。
  • 标签和描述(Label 和 Description):这些项是可选的,但是应该填写上,因为当你使用连接工具时,它们可以帮助你创建连接。在这个域中你可以使用任意的值。

 

图7.可协作性目标向导

The Enable Cooperative Target wizard

可协作性目标向导生成了一个WSDL文件(如图3所示), 它描述了目标portlet通过属性代理取得的属性。要想启动这个目标,你需要手动编辑所生成的WSDL:

  • 修改生成的类型定义使其与源portlet一致。源类型和目标类型必须相同;否则,连接工具将不允许你在单元测试期间创建两个portlet之间的连接。
  • 编辑消息、端口类型和绑定的信息使其能够反映出你在使用消息和操作命名时的习惯(在获取相关的消息时是可选择的,但是对于带有很多消息的复杂接口强烈建议你采用)。
  • 编辑绑定信息。

 

图8.由可协作性目标向导生成目标WSDL文件
Target WSDL file generated by the Enable Cooperative Target wizard

列表7显示了这个生成的WSDL 绑定。列表7显示了为启动协作性行为在绑定信息中进行的手动的修改。


列表7. 由可协作性目标向导生成的WSDL

<binding name="Detailportlet_Binding"
type="tns:Detailportlet_Service">
<portlet:binding />
<operation name="Detailportlet">
<portlet:action
name="receiveShowDetailRequest"
type="standard"
caption="Receive.Detail.Request"
description="Receive Detail Request" />
<input>
<portlet:param
name="detailInfo"
partname="ShowDetailMessageType_Input"
boundTo="request-attribute" />
</input>
</operation>
</binding>


列表8. 对WSDL部分的手动修改(修改部分用粗体标志)

<binding name="DetailPortlet_Binding"
type="tns:DetailPortlet_Service">
<portlet:binding />
<operation name="receiveShowDetailRequest">
<portlet:action
name="receiveShowDetailRequest"
type="standard"
caption="Receive.Detail.Request"
description="Receive Detail Request" />
<input>
<portlet:param name="detailInfo"
class=
"com.ibm.sample.crmbrowser.bean.ShowDetailMessage"
partname="ShowDetailType_Input"
boundTo="request-attribute"
caption="Detail.Info.Type"
description="Detail Info Type" />
</input>
</operation>
</binding>

对绑定信息(并不仅仅依据你的习惯性的选择)的相当重要的修改包括添加一个类属性,它描述了整个符合条件的java类型通过属性代理传递给目标。这个类型必须与启动源portlet使用的属性一样。在这种情况下它就是com.ibm.sample.crmbrowser.bean.ShowDetailMessage。你同样也必须添加标题和描述信息到这个param元素中。这在你创建连接时很有帮助。

 

重写默认的 portlet 行为

完成这个目标属性的WSDL描述后,你需要重写所提供的portlet类和实现processAction()方法。IRAD JSR 168 Faces portlet项目提供一个促进JSF portlet开发的类-- com.ibm.faces.webapp.FacesGenericPortlet。这个类可以在jsf-portlet.jar文件中找到。

该类的实现包括一些限制和不能处理的地方:

  • 动态实体转化
  • 处理用户自定义的数据类型

 

为了克服这些限制,你需要重写目标portlet中的processAction()方法。此外你需要在目标portlet中写某个processAction方法。还要写某些客户代码处理来自于源portlet的消息。

 

创建重写方法,按照以下几个简单的步骤:

  1. 在JavaSource目录下创建一个新的包(在示例代码中使用com.ibm.sample.crmbrowser.portlet)。
  2. 创建一个命名为DetailPortlet新的Java类。
  3. 在New Class向导中,扩展com.ibm.faces.webapp.FacesGenericPortlet
  4. 打开Java编辑器后,点击里面的类的定义并按Ctrl+Space键得到编码帮助。
  5. 在编码帮助窗口中选择processAction()

 

编辑器将会生成一个processAction()重写的内核实现,它包括一个对基类的调用。

列表9显示了你的DetailPortlet.processAction()方法。在这个方法的实现中,你需要执行一些关键的动作:

  1. 在ActionRequest中查找com.ibm.portal.propertybroker.action属性。它会告诉你由属性代理所触发的动作(它与终端用户点击一个在当前portlet视图中的动作控制相反)。
  2. 从ActionRequest中获取复杂类型。
  3. 基于这个类型的内容来决定显示哪个视图。
  4. 在session中存储复杂类型。
  5. 重定位这个portlet到一个合适的视图中。它可以通过设置 com.ibm.faces.portlet.page.view session属性指向想要得到的视图JSP的URL。当处理请求响应序列的提交阶段时,FacesGenericPortlet实现将使用这个属性显示 正确的视图。
  6. 调用基类实现来处理其它所有的事件(为视图的动作保持一个默认的行为)。

 


列表9. DetailPortlet.processAction()方法的实现。

public void processAction(ActionRequest request, ActionResponse response)
throws PortletException {

// Reterive target action name
String actionName = (String)request.getParameter
("com.ibm.portal.propertybroker.action");

if (actionName != null)
{
// Invoke custom processing only if property broker action
String actionURL = "";
if(actionName.equals("receiveShowDetailRequest"))
{
ShowDetailMessage detailInfo =
(ShowDetailMessage)request.getAttribute
("detailInfo");

if (detailInfo.getCustomerDetail() != null)
actionURL = "/CustomerDetailView.jsp";
else
actionURL = "/IssueDetailView.jsp";

request.getportletession().setAttribute("detailInfo", detailInfo);
}

if (!actionURL.equals(""))

request.getportletession().setAttribute
("com.ibm.faces.portlet.page.view", actionURL);

}

// Otherwise invoke default behaviour
super.processAction(request, response);

}



回页首

修改生成的网页代码

剩下的编码是要确保目标视图在portlet加载它时能适当地进行初始化。按照JSF架构,最好的时机是当作为JSF页的模型的bean被创建的时候。IRAD JSF工具生成JavaBean,你可以与JSF控制器进行程序上的交互(如图9中所示)。

图9. JSF工具生成的包和bean
Package and bean generated by JSF tools

列表10显示了在IssueDetailView.java 中pagecode.IssueDetailView.getIssue() 方法的实现。该方法在JSF运行时重构对象树时的任意时间内被调用,这棵树将会最终为终端用户创建一个HTML网页。在这个方法的实现中关键的是:

  • 只有当结果为空时进行初始化。
  • 我们这里所说的复杂类型――Issue――由session中获取。

 


列表10.实现pagecode.IssueDetailView.getIssue()方法。

public Issue getIssue() {

if (issue == null) {

ShowDetailMessage detailInfo =
(ShowDetailMessage)getSessionScope().get("detailInfo");

if (detailInfo != null)
issue = detailInfo.getIssueDetail();

if (issue == null)
issue = new Issue();

}

return issue;

}

为了使这个应用更加完整的实现,需要为pagecode.CustomerDetailView.getCustomerDetail()写一个类型的方法实现。(你可以在这篇文章的下载部分看到更多的有关代码的信息)。

 

连接这些 portlet 和单元测试

剩下的最后一步是对该应用进行单元测试。如果你还没有这样做的话,按照下面的步骤创建一个新的服务器:

  1. 在 Server 的视图中,右击显示内容菜单,然后点击New > Server。
  2. 在NewServer向导中选择WebSphere Portal 5.1 Unit Test Environment。
  3. 为这个服务器的配置应用的列表添加CRMBrowserEAR。
  4. 点击Finish退出这个New Server向导。
  5. 双击这个在Servers视图中的新的服务器,打开服务配置编辑器。
  6. 转换到Portal页,并选择Enable base portlet for portal administration and customization复选框。
  7. 保存你所做的修改并退出编辑器。

 

在Project Explorer视图中选择CRMBrowser动态Web项目。
你的WebShere Portal UTE现在可以打开,并且一个显示你的portlet的浏览器将会自动打开。

 

下一步你需要定义你的Summary portlet和Detail portlet之间的连接。这需要完成下面的几个步骤:

  1. 点击浏览器中的portal接口的Edit Page页。
  2. 点击Wires页
  3. 使用Wires页面中的下拉框定义Summary portlet(源)和Detail portlet(目标)之间的一个连接。这需要首先选择Source Portlet,然后选择Sending动作,在选择Receiving Portlet,最多在合适的下拉框中选择Receiving动作(如图10所阐述的那样)。
  4. 点击Done退出该页并返回到你的应用UI中。

 

图10.Portlet连接工具
 Portlet wiring tool

现在你可以开始使用CRMBrowser应用。需要变更Detail portlet中的视图――显示客户具体信息或问题的具体信息――通过Summary portlet视图中你所点击的动作链接。

 



回页首

结论

WebSphere Portal Server Property Broker使得你可以在portlet之间传递复杂的数据。你可以使用这个特性实现portlet之间复杂的用户接口流。IRAD提供了能够帮助你在开 发中利用Property Broker的特性的工具。你可以通过IRAD重写所生成的代码从而加强它的性能并增强应用的行为。要想学习这方面更多的技术,请浏览下面的 Resourses部分中列出的其它文章和参考资料。




回页首

下载

描述 文件名称 文件大小  下载方法 编码支持性文章 crmbrowser.zip 2.6 MB HTTP 关于下载方法的信息 Get Adobe® Reader®

回页首

参考资料

  • 该系列文章的第一部分Developing JSF portlet with Rational Application Developer 6.0 and WebSphere Portal Server 5.1, Part 1: Developing JSR168 JSF portlet(developerWorks,2005年3月)介绍了包含在IRAD中基础的JavaServerFaces(JSF) 和 IBM WebSphere Portal Server特性以及论述了如何使用JSF快速的创建复杂的Web页,然后显示了一些Java Specification Request (JSR) 168 portlet中的页面。

  • Developing JSF Applications using WebSphere Studio V5.1.1(developerWorks,2004年1月)文章介绍使用JSF的Web开发。

  • 从Trials and betas页得到Rational Application Developer的评估版。

  • 访问WebSphere downloads网页,可以得到WebSphere产品的评估版。

  • 访问documentation library网页,可以看到WebSphere Portal产品的文档。

  • IBM Software Developer Platform homepage中提供了有关整个IBM Software Development platform的具体信息。

  • 访问developerWorks Rational content area页,可以看到Rational产品的技术资源。你可以找到技术文档、指引性文章、培训、下载、产品信息以及更多的资源。可以访问RAD technical resources page得到关于Rational Application Developer的详细的信息。

  • 访问IBM Rational marketing pages可以找到更多产品相关的信息。

  • 参与developerWorks blogs加入developerWorks团体。

  • 在Rational Software Architect, Software Modeler, Application Developer and Web Developer forum中咨询有关Rational Application Developer的问题。

  • 在Developer Bookstore的Rational部分中购买Rational books at discounted prices.


回页首

关于作者

 

Mikhail Genkin是工作在IBM Toronto Software Development 实验室的IBM SWG System House团队的一名场景设计师。他的工作包括指导IBM的专业评审以及Java和Web基于服务的企业访问的竞争性工具。他建议一些IBM 开发团队为J2EE、Web services、 RDBMS、和 EIS访问的产品的可用性、性能和互用性方面创建WebSphere工具。他曾为VisualAge® for Java,企业版的几个发布版本做过贡献。Mikhail具有加拿大渥太华Carleton大学的地球物理学学士学位和渥太华大学地球科学的硕士学位。他 是Sun公司认证的一名Java程序员,并且也获得了 IBM Certified Developer Associate - IBM VisualAge for Java 的认证。

原创粉丝点击