UML软件工程组织

运用Rational XDE Pattern、WebSphere Studio和IBM Portal Toolkit快速设计Portlet
Sandro Schwedler
IBM WebSphere Innovation Center
Stuttgart, Germany

©IBM版权所有,2003年。保留所有权利。

引言

Rational®eXtended Development Environment(以下简称为Rational XDE™)是一个设计、开发、部署和文档化Java应用的强大工具。通过使用Rational XDE与统一建模语言(UML)或自由形式(free-form)模型,开发人员可以对应用和应用行为进行建模和可视化处理。由于Rational XDE是用IBM®WebSphere® Studio Application Developer(以下简称为Application Developer)进行集成的,因此不需要在开发生命周期中进行工具的转换。

Rational XDE的最鲜明的特征之一是您能够定义自己的模式来捕捉(capture)应用设计并使之自动化。本教程适合于这样的portlet开发人员,他们想学习如何从Rational XDE模式的相关能力中获益,以及如何重用已经证明的portlet模式来缩短开发时间。

为完成本教程,以下软件是必须的:

  • WebSphere Studio Application Developer, Version 5.0
  • IBM Portal Toolkit Version 4.3
  • Rational XDE v2003

State模式

对于给定的软件设计问题,模式是已经证明、可重用的解决方案。通过使用模式,开发人员可以节省时间,并且从专家的技术专长中获益。Rational XDE提供了许多模式,它们是工业标准Gang of Four(GoF)模式解决方案(要获得更多的关于这方面的信息,请参考Design Patterns: Elements of Reusable Object-Oriented Software,Addison-Wesley,1995年)。State模式模式(State pattern)就是其中之一。图1显示了State模式的一个类图。

图1. State模式的类图
State模式的类图

一般来说,如果一个对象必须在运行时改变其行为或状态,就会使用State模式。这种模式的一个例子可以是图形程序,图形程序提供了不同的绘画工具,而每种工具都具有不同的行为。为了以相同的方式处理不同的状态,State模式实现了一个抽象State类,该类表示了所有的具体状态,并且提供了一个接口及方法来处理状态请求。该State类是由State子类进行实现的,实现每个具体状态的特定行为。该模式的客户机使用Context类来执行特定状态的请求。Context类将这些请求委托给状态对象,并且提供了方法来改变当前状态。从一种状态到另一种状态的转换也可以由State子类进行处理。

那么,这意味着什么呢,一个portlet应用如何从该方法中获益呢?

portlet常常需要根据用户的输入显示不同的数据页,其中每一页都与某种状态相关联。图2显示了这样的一个例子。

图2. 样本portlet应用的状态转换图
样本portlet应用的状态转换

如图所示,用户首先从列表中选择一个项目,比如顾客名称。然后,portlet从其初始的Main View状态转变到Detail View状态。在这种状态中,portlet显示一个页面,带有关于所选项目的详细信息,比如顾客地址。将从一个状态到另一个状态的转换绑到一个动作;在这种情况下,JSPshowDetailsViewAction动作从数据库中读取顾客信息,然后再通过JSP将详细信息呈现给用户。

这样一个portlet的控制逻辑可以使用State模式进行实现。如图3中的类图所示。

图3. 状态portlet模式的类图
状态portlet模式的类图

下面说明了在这个portlet中应用State模式后所发生的变化:

  • 在第一次调用时,MyPortlet类的服务方法使用InitialStateManager的getInitalState方法获取一个初始状态。 在我们的示例中,该方法返回MainViewState的一个实例。
  • 然后,MyPortlet执行MainViewState的performView方法。
  • performView方法包含一个JSP,这个JSP显示Main View状态的数据;在这种情况下,是一个顾客名称的列表。
  • 为切换到另一个状态,主视图的JSP显示了一个到portlet URI的链接,portlet URI与动作字符串showDetails相关联。
  • 当用户选择该链接时,WebSphere Portal执行MyPortlet类的actionPerformed方法。
  • 根据该动作字符串,MyPortlet执行Action子类的actionPerformed方法;在本例中,使用的是ShowDetailsViewAction。
  • ShowDetailsViewAction的actionPerformed方法执行代码以获得顾客详细信息,然后在Detail View状态中呈现出来。
  • actionPerformed方法通过将DetailsViewState对象放到会话中来定义下一个状态。该会话属性的名称是当前的portlet方式(mode),因此我们可以在需要时为每个portlet方式定义不同的状态。
  • 再次调用服务方法,但是在本次请求时,MyPortlet从会话中取得当前状态。由于当前状态是DetailsViewState,所以就调用DetailsViewState的performView方法。
  • DetailsViewState的performView方法包含一个显示顾客详细信息的JSP。

