初级 Tad Siminitz (tad@us.ibm.com) 软件 IT 架构师, IBM 2004 年 3 月
这篇文章描述了Rational eXtended Development Environment (XDE) 和IBM WebSphere Studio如何能够从开始到结束的为构建电子商务应用提供一个集成的开发平台。作者解释了如何在一个迷你的开发生命周期中通过使用几种不同的来自于IBM WebSphere Studio 和 XDE 套件的插件来完成设计、实现和测试一个简单的应用。
简介 通过将Rational eXtended Development Environment (XDE) 和IBM's WebSphere Studio结合使用,你将会得到一个用于构建电子商务应用的全面的和集成的开发平台。你可以作需求分析、面向对象的设计和对你用来构建和测试代码的信息模型进行建模。换句话说,在一个项目的所有参与者现在可以唱同一首歌了。在使用Rational XDE之前,在开发周期的任务中,经常需要用户从一个工具导出信息,在插入到另一个工具。为了向你展示这些不同工具的作用,在本文中我将使用下面的场景。 有时候,一个新项目的设计人员和体系架构师在项目开始时一切都要从零开始,并且对应用的各个方面有着完全的控制。但通常情况是项目人员必须处理已有的组件,通常还有一些已有的关系型数据库。 在这个场景下,假设你被要求实现一个基于Web的银行应用,这个应用允许最终用户从他们的帐户进行支付。作为这个小应用的设计和实现人员,你也被要求使用一个已有的数据库中的一个已存在的表。 同时在你的组织中对每一个新的开发项目都有必要遵循正规的需求、分析和设计的过程的要求。在开发周期的这个阶段选择的工具是Rational软件的XDE和 具有额外的开发和应用服务器测试能力的IBM WebSphere Studio Application Developer。在这个小项目系统中需要被执行的活动有:
- 获取描述了你所需要构建应用的需求。
- 创建用例图以显示系统中角色与用例之间的关系。
- 创建时序图以显示以时间顺序的对象交互。
- 逆向工程一个关系型数据库以创建企业JavaBean(EJB)组件。
- 创建类图,并对Java类进行修改
- 部署代码到WebSphere应用服务器上,并使用WebSphere Studio带的单元测试工具进行测试。
获取需求 典型的第一步是获取需求,通常是通过与目标应用的潜在最终用户进行访谈来完成。需求也可能开自于那些手工的完成某些任务的人或者来自于已存在的系统。对于我们的Web ATM 样例,我们获取的一个需求是客户可以对他们的帐户的资金进行支付。文档化的需求也许象下面的样子: 需求A:"最终用户需要输入他们的银行帐号和密码,系统验证他们是帐户的拥有者。一旦通过验证,客户可以选择"支付"。客户然后选择指定的帐户,输入将要支出的数额和确认(名字)收款人。" 在真实的情况下,在这个阶段尽可能详细的获取需求是重要的,因为在以后的开发周期中,你需要实现或产生逻辑以执行任务。为了完成这个任务,你需要开始使用XDE,XDE被设计成为WebSphere Studio 或其他支持 Eclipse 技术的产品的插件。你可以将需求输入到XDE中,使它成为项目中的文件,并且使用你选择的软件配置管理(SCM)系统对它进行版本控制。 从这些需求中,你可以设计你的用例。用例是系统使用情景的描述。在这一点上,你应该知道系统的用户是谁;他们是用例中不可缺少的部分。 接下来我们将输入一个简短的用例来表示使用Web银行系统的支付转帐的使用情景。 创建项目和模型 在你能够输入一个用例前,你需要建立一个XDE建模项目和模型。我假设你已经在WebSphere Studio Application Developer上安装了XDE,并已经启动了工具的环境。确认你是在建模透视图中。为了得到建模透视图,从透视图(Perspective)菜单,选择打开(Open )>其他(Other)。选择建模(Modeling),然后点击确认(OK)。为了创建一个新的建模项目:
- 在文件菜单,选择 新建 > 项目。新建项目对话框弹出。
- 在新建项目对话框的左手面板,选择建模(Modeling)。在右边的面板选择基本建模项目(Basic Modeling Project.)。
- 点击下一步(Next)。
- 在项目名字对话框,输入新建项目的名字。对于这个场景,叫它WebBankModel。
- 点击完成(Finish)
现在你对项目已经被产生,你可以创建一个模型并将它放到项目当中。一个项目可以拥有多个模型。为了创建一个新的模型,在建模透视图中:
- 在文件菜单中,点击新建 > 模型(Model)
- 在文件类型面板中,选择Rational XDE ,对于Template area,选择blank model
- 在文件名文本框,输入信模型文件的名字。我们用WebBankModel
- 在目的文件夹中,选择你上面输入的项目名字
- 点击完成。
模型出现在模型浏览器中;在图表窗口中,主用例(main use case)图被打开了。你现在可以开始构建一个高级别的用例图大概的描述一下你需要构建的系统。在后面我们再对这些用例进行细化。在用例图中需要添加的第一个是角色(actor).一个角色被定义在UML中作为一种模型元素来描述一个扮演与被建模的系统交互的用户。虽然角色通常是代表人的,但也可以不代表人。它可以代表一个组织,系统或是与系统交互的机器。我们的Web银行应用中的第一个角色将代表用户。你现在可以通过下面的步骤添加这个角色到你的模型中:
- 在模型浏览器中选择你的模型。
- 右键点击并选择 添加 UML > 角色 (Add UML > Actor.)。
- 命名你的角色,如webBankCustomer。
- 重复步骤2和3添加其他的角色,并命名为Transaction System代表你要查询的外部系统。
添加用例 接下来,你要添加一些用例。一个用例从角色的角度描述了系统的行为,但用例不显示系统的内部实现细节。因为在这一点上你所知道的是一些关于你需要的比较高级别的信息,因此你可以添加一些用例。你应该创建一个验证用户的用例,一个查看余额的用例和一个转帐的用例。添加这些用例到你的模型:
- 在模型浏览器中选择你模型
- 键点击并选择 添加 UML > 用例 (Add UML > Use Case.)。
- 命名你的用例,用AuthorizeUser。
1. 重复步骤2和3添加其他的用例,并命名为TransferFunds, AccountBalance, 和MakePayment。 创建用例图 你应该有4个用例用于描述你的系统需要具备的能力。你现在可以创建一个用例图来对你的系统进行概括的描述。一个用例图可以包含模型中所有的用例和角色,或者仅仅包含其中的一些。在你拥有一个空白用例图编辑器之前你有一个空的窗口面板。你可以通过检查工具箱中是否有用例相关的工具,象角色(actors)用例(use cases)和关联(associations)来确认这一点。 画用例图是简单的,你所加的所有的组件都包含在上面创建的模型中。简单的拖和放你的两个角色和四个用例。最适当的位置是最终用户在左边,处理系统在右边。用例可以被垂直排列。 关联代表了角色和用例之间的交互关系。因为你的最终用户有做某件事情的要求,你应该添加关联在用例图中。添加3个关联,从WebBank的最终用户角色到3个用例,验证用户, 转帐, 和查询余额。 当你完成了这些后,你的模型看起来应该象图1。 ![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image001.gif) 图 1. 角色和用例的模型 创建时序图表示行为 一旦你已经开发好了描述高层系统功能的用例图后,你现在应该把精力放在将加到这个系统中的与数据库无关的指定行为上。特别是,当你从已有的数据库中重建一些关键的类时,你可能需要一些不属于数据模型部分的逻辑。你需要创建一个时序图来显示系统中的对象和这些对象之间的交互。时序图是UML图中的一种,它提供了一种按照时间顺序对给定场景中相互协作对象之间消息传递的视图。在分析阶段,时序图对确定为了完成某项工作,什么样的对象和方法需要被执行是非常有用的。为用例MakePayment添加一个时序图:
- 在模型浏览器中选择用例MakePayment
- 右键点击并选择添加图 > 时序图:角色 (Add Diagram > Sequence: Role)
- 将这个时序图命名为MakePaymentDiagram
现在你可以在你的模型中添加一些组件。因为这个用例图是非常高层次的,所以在ATMUser, 用例 MakePayment 和处理系统之间仅仅存在一个关联。对于这个时序图,你应该对在将要构建的系统中的关键实体或对象之间发生的消息进行详细的描述。为了"连接"这些元素,你可以在时序图中添加一些代表了对象之间发生的交互的消息。在XDE中,一条生命线是一个符号,这个符号代表了一个对象在某一时期的存在。添加一些生命线和消息:
- 从模型浏览器中选择角色WebBankCustomer,并将它拖到工作区中,纵向放在左边。
- 对TransactionSystem做相同的事情。
- 在另两条生命线之间拖放一个生命线图标(从工具箱)。
- 重新命名这条生命线为WebPage
- 在ATMUser和WebPage之间添加一个消息,并命名为Enter
- 在WebPage和TransactionSystem之间添加另一个消息,并命名为MakePayment
- 从TransactionSystem到WebPage,和从WebPage到WebBankCustomer创建返回消息
- 保存你的时序图(ctl-S)。
一个完整的时序图应该象下面的图2。 ![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image002.gif) 图 2. 时序图 你可以在用例图中创建一个"注释",然后将这个注释链到时序图中,注释可以把你从一个特定功能域带到对这个功能的设计中。创建注释:
- 如果用例图WebBankModel还没被打开,首先打开它.
- 创建一个注释并将它链到用例MakePayment上
- 拖动代表时序图的图标到被连接到用例的注释上。
- 双击在用例图中的注释打开时序图。
创建EJB项目 因为在这个场景中,你已经有了已存在的数据库,我们将回到前面,看看你感兴趣的数据库表,并通过使用WSAD的能力来为你创建一些初始类。这是非常通用的,因为很多应用最初都是建立在已经存在并将被使用的数据库之上的。你可以通过逆向工程数据库表的定义来成生你的Web应用和关系数据库都可以理解的Java类。 企业级JavaBeans(EJB)组件是J2EE规范中的一部分,让你可以封装生命周期中的行为到代表你的业务领域中相关事务的实体中,比如客户和帐户。然而J2EE的规范是相对比较复杂的,他的思想是J2EE平台以一种标准的方式为你处理一些基本的操作,如读写持久存储。有一些工具被设计用来帮你高效的创建EJB组件,还有一些运行时平台(如WebSphere Application Server)被设计用来有效的管理他们的操作。 在你创建你的EJB组件之前,你需要创建一个容纳EJB组件项目。从任何透视图:
- 选择文件 > 新建 > 项目 > J2EE(File > New > Project > J2EE),并选择企业应用项目(Enterprise Application Project.)
- 命名项目ATM并接受对用于EJB和Web项目的缺省值。如果你想的话,你可以应用客户端项目,因为你将不会用到它。
在此处你可以检查一下在ATM项目中叫作application.xml 的XML文件,这文件包含了一个J2EE应用是由哪些组件组成的。查找这个文件的一个好的方法是从J2EE透视图中的导航视图中,在ATM项目的META-INF目录下找到它。如果你双击这个文件,XML编辑器可以让你以不同的方式浏览这个文件,比如普通方式、源文件方式和其他方式。对于J2EE的应用WSAD提供了内建的"智能化"的用于配置和浏览XML配置文件的工具。 现在让我们开始,在WASD中打开数据透视图,如果数据透视图还没有被打开,你可以从主菜单中打开它:
- 选择透视图 > 打开 > 其他 (Perspective > Open > Other),然后选择数据(Data)。现在你需要创建一个对ATM数据库的连接。
- 从数据库浏览器视图中,点击右键并选择新建连接(New Connection)。然后按照图3所示填写所需信息。
![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image003.gif) 图 3. 创建一个数据库连接 当所有必要的信息被填完后,点击完成(Finish)。你可以展开图标检查你的数据库是否已经出现。你的数据库表应该已经出现在数据库连接之下了,名字为YourId.Account和YourId.Csutomer。下一步,你应该插入这些表到刚才创建的J2EE项目的EJB项目中。步骤如下:
- 在数据库浏览视图(在数据透视图中)中展开加亮的ATM入口中的实体,点击右键并选择插入到文件夹(Import to Folder)…
- 在弹出菜单中,点击浏览(Browse),选择ATMEJB项目,然后点击完成(Finish)。对关于为元信息创建文件夹的问题的回答是(yes)。
- 如果你回到J2EE透视图,打开J2EE视图,你可以看到在数据库目录中的信息。
创建对象到关系的映射 创建对象到关系的映射有几种原因。在关系模型与对象模型之间有着本质的差别,为了有效的进行编程就需要对他们进行一定的处理。其他的原因是为使用应用服务器的开发人员提供一些可以运行在应用服务器上的Java类和用于处理应用数据的持久性的数据库方面的知识。当给了应用更大的灵活性时,关系映射也就使应用卸下了对数据库和数据库服务器的处理负担。 为了创建映射,从J2EE透视图:
- 选中ATMEJB模块
- 点击右键,选择生成 > EJB 到 RDB映射(Generate > EJB to RDB Map)。
- 在弹出窗口,选择自低向上的对象/关系映射(bottom-Up O/R Map)
- 选中在完成时打开映射编辑器(open mapping editor upon completion),这个选项让你可以看到你所创建的映射。
- 点击完成(Finish)
完成后,映射编辑器应该象图4 ![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image004.gif) 图 4. 创建关系映射 逆向工程EJB项目 现在你可以通过工具的能力为你产生Java代码模型了。如果我们正在建模一个大的应用,这个应用中的一小部分包括了EJB组件,那么我们就可以很细致的描述整个应用包括我们的自动产生的EJB代码,这些代码典型的被用于会话bean和实体bean。为了使事情更简单,你可以在建模透视图中打J2EE 视图。打开建模透视图,然后从选单项中选择透视图 > 显示视图 > 其他… > J2EE(Perspective > Show View > Other... > J2EE > J2EE View) 在建模透视图中的J2EE视图应该被打开了,你可以按照你的习惯来调整它的位置。为了使代码编辑和浏览更方便,在大纲视图(Outline view)中做和上面相同的事情。在这里你可以通过下面的步骤添加Java代码模型到ATMEJB项目中:
- 选中ATMEJB模块
- 选择 新建 > 其他(New > Other),然后出现一个向导。
- 选择建模(Modeling),选择模型(Model)并点击下一步(Next)
- 下一个屏幕中,在文件类型中选择Java,并且在模板下选择Java Code Model,命名模型为JavaCodeModel_ATM,然后点击完成(Finish),见图5
![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image005.gif) 图 5. 添加Java代码模型 逆向工程这个模型:
- 在导航视图中,在这个模型文件上点击鼠标右键,选择逆向工程(Reverse Engineer,),并对对话框的问题回答是(yes)
- 设置根目录为<WAS Install DIR>/workspace/ATMEJB/ejbModule,点击确认(OK)
- 通过选中递增的添加(Add recursively)选项,添加*.java文件。点击确认(OK)
创建类图 前面的步骤已经添加了EJB组件到模型容器中。现在我们将创建一个类图并添加那些组件中的一个,AccountBean,到模型中。创建类图:
- 在模型浏览器中,选择ATM包,点击右键并选择添加图 > 类(Add Diagram > Class),然后将图命名为Account
- 将AccountBean Java类(EJB工具为你生成的)拖放到刚建好的类图中
- 你可以通过在类上点击右键,选择添加相关图形(Add Related Shapes),然后选择所有模型(All Models),最后点击确认(OK),来显示AccountBean的依赖关系。
你的类图应该象图6 ![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image006.gif) 图 6. 类图样例 现在在设计级别上,你可以通过添加方法对AccountBean类添加一些其他的功能,比如添加支付功能。添加一个方法:
- 在模型浏览器中,选中AccountBean 类,并点击右键
- 选择添加Java > 方法(add Java > method)
- 输入makePayment ()
- 右键点击AccountBean类,并选择生成代码(Generate Code)
在这个类中,你可以看到被添加方法的框架。完成下面的代码:
public void makePayment(java.math.BigDecimal howMuch, java.lang.String
payee)
{
setBalance(getBalance().subtract(howMuch));
System.out.println ("Make a Payment to"+ payee + "for the amount of
$" + howMuch);
}
| 确认进行了保存(File > Save AccountBean.java 或 ctl-S)。注意你正打印一个注释到控制台,因为其他的服务将必须被调用(这些服务我们还没有实现)以完成实际的支付过程。你也不会获取任何潜在的错误,比如处理透支。 接下来你需要使用AccessBeans向导来创建Customer 和 Account JavaBean包装器AccessBeans。指定JavaBean包装器的类型,并对Account 和Customer使用findByPrimaryKey()方法。 在进行测试之前,你需要生成EJB的部署代码。你可以通过浏览EJB组件的类库看到,有许多与EJB组件相关的代码,这些代码中的大部分是依据J2EE的规范被建立的,这就使你的EJB组件具有良好的灵活性和跨平台系统的通用性。为了生成代码,从J2EE视图中,选中ATMEJB EJB模块,并使用弹出菜单为Customer 和Account生成部署EJB代码。 在大纲视图选择要加到远程接口中的方法,点击鼠标右键,然后选择企业Bean > 提升远程接口(Enterprise Bean > Promote to Remote Interface),确保方法被加到了远程接口中。 测试应用 WebSphere Studio工具的众多强大能力中的一个就是它具有可以在内建的应用服务器的环境下对组件进行单元测试的能力。服务器透视图中包含了几种不同的内建应用服务器,其中包括WebSphere应用服务器。这种测试方法的一个关键的好处是,你可以在你的集成开发环境(IDE)中,对Java的组件进行测试和调试,这要比将应用的代码安装到应用服务器上,然后再进行测试和调试要简单和方便。为了测试组件,你需要构建:
- 打开服务器透视图(Server perspective)
- 创建一个服务器项目,并进行命名,在文件菜单上点击新建 > 服务器项目(New > Server Project.),并命名为Servers
- 创建服务器实例和服务器配置。在文件菜单上,点击 新建 > 服务器实例和配置(New > Server Instance and Configuration)。命名为WAS V4 Local Test,并且确认它被放置在服务器项目中。此处你还需要指出这个服务器有一个WebSphere V4测试环境的类型。
你现在已经建立了一个应用服务器了,你能够启动、停止和安装应用代码到这个应用服务器。除了你拥有一个调试的环境外,这个应用服务器与你的产品环境的应用服务器是非常相似的。接下来,你应该通过下面的步骤为这个服务器配置创建一个数据源:
- 在服务器配置视图,双击WAS v4 Local Test Configuration,并选择数据原(Datasource)标签。
- 名字为ATM,设置JNDI Name为jdbc/ATM,数据库明为ATM,见图7。
- 保存你的变化。
![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image007.gif) 图 7. 添加一个数据源 你已经为WebSphere应用服务器添加数据源的信息,同时你还需要提供一些其他的信息。为你之前建立的EJB模块相关的配置环境添加数据源的信息。最重要的是数据源的JNDI的名字必须要与EJB模块配置中的引用的数据源的JNDI名字是完全相同的。为了编辑EJB模块中的数据源的设置,你应该使用EJB扩展编辑器,步骤如下:
- 打开J2EE视图
- 选中ATMEJB模块,点击鼠标右键,选择用EJB扩展编辑器打开(Open with EJB Extension editor),然后按绑定(Bindings)标签
- 为ATMEJB模块设置数据源的JNDI的名字为jdbc/ATM,如图8
- 保存你的改变(ctl-S)
![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image008.gif) 图 8. 设置数据源的名字 现在返回服务器透视图。接下来的步骤非常简单,但相当重要。企业归档资源文件(EAR)的主要目的是将应用中所有必要的组件包装到一个单一的文件中。这使得被包装的应用更加方便的进行部署,这也实现了应用可以被安装在不同厂商的J2EE规范兼容的应用服务器上的J2EE的目标。实际上,它是通过一个XML文件,来描述J2EE相关组件和Web组件的分组机制。无论如何,你有需要添加你之前创建ATMEAR模块到WebSphere服务器配置中,步骤如下:
- 打开服务器透视图
- 在服务器配置视图中,选择WAS V4 Local Test
- 点击鼠标右键,选择添加项目(Add Project),然后选择EAR模块ATMEAR
现在你需要启动WebSphere应用服务器配置,步骤如下:
- 在服务器透视图的服务器控制面板中,选择WAS V4 Local Test
- 点击鼠标右键,对应用服务器选择启动(Start)。你将在控制台中看到启动信息。
- 当在控制台中出现"服务器已为电子商务开发"的信息时,你的应用服务器就已经成功的被启动了。
现在你的应用服务器已经启动并运行了,你可以通过使用IBM EJB测试客户端程序对你设计并创建的EJB将组件进行测试了。步骤如下:
- 打开J2EE透视图
- 选中ATMEJB项目,然后从弹出菜单中选择在服务器上运行(Run on Server)
- 在JNDI浏览器中通过点击来测试Customer EJB。对CustomerhHome使用indByPrimaryKey()方法,然后使用创建的customer对象
通过使用EJB测试客户端程序进行测试是一项包含多个步骤的过程。记住,EJB测试客户端程序是一个通用的测试程序,它是一个内建的图形化应用程序,目的是测试你的代码的功能;它不是一个最终用户的应用程序。例如,一旦你"加载"了makePayment方法,它将设法传递参数,并最终调用方法。例如:
- 在相关的视图中点击makePayment链接
- 对于第一个参数,在java.math.BigDecimal下查询,为构造函数选择BigDecimal(double),当值域出现时,输入一个数字值(比如25.00),然后调用并返回
- 为构造函数的第二个参数设置一个java.lang.String类型的值,当值域出现时,输入一个名字,比如" Homer",然后点击调用并返回
- 一旦参数被提供了,点击invoke来测试方法。如果一些正常,余额将会减少,并且在控制台中会出现你的支付信息。
- 你可以通过makePayment链接进行多次的测试操作。
图9 显示测试视图 ![](http://www-900.ibm.com/developerWorks/cn/rational/r-wsad-xde/images/image009.gif) 图 9. 浏览测试结果 恭喜你!你已经通过使用来自于IBM WebSphere Studio and XDE工具套件的不同插件完成了对这个迷你开发周期中的设计、实现和测试的工作。 鸣谢 Tad希望对这个样例的以下几位主要的贡献者表示感谢:Rick Weaver,IBM全球工具技术销售人员;Patrick Cadonau,IBM瑞士,技术专家;Mathias Staub,IBM Rational 瑞士,顾问。
参考资料
|