Rational®XDE TM 为最流行的集成开发环境(IDE)提供了真正的无缝集成的可视化建模环境。Rational XDE 不但具有自动化生成代码和代码/模型的同步的功能,它还具有其他更多的特性来辅助软件的开发。为了能够更好的利用Rational XDE,你需要了解XDE所提供的强大的J2EE模式和代码模板的能力,你既可以在开发当中应用J2EE模式和代码模板,也可以自己来定义和创建他们。本文将向大家展示如何使用Rational XDE 所提供的能力完成一个简单的J2EE项目的开发。
一个简单应用的概述
为了展示如何使用Rational XDE 的独特能力,我们将实现一个简单的Web应用的部分功能,这是一个贷款管理的应用系统,系统允许贷款者与贷款管理员执行一些简单的任务。
贷款者
在线支付
通过浏览器查看分期付款计划
贷款管理员
为客户建立一个或多个贷款项目
获取有关预定还贷的信息
我们假设我们必须利用已有的基础架构平台:一个IBM WebSphere 应用服务器和几个数据库。
首先我们可以使用Rational XDE提供的自由形式的建模能力来不受限制的表达有关方案的方向和思想,比如图1所示。 这种自由形式的图给我们提供了显而易见的好处:他们允许你仍然使用相同的工具,并且使将计划文档集成到项目中变的十分容易。
图1: 自由形式图更加广泛的展示了方案的要点
自动化分析和设计行为
一旦最初的计划被完成,我们就可以开始进行分析与设计工作了。虽然Rational XDE运行在某一软件开发工具中,但它提供了完成传统的分析与设计活动的所有能力-用例建模,时序图等等。实际上Rational XDE也提供了Rational Unified Process? Configuration for Java Developers (RCJD), RCJD为Java软件的开发提供了已被证明指南。
图2显示了简单的贷款管理系统的初始用例模型,此模型是通过与客户的讨论以及经一步的细化而得到的。
图2:简单的贷款管理系统的用例模型
为了简单起见,我们将只对其中的一个用例进行描述,以展示Rational XDE在此过程中的作用。我们选择"显示分期付款"这个用例。最初的时序图细化了基本的用例场景,见图3所示。
图3:细化了显示分期付款用例的基本流程的时序图
显然,这是一个高层次上的交互视图,并没有涉及到任何系统内部的工作的细节。Rational Unified Process 建议使用分析级别的类来提供更加细节的内容。见图4。
图4:显示分期贷款用例的细化了的主流程
如何更加精确的描述这个图所表达的内容已经超出了本文的范围,你可以从文章最后所列的前三个资源引用中得到更详细的信息。注意在例子中,我们选择了将边缘类划分为两个页面。一个更为简单的做法是通过单一的元素来接受所有的边缘交互。
使用自定义模式创建模型
你可能对象"四人组"(Gang of Four)这样的设计模式有一定的了解。这些已经定义好的模式在Rational XDE中是被支持的,我们将在本文的后面部分展示某些模式的用法。Rational XDE更进一步的支持了模式,它提供了通过UML来简化定义你自己的模式的能力。这种自定义模式的能力不但允许你实现自己的设计,而且可以自动化一些在建模过程中枯燥乏味的工作,比如产生多个用例流程图。典型的情况下用例拥有不止一个事件流。例如显示分期贷款用例拥有至少两个事件流:一个是成功存档的场景,另一个是当尽力的获取贷款详细信息时操作失败的场景。图5 显示了一个自定义的模式(UCArtifacts),它将为我们产生一个主事件流(成功),和两个失败的事件流。
图5:自定义模式(UCArtifacts)自动化产生用例的事件流程图
这个简单的模式包含了两个输入参数:ausecase作为用例模型元素的输入,anactor作为角色模型元素的输入。模式用输入参数的名字创建对象,用例的名字被加到Boundary, Control, or Entity名字中。这些对象被用于定义主事件流图和两个可选的事件流图的时序图的框架,这种定义是基于XDE所提供的标准的UML图的。为用例创建时序图是十分简单的,你可以通过在模型浏览器中拖/放相关的对象来完成创建时序图的工作。两个可选事件流的每一个都可以使用模式创建的角色、任何的边缘(boundary)对象、控制(control)对象和实体(entity)对象。我们能够通过在不同的对象之间画被需要的消息和删除任何没有参与事件流的分析对象来完成用例图。
实现设计
图6:"显示分期贷款"用例的初始类图
图6显示了"显示分期贷款"用例初始的类图。
这个图显示了实现关键需求的基本角色,但并没有考虑到其他用例实现当中用到的类。为了实现统一的分析建模,我们需要用相同的方法分析其他的用例,然后将结果进行合并。在这个阶段,我们主要的目标是识别和排除重复的类,并且将相似和重叠的功能合并到同一个类中。例如,我们可以将Amortization 和MakePaymentControl进行合并成为一个单独的控制对象,这个控制对象能够处理多个用例。这里我们重点讲述了"显示分期贷款"用例,但并没有显示全部的用例操作。你可以通过本文最后参考资源部分的前三个获取更多的关于用例的知识。
J2EE实现方案
到此为止我们所讨论的几乎是与具体的实现技术无关的。现在让我们来看一下本文之前所讲述的XDE的能力是如何被应用到J2EE的开发当中的。通常情况下,我们上面所讨论的分析类将被映射为以下的J2EE技术:
边缘对象(Boundary)
HTML
JavaServer Page(JSP)
控制对象(Control)
Servlets
Session Beans
Message Driven Beans
实体对象(Entity)
Entity Beans
JavaBean
对于在开发你的应用系统时选择正确合理的J2EE技术,这只是一个开始点。因为不同的技术可以被用来实现相似的方案,最合理的选择取决于你的实现细节和系统的需求。
当然,Rational XDE J2EE模式最酷的部分是每一种模式都被XDE完全的实现了。你所要做的就是为你的应用提供业务逻辑。在这部分,我们来了解一下为了使用Front Controller模式,你所需要知道的具体细节。
建立请求与用例之间的关系
一个请求(例如,一个表单的提交)必须能够被简单的指定给一个特定的用例。在我们讨论的Front Controller模式的实现中,这个信息应该通过表单中的隐藏域来传达,用例的名字应该在创建表单时被设置。当表单被提交时,控制器简单的解析参数以决定哪一个用例应该被调用。当请求没有被明确的指定某一用例时,通常一个缺省的用例功能被设置用来处理该请求(见下面)。
<FORM Name="Form" METHOD="GET" ACTION="Controller">
<p align="left">
<b><i><u>Show Amortization</u></i></b>
</p>
<p>
Enter the following information about the loan:
</p>
<p>
Principal
<input type="text" name="principal" size="8" value="250000">
dollars
</p>
<p>
Rate
<input type="text" name="rate" size="8" value="10.0"> %
</p>
<p>
Duration
<input type="text" name="termInYears" size="3" value="30">
years
</p>
<input type="hidden" name="UseCase" value="ShowAmortization">
<p>
<input ID="IDCancel" Name="Cancel" Type="reset" Value="Cancel">
<input ID="IDOK" Name="OK" Type="submit" Value="OK">
</p>
</FORM>
通过控制器(Controller)处理请求
对于控制器来说不需要任何的实现工作,模式的实现会根据所需逻辑抽取隐藏的参数,请求相关的helper bean,并且委托helper bean完成处理工作。图7 显示了页面与控制器之间的静态关系。完整的自动产生的请求处理代码,见图7下方的代码清单。
图 7:表单和控制器间的关系
// Check if we have a use case name passed on the URL.
String useCase = httpRequest.getParameter("UseCase");
IHelper ihelper = null;
if (useCase != null)
{
// Dynamically instantiate a helper and call it.
ihelper = (IHelper)theHelperFactory.create(useCase);
if (ihelper == null) ihelper =
(IHelper)theHelperFactory.createDefaultHelper();
}
else
{
ihelper = (IHelper)theHelperFactory.createDefaultHelper();
}
ihelper.processRequest(httpRequest, httpResponse);
建立用例和Helper Bean之间的映射关系
你能够在设计时通过在HelperFactory的构造函数中添加映射信息来建立用例和Helper Bean之间的映射关系。对于"显示分期贷款"用例和"设置贷款"用例来说映射是简单的,请看下面的代码片断。 这段代码仅仅需要在设计时被放置到HelperFactory构造函数的适当的、预先定义好的位置上。
// establish ShowAmortization use case mapping to its helper class
usecasename = "ShowAmortization";
classname = "ShowAmortizationHelper";
addMap(usecasename, classname);
// establish SetupLoan use case mapping to its respective helper class
usecasename = "SetupLoan";
classname = "SetupLoanHelper";
addMap(usecasename, classname);
Helper Bean的实现
很明显,这个场景下helper Bean的实现对于不同的用例来说是应该是不同的。一般而言,一个helper Bean通常需要从请求中、被收集到的等价的额外信息中和其他参与者(例如:会话bean和实体bean)中提取适当的表单参数,然后,最终产生可以用于显示的处理结果。
这个处理过程的部分例子见下面清单。注意XDE模式引擎完全消除了手工创建helper类的需要。你需要做的只是在向导中简单的所选择"Generated Value"选项,并且输入helper类的名字。图8显示了这个向导的截图。
// extract the info from the request parameter
String sPrincipal = httpRequest.getParameter("principal");
…..
// locate the amortization EJB using the service locator
…...
// call the remote method on the session bean
float totalInterest = theRemote.amortize(principal, rate, termInYears);
// put data in the AmortValueBean
AmortValueBean avb = new AmortValueBean();
avb.setPrincipal(principal);
…..
// set the session attribute
httpRequest.getSession().setAttribute("avb", avb);
图8: 自动产生基本的Helper Bean
显示结果
这里再一次强调,有不同的方法可以完成相同的工作。典型的情况下,数据对于JSP来说应该是可得到的,JSP将负责数据的显示格式。图9 显示了这种静态的关系。对于此方法,JSP源代码显示在图9 的下面。
图9 :JSP与被格式化/显示的数据之间的关系
extracts data from the 'avb' bean instance and formats/displays it
<jsp:useBean class="AmortValueBean" id="avb" scope="session"/>
<b>
Results of your loan amortization request:
<br>
Pricipal entered: <%= avb.getPrincipal() %>
<br>
YY.
Total Payments: <%= avb.getTotalPayments() %>
<br>
</b>
<p><a HREF="MainLoan.html">Back to Main Page</a>
代码模板(Code Templates)
代码模板是另一个Rational XDE提供的用于简化开发人员开发工作的能力。他们为以下方面提供非常有效的机制:
代码片断和算法的重用
对特定问题实现基于代码共享的一致性的解决方案以
创建标准的头信息和注释
Rational XDE 对代码模板提供了实质性的支持。除了可扩展的、内建的基础结构外,它还提供了以下的能力:
绑定一个或多个代码模板到一个方法
根据需要去除一个代码模板的绑定
重新安排绑定顺序以满足代码产生的需要
参数化代码模板
在我们的例子中,你能够创建一个代码模板以建立用例和helper类的映射。然后你可以将代码模板多次绑定到构造函数,并且为代码模板简单的提供不同的缺省值以自定义代码的生成。
图10显示了这样的一个例子。
图10:建立用例和Helper Bean映射的代码模板
代码模板也可以作为自定义模式的一部分来使用,因此你就可以使用Rational XDE创建更加有扩展性的应用框架。实际上,Rational XDE 内部也使用了代码模板和模式的
能力来实现产品的其他各种能力。例如, getters and setters相关代码的产生,设计模式的实现等等,都用到了代码模板的能力。
端对端的场景
对于本文的简单应用我们已经函盖了设计和实现的具体细节,现在让我们把这些片断组合在一起。 接下来的两个时序图捕获了不同对象间端到端的交互,包括来自于两个模式实现的参与者。
图11展示了前端的活动:表单被提交到控制器,控制器获得helper bean并且要求它来处理外部的请求。
图 11:表单被提交并且被控制器处理
图12 是上一个时序图的继续。它显示了helper bean的各种初始化的动作,最终请求被转发给了负责格式化和显示计算结果的JSP页面,JSP页面将结果显示给最终用户。注意在获取被需要的EJB的过程中使用了服务定位器模式。
图12:Helper Bean执行处理过程并呈现结果
模式和代码模板简化并加速了J2EE的开发
我希望本文的讨论向大家传达了Rational XDE在J2EE项目中给开发人员带来的益处。Rational XDE中的模式和代码模板给大家提供了一种简单的方法来利用经典的解决方案以加速软件的开发。Rational XDE其他方面的能力-比如自动同步和创建自定义模式和代码模板的能力-将使开发人员从枯燥的、反复的任务中解放出来并进一步的加速软件的开发。
参考资料
Khawar Ahmed 和 Cary Umrysh,所著的《使用J2EE和UML开发企业级Java应用》 Addison-Wesley, 2001.
Ivar Jacobson, Magnus Christerson, Patrik Jonsson, and Gunnar Overgaard, 《面向对象的软件工程》Addison-Wesley, 1992.
《Rational 统一过程指南》:分析类 部分
Grady Booch, James Rumbaugh, and Ivar Jacobson, 《统一建模语言用户指南》e. Addison-Wesley, 1999.
关于作者
Khawar Z. Ahmed 是IBM Rational XDE 技术市场部门的一员,他主要负责 XDE 的 Java 平台版本。同时他也是书《Developing Enterprise Java Applications with J2EE and UML》 的第二作者. 你可以通过 kzahmed@us.ibm.com 与他联系。