MyPortlet类作为该状态的上下文,Action子类负责设置当前portlet请求中所用的状态。

我们将描述如何在Rational XDE中设计State模式以及如何在portlet开发中使用它。在设计完该模式之后,您将可以为portlet应用创建无穷多个状态和动作。

要得到关于portlet应用和数据库访问、异常处理和其他主题中State模式的详细信息,请参见相关信息

创建WebSphere Portal API的引用模型

为了在Rational XDE中使用WebSphere Portal API构建应用,您需要这种API的一个模型。模型是系统的抽象,它包含各种图表和模型元素,例如类和接口,之所以需要模型是因为状态portlet模式使用和扩展WebSphere Portal API的类。这样的API模型被称为Rational XDE中的引用模型。在WebSphere Studio Application Developer中,所有开放式模型和它们的元素都显示在Modeling透视图的Model Explorer视图中。

要创建WebSphere Portal API的引用模型,请遵循以下步骤进行操作:

  1. 切换到WebSphere StudioModeling透视图。Modeling透视图由Rational XDE提供,它包含视图和编辑器,可以用来设计应用和模式。
  2. 选择File => New => Other,然后在Modeling(建模)类别中选择Java Modeling Project。单击Next按钮。
  3. 将项目命名为WebSphere Portal API Model,然后单击Finish按钮。这将创建一个新的项目,包含一个空的Java代码模型。这个新的模型会在Model Explorer的右侧打开。
  4. Navigator视图中,选择新创建的项目,接着选择File => Import..=> File System,打开导入向导,然后单击Next按钮。
  5. 单击 Browse… 按钮。
  6. 选择WSAD_INSTALL_DIR$/wstools/eclipse/plugins/com.ibm.wps_4.2.0目录。在此路径中,WSAD_INSTALL_DIR$表示您的Application Developer的安装位置。单击OK按钮。
  7. Import对话框中,选取右侧的portal-api.jar。单击Finish按钮。
  8. Navigator视图中,右键单击portal-api.jar,然后选择Reverse Engineer
  9. Reverse Engineer对话框中,选择顶部的元素portal-api.jar,然后单击Finish按钮。

4. 反向工程对话框
 反向工程对话框

当反向工程的过程结束时,您将在Model Explorer中看到WebSphere Portal API的包和类。您现在可以准备创建State portlet模式了。

创建State模式

构建新的模式的能力是Rational XDE最主要的特征之一。模式可以通过参数的配置轻松地进行自定义,以满足应用的需求,使得这些模式的功能非常强。模式一般存储在一个Java Content Model中。该模式只是一个基本的模型,它不支持Java代码生成和反向工程。在Java Content Model中设计完模式后,您可以将它应用到一个Java Code Model中,Java Code Model然后会生成代码。

此时,您可以选择继续下面的步骤以对整个模式进行建模,也可以使用我们在下面下载ZIP文件中为您准备好的文件。如果您选择后者,请跳到使用准备好的模型

创建新的模式资源

遵循以下步骤创建一个新的模式资源:

  1. 切换到Modeling透视图。
  2. 从主菜单中选择File => New => Other,进入New Project向导。
  3. Java类别中选择Java Project,按钮然后单击Next按钮。
  4. 将该项目命名为State Portlet Pattern Model,然后单击Finish按钮。
  5. 切换回Modeling透视图。在Navigator视图中,选择新的项目。
  6. 从下拉菜单中选择New => Model。从Java文件夹中选择Java Content Model。将该文件命名为Portlet State Pattern Model,然后单击Finish按钮。新的模型会在Model Explorer中打开。
  7. Model Explorer中,右键单击Portlet State Pattern Model,然后选择Add UML => Pattern Asset
  8. Add Pattern Asset对话框中,输入State Portlet Pattern作为Pattern NamePortlet Patterns作为library name。单击Finish按钮。这就创建了一个新的空模式。

5. Add Pattern Asset对话框
Add Pattern Asset对话框

