©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子类进行实现的,实现每个具体状态的特定行为。该模式的客户机使用Context类来执行特定状态的请求。Context类将这些请求委托给状态对象,并且提供了方法来改变当前状态。从一种状态到另一种状态的转换也可以由State子类进行处理。
那么,这意味着什么呢,一个portlet应用如何从该方法中获益呢?
portlet常常需要根据用户的输入显示不同的数据页,其中每一页都与某种状态相关联。图2显示了这样的一个例子。
图2. 样本portlet应用的状态转换图
如图所示,用户首先从列表中选择一个项目,比如顾客名称。然后,portlet从其初始的Main
View状态转变到Detail View状态。在这种状态中,portlet显示一个页面,带有关于所选项目的详细信息,比如顾客地址。将从一个状态到另一个状态的转换绑到一个动作;在这种情况下,JSPshowDetailsViewAction动作从数据库中读取顾客信息,然后再通过JSP将详细信息呈现给用户。
这样一个portlet的控制逻辑可以使用State模式进行实现。如图3中的类图所示。
图3. 状态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的引用模型,请遵循以下步骤进行操作:
- 切换到WebSphere
Studio的Modeling透视图。Modeling透视图由Rational
XDE提供,它包含视图和编辑器,可以用来设计应用和模式。
- 选择File
=> New => Other,然后在Modeling(建模)类别中选择Java
Modeling Project。单击Next按钮。
- 将项目命名为
WebSphere
Portal API Model ,然后单击Finish按钮。这将创建一个新的项目,包含一个空的Java代码模型。这个新的模型会在Model
Explorer的右侧打开。
- 在Navigator视图中,选择新创建的项目,接着选择File
=> Import..=> File System,打开导入向导,然后单击Next按钮。
- 单击 Browse…
按钮。
- 选择
WSAD_INSTALL_DIR$/wstools/eclipse/plugins/com.ibm.wps_4.2.0 目录。在此路径中,WSAD_INSTALL_DIR$ 表示您的Application
Developer的安装位置。单击OK按钮。
- 在Import对话框中,选取右侧的portal-api.jar。单击Finish按钮。
- 在Navigator视图中,右键单击portal-api.jar,然后选择Reverse
Engineer。
- 在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文件中为您准备好的文件。如果您选择后者,请跳到使用准备好的模型。
创建新的模式资源
遵循以下步骤创建一个新的模式资源:
- 切换到Modeling透视图。
- 从主菜单中选择File
=> New => Other,进入New
Project向导。
- 从Java类别中选择Java
Project,按钮然后单击Next按钮。
- 将该项目命名为
State
Portlet Pattern Model ,然后单击Finish按钮。
- 切换回Modeling透视图。在Navigator视图中,选择新的项目。
- 从下拉菜单中选择New
=> Model。从Java文件夹中选择Java
Content Model。将该文件命名为
Portlet
State Pattern Model ,然后单击Finish按钮。新的模型会在Model
Explorer中打开。
- 在Model
Explorer中,右键单击Portlet
State Pattern Model,然后选择Add
UML => Pattern Asset。
- 在Add Pattern
Asset对话框中,输入
State
Portlet Pattern 作为Pattern
Name,Portlet Patterns 作为library
name。单击Finish按钮。这就创建了一个新的空模式。
图5.
Add Pattern Asset对话框
添加模板参数到模式中
在创建模式的过程中,您必须至少定义一个模板参数。模板参数是一个占位符,它在应用该模式填入。它一般用于为模式提供一个或多个输入,使得为我们想要应用该模式的应用自定义模式成为可能。参数在模式中几乎可以表示任何东西,例如类、接口、用况(use
case)、包等,并且它应该是可以在模型中通过JavaScript很容易地进行访问。我们将定义参数以输入portlet状态、动作和portlet类:
- 从Model
Explorer中,在
RASPackage1 目录下选择State
Portlet Pattern,然后从下拉菜单中选择Add
=> UML => Template Parameter(图6)。
图6.
添加模板参数
- 将新的参数命名为
Portlet
Class Parameter 。
- 右键单击新的参数,然后选择Add
=> UML => Type => Class,以将该参数标识为一个Class类。
- 将该类命名为
Portlet
Class。
- 选择新的类,并且从下拉菜单中选择Select
in Pattern Explorer。
- 切换到底部的Pattern
Properties视图,为该类选择Replace的Merge
Behavior,然后切换回Model
Explorer视图。这将在我们应用该模式时替换整个portlet类。
- 右键单击新的Portlet
Class,然后选择Add =>
UML = > Operation。将新的操作命名为
actionPerformed 。
- 选择新的操作。在Properties视图中,将JavaAbstract属性改变成False。
- 在Model
Explorer中,右键单击actionPerformed方法,然后选择Add
UML => Parameter。将新的参数命名为
event 。
- 在Properties视图中,输入一个TypeExpression的
ActionEvent 。
- 接下来,为该方法指定一个
void 型的返回值。添加一个参数到该方法中并指定为0。
- 在Properties视图中,设置该属性的值:
- Kind:
3-Return
- TypeExpression:
void
Kind属性设置为3-Return ,将该参数定义为一个返回值。
图7.
Model Explorer中的actionPerformed方法
- 为下列方法添加Portlet类型的Portlet类参数,如步骤7中所述:
Method
name |
JavaAbstract |
Parameter
name |
TypeExpression |
Kind |
service |
False |
request |
PortletRequest |
0-IN |
response |
PortletResponse |
0-IN |
() |
void |
3-RETURN |
- 接下来,添加这些附加参数:
- States和Actions参数对于定义State和Action类的名称来说是必须的。
- Markup参数ID被State类使用以定义JSPs的路径。
将下列模板参数添加到State
portlet模式,如步骤1中所述:
Template
parameter name |
Template
Parameter Type |
Template
Parameter Type Name |
States |
String |
StateName |
Actions |
String |
ActionName |
Markup |
String |
MarkupName |
- 选择States模板参数。
- 在Properties视图中,选择一个表示多样性的1..*。这使得您在应用该模式时可以输入多个状态。为Actions模板参数重复此步骤。
- portlet类继承了Portlet
Adapter类,并且实现了ActionsListener接口。为了对这种关系进行建模,Rational
XDE提供了一个Collection编辑器。右键单击Portlet
Class,然后选择Collection
Editor。
图8.
Portlet类的关系
- 在Relationships选项卡中,单击插入新的实现旁边的小黑三角块。
- 在Select
Element对话框中,选择WebSphere
Portal API Model =>
org.apache.jetspeed.portlet.event.ActionsListener。
- 再次单击该三角块,但是这次插入一个Generalization,然后选择org.apache.jetspeed.portlet.PortletAdapter类。
- 单击Close按钮。
图9.
添加完所有参数后的Model Explorer
状态portlet模式建模
Rational XDE提供了不同的图表类型,以对应用和模式进行建模。在这一部分中,我们将使用一个类图设计我们的新模式。您可以将一个图表想象成您的模型上的一个视图;一般来说,一个图表不会包含一个模型的所有元素。
要设计该模式,我们必须添加类、接口和参数。请注意这个模式中的一些参数是通过JavaScript代码进行定义的,但是当应用该模式时,这些代码将会被为模板参数传进来的值代替。
要设计该模式,可以遵循以下步骤进行操作:
- 从Model
Explorer视图中选择RASPackage1,然后从下来菜单中选择Add
Diagram => Class,创建一个新的类图。将该图命名为
State
Portlet Diagram 。新的图会自动打开。
- 从左侧的Toolbox中选择Java
=> Java Class,然后在State
Portlet Diagram中单击任何地方。
- 输入一个类名
Action 。然后选取Abstract
modifier。单击OK按钮。这将为该模型和该图添加一个新的抽象类。
- 右键单击Action类,然后选择Collection
Editor。
- 在Relationships选项卡中,单击箭头旁边的小黑三角块,以插入一个新的Realization(实现)。在Select
Element窗口中,选择WebSphere
Portal API Model -> org.apache.jetspeed.portlet.PortletAction。单击Close按钮。
图10.
action类的Collection编辑器
- 右键单击Action类,然后选择Add
=> UML = > Operation。
- 将新的操作命名为
actionPerformed 。
- 在Model
Explorer视图中,选择新的操作。在Properties视图中,设置属性JavaAbstract的属性为True。
- 在Model
Explorer视图中,右键单击actionPerformed方法,然后选择Add
UML => Parameter。将新的参数命名为
request 。
- 在Properties视图中,为该参数的TypeExpression输入一个
PortletRequest 。
- 添加一个名为
portletContext 的附加参数以及PortletContext的 TypeExpression。
- 添加另一个参数,而且用以下属性值对其进行命名:
- Kind:
3-Return
- TypeExpression:
void
图11.
添加完action类后的Model Explorer
- 将以下三个方法添加到
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 |
- 添加一个新的类到State
Portlet Diagram中,并且命名为
Actions 。
- 将该类重命名为
<%=Actions.getValue()%> 。当应用该模式时,Rational
XDE将这段JavaScript代码替换为用户输入的Actions参数。因为我们为Actions参数设定了一个多样性1..* ,工具将为每个Actions参数值创建一个新的类。
- 从Java
Toolbox中选择Generalization工具,然后画一个从
<%=Actions.getValue()%> 类到Actions类的Generalization(图12)。
图12.
添加完Action和<%=Actions.getValue()%>类之后的类图
- 将以下两个方法添加到
<%=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 |
- 在Java
Toolbox中选择Java Interface,然后把它添加到图中,命名为
State 。该接口包含以下方法:
方法名 |
JavaAbstract |
参数名 |
TypeExpression |
类型 |
performView |
True |
request |
PortletRequest |
0-IN |
response |
PortletResponse |
0-IN |
portletContext |
PortletContext |
0-IN |
() |
void |
3-RETURN |
- 在Model
Explorer视图中,选择performView方法。
- 在Properties视图中,为JavaThrows属性输入
IOException,
PortletException 。
- 添加一个新类
<%=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 |
- 从Java
Toolbox中,选择Realization工具,画一个从
<%=States.getValue()%> 到State接口的Realization。
- 在
<%=States.getValue()%> 类中,选择performView方法。
- 在Properties视图中,为JavaThrows属性输入
IOException,
PortletException 。
- 选择getInstance方法。
- 在Properties视图中,将JavaStatic属性改变成True。
- 在Java
Toolbox中选择Java Directed
Association。画一个包含源和目标
<%=States.getValue()%> 的关联。
- 在Create
Directed Association对话框中,接受默认值,然后单击OK按钮。
- 在该关联的Properties视图中输入以下的属性:
属性 |
值 |
End1IsNavigable |
False |
End1Name |
|
End1Multiplicity |
(None) |
End1TypeExpression |
|
End2InitialValueExpression |
null |
End2JavaStatic |
True |
End2IsNavigable |
True |
End2Name |
stateInstance |
End2Visibility |
1-PROTECTED |
图13.
添加完关联后的<%=States.getValue()%>类
- 接下来,我们将为该类创建一个String属性。它定义了performView方法包含的JSP文件的路径。选择
<%=States.getValue()%> 类。
- 从下拉菜单中,选择Add
UML => Attribute,并且将之命名为
<%=States.getValue()%>.Jsp 。
- 通过Properties视图,将该属性的可见性修改为Protected,并且将TypeExpression修改为String。
- 定义DefaultValueExpression为
“/jsp/<%=Markup.getValue()%>/<%=States.getValue()%>.jsp” 。
- 最后需要添加的是一个final类
InitialStateManager 。把一个有如下参数列表的方法getInitialState 添加到该类中:
方法名 |
JavaAbstract |
参数名 |
TypeExpression |
类型 |
getInitialState |
False |
mode |
Portlet.Mode |
0-IN |
() |
State |
3-RETURN |
- 在Properties视图中,选择getInitalState方法,然后将JavaStatic属性更改为True。
图14.
final类的类图
添加完这个新的类后,该模式的设计就快接近尾声了。为了完成它并为其方法实现具体的逻辑,请继续将代码模板绑定到类方法中。
使用准备好的模型
如果您更愿意使用准备好的从下载ZIP文件中得到的模型而不是自己构建,可以遵循以下步骤进行操作:
- 将下载ZIP文件得到的内容解压到您的本地文件系统中。
- 切换到Modeling透视图。
- 从主菜单中选择File
=> New => Other进入New
Project向导。
- 从Java分类中选择Java
Project,然后单击Next按钮。
- 将新的项目命名为
State
Portlet Pattern Model ,然后单击Finish按钮。
- 切换到Modeling透视图。
- 在Navigator视图中,选择新项目,然后从下拉菜单中选择Import。
- 选择ZIP
file,然后单击Next按钮。
- 定位到您解压下载ZIP文件的目录,然后从Pattern
Model目录中选择StatePortletPatternModel.zip。单击Open按钮。
- 单击Finish按钮,导入ZIP文件的内容到State
Pattern Model项目中。
- 在Navigator视图中,在State
Portlet Pattern Model项目中双击State
Portlet Pattern Model.mdx文件。导入的模型包含到WebSphere
Portal API模型的引用,因此我们需要解析这些引用。
- 在Missing
models对话框中,单击Resolve按钮。
图15.
Unresolved External References对话框
- 单击Full
Reference路径旁边的按钮。
- 定位到您在上面创建的WebSphere
Portal API Model的位置,然后选择Java
Code Model.mdx文件。单击Open按钮,然后单击OK按钮。导入的模型现在就在Model
Explorer视图中打开了。
- 在Model
Explorer视图中,从新项目中双击State
Portlet Diagram。
- 继续下一部分将代码模板绑定到类方法中。
绑定代码模板
我们使用模式定义模型元素,例如类和接口。我们使用代码模板指定方法体,它们是可以绑定到模型元素的代码段,补充了模式的创建。代码模板和模式一样可以参数化,这意味着您可以定制模式和代码模板以产生一个实体部分,不仅有设计,而且有具体的实现逻辑。
要创建一个新的代码模板,可以遵循以下步骤进行操作::
- 切换到Modeling透视图。
- 从主菜单中选择Tools
=> Code Templates => Create File。
- 将该文件命名为
Action_GetLog_Method, 然后单击Next按钮。
- 指定方法体
return
PortletLogImpl.getInstance(); ,然后单击Finish按钮。
- 将该文件保存到目录
c:\CodeTemplates 。
图16.
New Code Template对话框
- 其他的代码模板由下载ZIP文件中的代码模板目录中提供。将这些模板复制到
c:\CodeTemplates 。
创建代码模板后,我们可以将它们绑定到我们的模式模型方法中:
- 在Model
Explorer视图中,选择Action类的getLog方法。从下拉菜单中选择Code
Templates => Bind。
- 单击Browse按钮,然后定位到
c:\CodeTemplates 目录。按钮
- 选择Action_GetLog_Method.xml文件,单击OK按钮,然后单击Bind按钮。
- 选中One
Time Expansion;这允许我们在应用该模式后可以在此模板中修改代码。
- 选择Bind以绑定这些代码模板到getLog方法。
- 其他在下载ZIP文件中提供的代码模板包含一个名为Statename的参数。我们将绑定这些代码模板参数到State模式参数值,以便该模式被应用时该参数被具体的状态名替换。选择
<%=States.getValue()%> 类的getInstance方法。
- 从下拉菜单中选择Code
Templates => Bind。
- 单击Browse按钮,然后定位到包含模板的文件目录。
- 选择StateImplementation_GetInstance_Method.xml文件,然后单击OK。
- 在Bind Code
Template对话框中,选择Statename模板参数,然后单击Edit按钮。
- 在Enter
Action Value对话框汇中,在custom value域中输入
<%=States.getValue()%> 。单击OK按钮。
- 复选中One
Time Expansion然后单击Bind按钮。
- 为
Action 、<%=States.getValue()%> 、<%=Actions.getValue()%> 中剩余的方法重复这一步。XML文件的名称和您要绑定的方法的名称(例如,绑定Action_SetState_Method.xml 到Action类的非抽象方法setState)必须匹配。注意不可能将任何代码都绑定到抽象方法或接口中的方法。
图17.
statename参数的定义
现在您准备通过portlet类参数将代码模板绑定到portlet方法:
- 选择Portlet类的actionPerformed方法,然后从下来菜单中选择Code
Templates => Bind。
- 定位到
StateManagerPortlet_ActionPerformed_Method.xml 文件,选取One
Time Expansion,然后单击Bind按钮。
- 通过使用
StateManagerPortlet_Service_Method.xml 文件,为service方法重复这一步。
- 从工具栏中单击磁盘符号保存该模型。
该模型现在已完成,可以准备使用了。
创建新状态portlet应用
为了开发一个真正的portlet应用,我们不仅仅需要Java代码:我们将要自定义portlet部署描述符,设计JSP和定义资源包。为简化这些开发任务,IBM
Portal Toolkit提供了集成在Application
Developer中的portlet工具。以下步骤将带您创建一个只有两个状态的portlet应用:一个Main
View状态和一个Details View状态。我们将为每个状态创建一个action类,为在JSP上显示数据做好准备。请注意,我们在上面创建的模式能够创建有无穷多个状态和动作的portlet。
- 切换到Portlet透视图。
- 选择File
=> New => Portlet Application Project。
- 输入一个项目名
StatePortlet 和一个企业项目名StatePortletEAR 。单击按钮Next按钮。
- 在Portlet
Selection对话框中,选择Basic
Portlet,再单击Next按钮,然后单击Finish按钮。
- 关闭portlet部署描述符编辑器,然后切换回Modeling透视图。
- 在Navigator视图中,选择StatePortlet项目,然后从下拉菜单中选择New
=> Model。
- 在New XDE
Model对话框中,从Java分类中选择Servlet
Code Model,然后单击Finish按钮。
- 从Model
Explorer视图中选择New Servlet
Code Model,然后从下拉菜单中选择More
Java Actions => Referenced Models。
- 要创建一个新的模型引用,单击蓝色的+按钮。
- 单击Browse…按钮,定位到WebSphere
Portal API模型的位置。在Description字段中,输入
WPS
API ,然后单击OK按钮。
- 选择WPS API模型,然后在窗口的中央单击黄色的箭头,将该模型插入到引用模型列表中。单击OK按钮。
图18.
Referenced Models对话框
- 一个Question对话框会打开,询问如何解析元素关联。单击Yes
(Synchronize)按钮。
- 由于工具在Source目录下发现Java文件,所以另一个Question对话框会打开。单击Yes按钮以对这些文件实施反向工程。portlet源文件现在是该模型的一部分了,如Model
Explorer视图所示。
- 在Model
Explorer视图中,从Servlet代码模型的portlet包中选择MyPortlet.java文件,并切按下Delete键从模型中删除它。
- 在Model
Explorer中,从State Portlet Pattern
Model中选择State Portlet Pattern,然后从下拉菜单中选择Apply
this pattern。
- 复选中Apply
Pattern Wizard,然后单击OK按钮。Apply
Pattern向导会打开。因为我们为该模式指定了参数,我们必须为每个模式参数输入值。
- 单击Next按钮。
- 在Parameter对话框中,为StatePortlet项目中的Portlet
Class参数选择portlet.MyPortlet类,然后单击Select>>按钮。单击Next按钮。
图19.
Apply pattern对话框
- 为States
parameter输入一个状态名
DetailsViewState 。单击Select>>按钮。再次为MainViewState输入一个状态名,然后单击Select>>按钮。
- 输入两个动作名:
ShowMainViewAction 和ShowDetailsViewAction 。单击Next按钮。
- 为Markup参数输入
html。
- 从StatePortlet工程中为Expansion
Location指定portlet包。单击Finish按钮。Rational
XDE展开该模式并创建新的Java文件。
- 切换到Java透视图。
- 在Package
Explorer视图中,从文件
StatePortlet/Java
Source 展开portlet包。我们将看到,因为缺少相应的import语句,每个Java文件都包含错误。
- 打开
MyPortlet.java 文件。
- 在代码编辑器中右键单击,然后选择Source
=> Organize Imports。
- 在Organize
Imports对话框中选择org.apache.jetspeed.portlet.event.ActionListener类,然后单击Finish按钮。
- 保存该文件并关闭Java编辑器。
- 对其余的Java文件重复步骤26。
图20.
Organize Imports工具
应用该模式后,我们需要自定义创建的代码并完成MyPortlet类的actionPerformed方法。我们还需要创建和每个具体状态关联的JSP文件。如果在绑定代码模板时您没有选取One
Time Expansion选项,您将需要在Rational
XDE中取消autosync(在Modeling透视图工具栏中选择Autosync按钮)。
- 在Java透视图中,打开
ShowDetailsViewAction.java 文件。
- 替换这一行:
setState(request,MainViewState.getInstance)));
with this:
setState(request,DetailsViewState.getInstance)));
。
- 保存并关闭文件。
- 打开
MyPortlet.java 文件。该类的actionPerformed方法把请求委托给具体的动作,取决于动作字符串。为达到这个目的,把下面代码插入到actionPerformed方法中的字符串actionString
= event.getActionString(); 之后,
if
(actionString.equals("showDetailsView"))
action = new
ShowDetailsViewAction();
if (actionString.equals("showMainView"))
action = new
ShowMainViewAction();
保存并关闭文件。
- 切换到Portlet透视图。
- 在J2EE
Navigator视图中,在StatePortlet项目中展开
Web
Content/jsp/html 文件夹,然后选择html文件夹。
- 从下拉菜单中选择New
=> JSP file。
- 输入文件名
MainViewState.jsp ,然后单击inish。
- 在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方法进行处理。
- 创建另一个名为
DetailsViewState.jsp 的JSP,并输入以下代码:
<%@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
结束语
本文介绍了如何使用Rational
XDE中的模式特征设计和创建一个设计良好的portlet应用。应用这些特征,portlet开发人员可以设计、开发和执行为portlet准备的已经证明的模式,并且可以灵活地重用这种设计。我们还讨论了WebSphere
Studio把不同的工具(比如Rational
XDE和WebSphere Portal工具包)到一个环境中的强大功能。使用您刚刚学到的技术,您可以为您的特定需要自定义这种模式,例如包含对附加portlet方式的支持。
相关信息
关于作者
Sandro Schwedler是位于德国斯图加特市的WebSphere
Innovation Center的一位IT专家。您可以通过Sandro.Schwedler@de.ibm.com与Sandro联系。
|