添加模板参数到模式中

在创建模式的过程中,您必须至少定义一个模板参数。模板参数是一个占位符,它在应用该模式填入。它一般用于为模式提供一个或多个输入,使得为我们想要应用该模式的应用自定义模式成为可能。参数在模式中几乎可以表示任何东西,例如类、接口、用况(use case)、包等,并且它应该是可以在模型中通过JavaScript很容易地进行访问。我们将定义参数以输入portlet状态、动作和portlet类:

  1. Model Explorer中,在RASPackage1目录下选择State Portlet Pattern,然后从下拉菜单中选择Add => UML => Template Parameter(图6)

6. 添加模板参数
添加模板参数

  1. 将新的参数命名为Portlet Class Parameter
  2. 右键单击新的参数,然后选择Add => UML => Type => Class,以将该参数标识为一个Class类。
  3. 将该类命名为Portlet Class。
  4. 选择新的类,并且从下拉菜单中选择Select in Pattern Explorer
  5. 切换到底部的Pattern Properties视图,为该类选择ReplaceMerge Behavior,然后切换回Model Explorer视图。这将在我们应用该模式时替换整个portlet类。
  6. 右键单击新的Portlet Class,然后选择Add => UML = > Operation。将新的操作命名为actionPerformed
  7. 选择新的操作。在Properties视图中,将JavaAbstract属性改变成False
  8. Model Explorer中,右键单击actionPerformed方法,然后选择Add UML => Parameter。将新的参数命名为event
  9. Properties视图中,输入一个TypeExpressionActionEvent
  10. 接下来,为该方法指定一个void型的返回值。添加一个参数到该方法中并指定为0。
  11. Properties视图中,设置该属性的值:
    • Kind: 3-Return
    • TypeExpression: void
    Kind属性设置为3-Return,将该参数定义为一个返回值。

7. Model Explorer中的actionPerformed方法
Model Explorer中的actionPerformed方法

  1. 为下列方法添加Portlet类型的Portlet类参数,如步骤7中所述
    Method name JavaAbstract Parameter name TypeExpression Kind
    service False request PortletRequest 0-IN
    response PortletResponse 0-IN
    () void 3-RETURN

  2. 接下来,添加这些附加参数:
    • StatesActions参数对于定义StateAction类的名称来说是必须的。
    • Markup参数IDState类使用以定义JSPs的路径。
    将下列模板参数添加到State portlet模式,如步骤1中所述
    Template parameter name Template Parameter Type Template Parameter Type Name
    States String StateName
    Actions String ActionName
    Markup String MarkupName

  3. 选择States模板参数。
  4. Properties视图中,选择一个表示多样性的1..*。这使得您在应用该模式时可以输入多个状态。为Actions模板参数重复此步骤。
  5. portlet类继承了Portlet Adapter类,并且实现了ActionsListener接口。为了对这种关系进行建模,Rational XDE提供了一个Collection编辑器。右键单击Portlet Class,然后选择Collection Editor

8. Portlet类的关系
Portlet类的关系

  1. Relationships选项卡中,单击插入新的实现旁边的小黑三角块。
  2. Select Element对话框中,选择WebSphere Portal API Model => org.apache.jetspeed.portlet.event.ActionsListener
  3. 再次单击该三角块,但是这次插入一个Generalization,然后选择org.apache.jetspeed.portlet.PortletAdapter类。
  4. 单击Close按钮。

9. 添加完所有参数后的Model Explorer
添加完所有参数后的Model Explorer

状态portlet模式建模

Rational XDE提供了不同的图表类型,以对应用和模式进行建模。在这一部分中,我们将使用一个类图设计我们的新模式。您可以将一个图表想象成您的模型上的一个视图;一般来说,一个图表不会包含一个模型的所有元素。

要设计该模式,我们必须添加类、接口和参数。请注意这个模式中的一些参数是通过JavaScript代码进行定义的,但是当应用该模式时,这些代码将会被为模板参数传进来的值代替。

要设计该模式,可以遵循以下步骤进行操作:

  1. Model Explorer视图中选择RASPackage1,然后从下来菜单中选择Add Diagram => Class,创建一个新的类图。将该图命名为State Portlet Diagram。新的图会自动打开。
  2. 从左侧的Toolbox中选择Java => Java Class,然后在State Portlet Diagram中单击任何地方。
  3. 输入一个类名Action。然后选取Abstract modifier。单击OK按钮。这将为该模型和该图添加一个新的抽象类。
  4. 右键单击Action类,然后选择Collection Editor
  5. Relationships选项卡中,单击箭头旁边的小黑三角块,以插入一个新的Realization(实现)。在Select Element窗口中,选择WebSphere Portal API Model -> org.apache.jetspeed.portlet.PortletAction。单击Close按钮。

10. action类的Collection编辑器
action类的Collection编辑器

  1. 右键单击Action类,然后选择Add => UML = > Operation
  2. 将新的操作命名为actionPerformed
  3. Model Explorer视图中,选择新的操作。在Properties视图中,设置属性JavaAbstract的属性为True
  4. Model Explorer视图中,右键单击actionPerformed方法,然后选择Add UML => Parameter。将新的参数命名为request
  5. Properties视图中,为该参数的TypeExpression输入一个PortletRequest
  6. 添加一个名为portletContext的附加参数以及PortletContext的TypeExpression。
  7. 添加另一个参数,而且用以下属性值对其进行命名:
    • Kind:3-Return
    • TypeExpression:void

11. 添加完action类后的Model Explorer
 添加完action类后的Model Explorer

  1. 将以下三个方法添加到Action类中,如步骤4中所述:

    方法名 JavaAbstract 参数名 TypeExpression 类型
    setState True request PortletRequest 0-IN
    () void 3-RETURN
    setState False request PortletRequest 0-IN
    nextState State 0-IN
    () void 3-RETURN
    getLog False () PortletLog 3-RETURN

  2. 添加一个新的类到State Portlet Diagram中,并且命名为Actions
  3. 将该类重命名为<%=Actions.getValue()%>。当应用该模式时,Rational XDE将这段JavaScript代码替换为用户输入的Actions参数。因为我们为Actions参数设定了一个多样性1..*,工具将为每个Actions参数值创建一个新的类。
  4. Java Toolbox中选择Generalization工具,然后画一个从<%=Actions.getValue()%>类到Actions类的Generalization(12)

12. 添加完Action<%=Actions.getValue()%>类之后的类图
 添加完Action和<%=Actions.getValue()%>类之后的类图Class diagram after adding the Action and <%=Actions.getValue()%> classes

  1. 将以下两个方法添加到<%=Actions.getValue()%>类,如步骤6所述:

    方法名 JavaAbstract 参数名 TypeExpression 类型
    actionPerformed False request PortletRequest 0-IN
    portletContext PortletContext 0-IN
    () void 3-RETURN
    setState False request PortletRequest 0-IN
    () void 3-RETURN

  2. Java Toolbox中选择Java Interface,然后把它添加到图中,命名为State。该接口包含以下方法:

    方法名 JavaAbstract 参数名 TypeExpression 类型
    performView True request PortletRequest 0-IN
    response PortletResponse 0-IN
    portletContext PortletContext 0-IN
    () void 3-RETURN

  3. Model Explorer视图中,选择performView方法。
  4. Properties视图中,为JavaThrows属性输入IOException, PortletException
  5. 添加一个新类<%=States.getValue()%>,它包含以下方法:

    方法名 JavaAbstract 参数名 TypeExpression 类型
    performView False request PortletRequest 0-IN
    response PortletResponse 0-IN
    portletContext PortletContext 0-IN
    () void 3-RETURN
    getInstance False () State 3-RETURN

  6. Java Toolbox中,选择Realization工具,画一个<%=States.getValue()%>State接口的Realization
  7. <%=States.getValue()%>类中,选择performView方法。
  8. Properties视图中,为JavaThrows属性输入IOException, PortletException
  9. 选择getInstance方法。
  10. Properties视图中,将JavaStatic属性改变成True
  11. Java Toolbox中选择Java Directed Association。画一个包含源和目标<%=States.getValue()%>的关联。
  12. Create Directed Association对话框中,接受默认值,然后单击OK按钮。
  13. 在该关联的Properties视图中输入以下的属性:
    属性
    End1IsNavigable False
    End1Name  
    End1Multiplicity (None)
    End1TypeExpression  
    End2InitialValueExpression null
    End2JavaStatic True
    End2IsNavigable True
    End2Name stateInstance
    End2Visibility 1-PROTECTED

13. 添加完关联后的<%=States.getValue()%>
添加完关联后的<%=States.getValue()%>类

  1. 接下来,我们将为该类创建一个String属性。它定义了performView方法包含的JSP文件的路径。选择<%=States.getValue()%>类。
  2. 从下拉菜单中,选择Add UML => Attribute,并且将之命名为<%=States.getValue()%>.Jsp
  3. 通过Properties视图,将该属性的可见性修改为Protected,并且将TypeExpression修改为String
  4. 定义DefaultValueExpression“/jsp/<%=Markup.getValue()%>/<%=States.getValue()%>.jsp”
  5. 最后需要添加的是一个final类InitialStateManager。把一个有如下参数列表的方法getInitialState添加到该类中:

    方法名 JavaAbstract 参数名 TypeExpression 类型
    getInitialState False mode Portlet.Mode 0-IN
    () State 3-RETURN

  6. 在Properties视图中,选择getInitalState方法,然后将JavaStatic属性更改为True

14. final类的类图
final类的类图

添加完这个新的类后,该模式的设计就快接近尾声了。为了完成它并为其方法实现具体的逻辑,请继续将代码模板绑定到类方法中

使用准备好的模型

如果您更愿意使用准备好的下载ZIP文件中得到的模型而不是自己构建,可以遵循以下步骤进行操作:

  1. 下载ZIP文件得到的内容解压到您的本地文件系统中。
  2. 切换到Modeling透视图。
  3. 从主菜单中选择File => New => Other进入New Project向导。
  4. Java分类中选择Java Project,然后单击Next按钮。
  5. 将新的项目命名为State Portlet Pattern Model,然后单击Finish按钮。
  6. 切换到Modeling透视图。
  7. Navigator视图中,选择新项目,然后下拉菜单中选择Import
  8. 选择ZIP file,然后单击Next按钮。
  9. 定位到您解压下载ZIP文件的目录,然后从Pattern Model目录中选择StatePortletPatternModel.zip。单击Open按钮。
  10. 单击Finish按钮,导入ZIP文件的内容到State Pattern Model项目中。
  11. Navigator视图中,在State Portlet Pattern Model项目中双击State Portlet Pattern Model.mdx文件。导入的模型包含到WebSphere Portal API模型的引用,因此我们需要解析这些引用。
  12. Missing models对话框中,单击Resolve按钮。

15. Unresolved External References对话框
The Unresolved External References对话框

  1. 单击Full Reference路径旁边的按钮。
  2. 定位到您在上面创建的WebSphere Portal API Model的位置,然后选择Java Code Model.mdx文件。单击Open按钮,然后单击OK按钮。导入的模型现在就在Model Explorer视图中打开了。
  3. Model Explorer视图中,从新项目中双击State Portlet Diagram
  4. 继续下一部分将代码模板绑定到类方法中

绑定代码模板

我们使用模式定义模型元素,例如类和接口。我们使用代码模板指定方法体,它们是可以绑定到模型元素的代码段,补充了模式的创建。代码模板和模式一样可以参数化,这意味着您可以定制模式和代码模板以产生一个实体部分,不仅有设计,而且有具体的实现逻辑。

要创建一个新的代码模板,可以遵循以下步骤进行操作::

  1. 切换到Modeling透视图。
  2. 从主菜单中选择Tools => Code Templates => Create File
  3. 将该文件命名为Action_GetLog_Method,然后单击Next按钮。
  4. 指定方法体return PortletLogImpl.getInstance();,然后单击Finish按钮。
  5. 将该文件保存到目录c:\CodeTemplates

16. New Code Template对话框
The New Code Template对话框

  1. 其他的代码模板由下载ZIP文件中的代码模板目录中提供。将这些模板复制到c:\CodeTemplates

创建代码模板后,我们可以将它们绑定到我们的模式模型方法中:

  1. Model Explorer视图中,选择Action类的getLog方法。从下拉菜单中选择Code Templates => Bind
  2. 单击Browse按钮,然后定位到c:\CodeTemplates目录。按钮
  3. 选择Action_GetLog_Method.xml文件,单击OK按钮,然后单击Bind按钮。
  4. 选中One Time Expansion;这允许我们在应用该模式后可以在此模板中修改代码。
  5. 选择Bind以绑定这些代码模板到getLog方法。
  6. 其他在下载ZIP文件中提供的代码模板包含一个名为Statename的参数。我们将绑定这些代码模板参数到State模式参数值,以便该模式被应用时该参数被具体的状态名替换。选择<%=States.getValue()%>类的getInstance方法。
  7. 从下拉菜单中选择Code Templates => Bind
  8. 单击Browse按钮,然后定位到包含模板的文件目录。
  9. 选择StateImplementation_GetInstance_Method.xml文件,然后单击OK
  10. Bind Code Template对话框中,选择Statename模板参数,然后单击Edit按钮。
  11. Enter Action Value对话框汇中,在custom value域中输入<%=States.getValue()%>。单击OK按钮。
  12. 复选中One Time Expansion然后单击Bind按钮。
  13. Action<%=States.getValue()%><%=Actions.getValue()%>中剩余的方法重复这一步。XML文件的名称和您要绑定的方法的名称(例如,绑定Action_SetState_Method.xml到Action类的非抽象方法setState)必须匹配。注意不可能将任何代码都绑定到抽象方法或接口中的方法。

17. statename参数的定义
Definition for the statename parameter

现在您准备通过portlet类参数将代码模板绑定到portlet方法:

  1. 选择Portlet类的actionPerformed方法,然后从下来菜单中选择Code Templates => Bind
  2. 定位到StateManagerPortlet_ActionPerformed_Method.xml文件,选取One Time Expansion,然后单击Bind按钮。
  3. 通过使用StateManagerPortlet_Service_Method.xml文件,为service方法重复这一步。
  4. 从工具栏中单击磁盘符号保存该模型。

该模型现在已完成,可以准备使用了。

创建新状态portlet应用

为了开发一个真正的portlet应用,我们不仅仅需要Java代码:我们将要自定义portlet部署描述符,设计JSP和定义资源包。为简化这些开发任务,IBM Portal Toolkit提供了集成在Application Developer中的portlet工具。以下步骤将带您创建一个只有两个状态的portlet应用:一个Main View状态和一个Details View状态。我们将为每个状态创建一个action类,为在JSP上显示数据做好准备。请注意,我们在上面创建的模式能够创建有无穷多个状态和动作的portlet。

  1. 切换到Portlet透视图。
  2. 选择File => New => Portlet Application Project
  3. 输入一个项目名StatePortlet和一个企业项目名StatePortletEAR。单击按钮Next按钮。
  4. Portlet Selection对话框中,选择Basic Portlet,再单击Next按钮,然后单击Finish按钮。
  5. 关闭portlet部署描述符编辑器,然后切换回Modeling透视图。
  6. Navigator视图中,选择StatePortlet项目,然后从下拉菜单中选择New => Model
  7. New XDE Model对话框中,从Java分类中选择Servlet Code Model,然后单击Finish按钮。
  8. Model Explorer视图中选择New Servlet Code Model,然后从下拉菜单中选择More Java Actions => Referenced Models
  9. 要创建一个新的模型引用,单击蓝色的+按钮。
  10. 单击Browse…按钮,定位到WebSphere Portal API模型的位置。在Description字段中,输入WPS API,然后单击OK按钮。
  11. 选择WPS API模型,然后在窗口的中央单击黄色的箭头,将该模型插入到引用模型列表中。单击OK按钮。

18. Referenced Models对话框
Referenced Models对话框

  1. 一个Question对话框会打开,询问如何解析元素关联。单击Yes (Synchronize)按钮。
  2. 由于工具在Source目录下发现Java文件,所以另一个Question对话框会打开。单击Yes按钮以对这些文件实施反向工程。portlet源文件现在是该模型的一部分了,如Model Explorer视图所示。
  3. Model Explorer视图中,从Servlet代码模型的portlet包中选择MyPortlet.java文件,并切按下Delete键从模型中删除它。
  4. Model Explorer中,从State Portlet Pattern Model中选择State Portlet Pattern,然后从下拉菜单中选择Apply this pattern
  5. 复选中Apply Pattern Wizard,然后单击OK按钮。Apply Pattern向导会打开。因为我们为该模式指定了参数,我们必须为每个模式参数输入值。
  6. 单击Next按钮。
  7. Parameter对话框中,为StatePortlet项目中的Portlet Class参数选择portlet.MyPortlet类,然后单击Select>>按钮。单击Next按钮。

19. Apply pattern对话框
Apply pattern对话框

  1. States parameter输入一个状态名DetailsViewState。单击Select>>按钮。再次为MainViewState输入一个状态名,然后单击Select>>按钮。
  2. 输入两个动作名:ShowMainViewActionShowDetailsViewAction。单击Next按钮。
  3. 为Markup参数输入html
  4. StatePortlet工程中为Expansion Location指定portlet包。单击Finish按钮。Rational XDE展开该模式并创建新的Java文件。
  5. 切换到Java透视图。
  6. Package Explorer视图中,从文件StatePortlet/Java Source展开portlet包。我们将看到,因为缺少相应的import语句,每个Java文件都包含错误。
  7. 打开MyPortlet.java文件。
  8. 在代码编辑器中右键单击,然后选择Source => Organize Imports
  9. Organize Imports对话框中选择org.apache.jetspeed.portlet.event.ActionListener类,然后单击Finish按钮。
  10. 保存该文件并关闭Java编辑器。
  11. 对其余的Java文件重复步骤26。

20. Organize Imports工具
Organize Imports工具

应用该模式后,我们需要自定义创建的代码并完成MyPortlet类的actionPerformed方法。我们还需要创建和每个具体状态关联的JSP文件。如果在绑定代码模板时您没有选取One Time Expansion选项,您将需要在Rational XDE中取消autosync(Modeling透视图工具栏中选择Autosync按钮)。

  1. Java透视图中,打开ShowDetailsViewAction.java文件。
  2. 替换这一行:setState(request,MainViewState.getInstance)));
    with this:
    setState(request,DetailsViewState.getInstance)));
  3. 保存并关闭文件。
  4. 打开MyPortlet.java文件。该类的actionPerformed方法把请求委托给具体的动作,取决于动作字符串。为达到这个目的,把下面代码插入到actionPerformed方法中的字符串actionString = event.getActionString();之后,
    if (actionString.equals("showDetailsView"))
          action = new ShowDetailsViewAction();
    if (actionString.equals("showMainView"))
          action = new ShowMainViewAction();
    保存并关闭文件。
  5. 切换到Portlet透视图。
  6. J2EE Navigator视图中,在StatePortlet项目中展开Web Content/jsp/html文件夹,然后选择html文件夹。
  7. 从下拉菜单中选择New => JSP file
  8. 输入文件名MainViewState.jsp,然后单击inish
  9. 在JSP编辑器中,切换到Source选项卡,然后将所有JSP代码替换为下面的代码:
    <%@taglib uri="/WEB-INF/tld/portlet.tld" prefix="portal"%>
    <H2>Main View</H2>
    <A href="<portal:createURI><portal:URIAction
    name="showDetailsView"/></portal:createURI>">Show details view</A>
    JSP仅仅包含head行和一个链接标记。该链接引用portlet并定义了一个动作字符串。该字符串由portlet类的actionPerformed方法进行处理。
  10. 创建另一个名为DetailsViewState.jspJSP,并输入以下代码:
    <%@taglib uri="/WEB-INF/tld/portlet.tld" prefix="portal"%>
    <H2>Details View</H2>
    <A href="<portal:createURI><portal:URIAction
    name="showMainView"/></portal:createURI>"
    Back to main view</A>

祝贺您!您的新portlet现在可以准备进行部署和测试了。为此,您可以导出一个WAR文件,使用Portal Toolkit的部署特征,也可以参见相关信息,查阅更多关于部署的信息和portlet部署的其他方面信息。

21. 完成后的状态portlet
完成后的状态portlet

结束语

本文介绍了如何使用Rational XDE中的模式特征设计和创建一个设计良好的portlet应用。应用这些特征,portlet开发人员可以设计、开发和执行为portlet准备的已经证明的模式,并且可以灵活地重用这种设计。我们还讨论了WebSphere Studio把不同的工具(比如Rational XDEWebSphere Portal工具包)到一个环境中的强大功能。使用您刚刚学到的技术,您可以为您的特定需要自定义这种模式,例如包含对附加portlet方式的支持。

相关信息

关于作者

Sandro Schwedler是位于德国斯图加特市的WebSphere Innovation Center的一位IT专家。您可以通过Sandro.Schwedler@de.ibm.comSandro联系。


 

 

版权所有:UML软件工程组织