在这一期文章中,把已经学到的关于 MDA 的知识应用于实践,了解如何使用开放源码的模型驱动架构(MDA)工具来简化 Spring-Hibernate 的开发。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
我最近的几个专栏提供了 MDA 技术的背景知识。在这一期文章中,随着我介绍如何用一个叫做 AndroMDA 的开放源码 MDA 工具构建简单的应用程序,您将看到 MDA 在实践中如何工作。我将用 AndroMDA 构建一个管理汽车的应用程序。Spring 将充当应用程序用户界面的基础,Hibernate 将充当持久性框架。应用服务器是 JBoss。
这篇文章的目的不是为了提供所使用的工具或技术的详细信息,而是提供应用 MDA 技术的体验。请参阅 下载一节 获得示例应用程序的完整源代码。请参阅 参考资料 下载 AndroMDA 和 JBoss,它们是运行示例所需要的软件。
开始
AndroMDA 使用 XML 元数据交换(XML Metadata Interchange,XMI)文件格式的输出,几乎所有的建模工具都基于特定于平台的 cartridge 生成应用程序的源代码。针对这个示例的目的,我将采用特定于 Spring 和 Hibernate 的 cartridge。对于实际的 MDA 建模,我可以采用任何能导出(或保存)标准 XMI 的工具。AndroMDA 的主页上推荐了一些免费或几乎免费的工具,但是它没有限定自己只能与这些工具一起工作。
有些 MDA 工具声称可以从统一建模语言(UML)的模型生成完整应用程序,有些则侧重于消除多数冗余的编码任务。AndroMDA 属于后一类。在应用程序中,我需要编写大约 10 行代码,所以可以说 AndroMDA 将为我生成 95% 的代码。
请参阅 参考资料 下载 AndroMDA。您将注意到 AndroMDA 采用 Maven(一个类似于 Ant 的开放源码工具)管理安装和一般性应用。AndroMDA 也可以和 Ant 一起使用,但是对于这个示例的目的,我建议采用 Maven。使用开放源码工具可以保证每个人都能使用这个示例。
用例
示例应用程序包含三个用例,如图 1 所示:列出汽车(List Car)、添加汽车(Add Car)和删除汽车(Remove Car)。所有这些用例的都标记为 AndroMDA <<FrontEndUseCase>>
类型的 构造型(stereotype),这告诉工具这个用例与最终用户相关,应当添加到用户界面。<<FrontEndApplication>>
构造型告诉 AndroMDA 该用例必须在应用程序的第一页上活动。
图 1. 示例应用程序的用例图
活动图
建立了用例之后,下一步是画出每个用例的活动图。活动图 描述了每个用例内部发生的情况。重点是必须为每个活动图创建(并分配)一个控制器类。控制器类只是一个普通的类,它惟一的任务就是把来自 UI 的调用转发到业务逻辑层(即,应用程序的服务)。
图 2 是 List Cars 用例的活动图。当用户请求汽车列表时,应用程序得到数据库中的所有汽车。图中第一个状态的 getAllCars() / defer
是对控制器类方法的引用。图中的过渡把 Collection
传递给下一状态,这将在应用程序界面上显示数据。在第二个状态之后,用户可以选择 Add Car 或 Remove Car,或者再次列出汽车。
图 2. List Cars 用例的活动图在图 3 中可以看到 Add Car 用例的活动图,它有点不同。在这个图中,最有意思的部分是从 Enter New Car 到 Store New Car 的过渡。过渡有一个信号,叫做 addNewCar
,它有三个参数。使用这个信息,AndroMDA 可以知道 Web 界面需要从用户请求这些参数。在图的最后一个状态中,我用控制器类的 createCar()
方法把数据传递给应用程序的业务逻辑。
图 3. Add Car 用例的活动图第三个活动图与第二个类似。请参阅 下载一节 下载并研究整个模型。
类图
类图 记录构成模型的所有类。在查看应用程序生成的文件时,可发现比类图中看到的更多的类和文件。幸运的是,这类支持类和文件,只有开发特定平台的 cartridge 的架构师和程序员才需要考虑(例如示例使用的 Spring 和 Hibernate 的 cartridge)。像 AndroMDA 这样的工具提供了 cartridge,并负责从它们生成文件,所以您可以把精力集中在应用程序建模上。
在图 4 所示的图的底部,是 Car
类。它加上了 <<Entity>>
构造型的标记,这告诉 AndroMDA 它是一个 Hibernate 实体。使用 Hibernate cartridge 意味着不用担心应用程序持久性的处理:它是自动生成的。Cars
类加上了 <<Service>>
构造型的标记。这意味着它是业务逻辑层的一部分,业务逻辑用实体向其他层和同一层的类提供服务。在图的顶部是控制器。可以看到,应用程序需要三个控制器分别处理三个用例。
图 4. 示例应用程序的类图
使用 AndroMDA
设计了应用程序模模型之后,就可以开始使用 AndroMDA 了。对于入门者来说,可以用它检测模型是否有误。只要进入项目的根目录,并调用
如果环境设置正确,Maven 会从 Internet 下载必要的包,生成源代码文件,并编译好一切。如果模型有错,那么会得到消息。在第一次启动 AndroMDA 之后,可以把调用变成
这样会使用现有的包,但偶尔也会提示包已经过时。
手工编码
AndroMDA 生成了应用程序的许多文件,但是我仍然需要做些手工编码。我需要手工编码的四个文件如下:
\core\src\..\CarsImpl.java
\web\src\..\ListCarsControllerImpl.java
\web\src\..\add\AddCarsControllerImpl.java
\web\src\..\remove\RemoveCarsControllerImpl.java
在清单 1 中,我手工编码到 CarsImpl.java 文件(它实现了 Services
类)中的行用 粗体 标记。
清单 1. 需要一些手工编码 ...
public class CarsImpl extends com.dace.cars.CarsBase { /** * @see com.dace.cars.Cars#getAllCars() */ protected java.util.Collection handleGetAllCars() throws java.lang.Exception { return this.getCarDao().findAll(); } /** * @see com.dace.cars.Cars#removeCar(java.lang.String) */ protected void handleRemoveCar(java.lang.String id) throws java.lang.Exception { this.getCarDao().remove(Long.valueOf(id)); } /** * @see com.dace.cars.Cars#createCar(java.lang.String, java.lang.String, int) */ protected void handleCreateCar(java.lang.String make, java.lang.String model, int year) throws java.lang.Exception { this.getCarDao().create(model, year, make); } }
|
可以看到,我并不需要很多手工编码。清单 2 显示了我写入 ListCarsController.java 文件的 getAllCars()
方法体中的内容。
清单 2. getAllCars() 方法
try { form.setCars(this.getCars().getAllCars()); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); }
|
请 下载示例,自行查看其余的修改。
配置 JBoss
我需要对 JBoss 的配置稍做修改,以便它能与 Hibernate 一起工作。首先,要检查是否启用了服务器的 HSQLDB TCP
连接。然后,编辑 [JBOSS_HOME]/server/[SERVER_NAME]/deploy/hsqldb-ds.xml
并取消两个元素的注释,其中一个属于连接:
<connection-url>jdbc:hsqldb:hsql://localhost:1701</connection-url>
|
另一个属于 Mbean:
<mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic"> <attribute name="Port">1701</attribute> <attribute name="Silent">true</attribute> <attribute name="Database">default</attribute> <attribute name="Trace">false</attribute> <attribute name="No_system_exit">true</attribute> </mbean>
|
部署应用程序
不管您是否相信,用 AndroMDA 构建应用程序就是这么简单!我要做的只是设计和建模应用程序,以及少量手工编码,然后就基本可以了。在可以部署示例之前,我需要为它创建数据库。要跟上这部分,请确保桌面上正在运行 JBoss,环境设置也配置正确(即 JBOSS_HOME
)。然后转到自己项目的根目录,并输入:
现在,在自己项目的根目录中输入以下命令,就可以部署应用程序了:
假设一切正常,将得到一条 BUILD SUCCESSFUL
消息。
现在应当可以浏览 http://localhost:8080/cars,使用应用程序了。
应用程序架构
到最后才讨论应用程序架构看起来可能不合常规,但是对于这类开发来说这么做是有意义的。因为我使用 AndroMDA 和它的 cartridge 生成应用程序,所以在最后我应当看看整体效果。如果您还没有这么做,请 下载 示例项目并现在就研究它。
像应用程序本身一样,架构也非常简单。\core\target\ 目录包含持久性和业务逻辑类。Car
实体类是 Hibernate 实体,Cars
服务类是一个无状态会话 bean。所有必要的文件和接口都是生成的。UI 层可以在 \web\target\ 目录中找到。应用程序的 Java 服务器页面(JSP)和级联样式表(CSS)文件以及控制器类都在那里。包含整个应用程序的文件位于 \app\target\。
图 5 显示了应用程序在 Web 浏览器中看起来的效果。
图 5. 示例应用程序的主屏幕示例包 包含汽车管理应用程序的 UML 模型和实现类,所以只需要设置环境变量,并针对项目运行 AndroMDA,就可以看到它的工作方式。
结束语
通过一个简单的示例,我演示了使用 AndroMDA 构建典型的 Web 企业应用程序。Spring-Hibernate 应用程序的多数代码是由 Spring 和 Hibernate 的 cartridge 基于我的模型生成的;我只手工编码了几行代码,并且这些代码也毫不困难。
显然,应用程序越复杂,开发起来就越不简单。包含成百上千个类的应用程序不会像这里演示的程序那样简单。但另一方面,通过使用 AndroMDA 或类似的 MDA 工具,可以把这类程序极大地简化。请参阅 参考资料,学习关于 MDA 和 AndroMDA 的更多内容。
分享到:
相关推荐
详细介绍了OMG的战略性开发方法学——MDA。 阐述了UML和MDA的关系,并介绍了MOF、XMI和CWM等与MDA相关的技术。 分析MDA如何运用基于UML的技术,将基于组件开发、设计模式、中间件等一系列重要的趋势性技术整合到...
模型驱动的体系架构MDA
MDA模型驱动架构教程,讲的非常详细。
该项目旨在开发工具,以使MDA支持正式的建模语言Alloy。
从EDOC模型到J2EE程序:一个MDA工具的实现 从EDOC模型到J2EE程序:一个MDA工具的实现 从EDOC模型到J2EE程序:一个MDA工具的实现
MDA develop
MDA Explained: The Practice and Promise of the Model Driven Architecture
型驱动架构(Model Driven Architecture,MDA)原理、构件技术应用关键技术、开源软件特性;根据 商业软件开发过程中的特性,提出了一种实用软件开发框架。此框架是基于SQA架构思想和 MDA架构实现原理,按照构件技术组装...
MDA Distilled is an accessible introduction to the MDA standard and its tools and technologies. The book describes the fundamental features of MDA, how they fit together, and how you can use them in ...
资源名:PCA和MDA进行人脸识别_PCA_MDA_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有...
主要阐述了MDA思想、MDA的框架、开发过程及相关标准,详细介绍三个不同抽象级别模型的建模过程,从整体上描述MDA软件开发的过程,得出一种MDA软件开发方法。
最新的OMG MDA 指南 2.0 Guide .MDA 是模型驱动体系架构(Model-Dri ven Architecture)的简称,是一种新的系统开发方法。
附件是INCA的MDA软件,好像只支持INCA8系列,我是用INCA7.1后安装这个软件没办法激活,但是安装INCA8.2就可以激活,有需要的拿去吧。
Their discussion of OCL's potential role in Model Driven Architecture (MDA) is timely and offers great insight into the way that UML can be taken to the next level of automated software development ...
基于模型驱动架构的电信业务元模型抽象研究,冯跃忠,,模型驱动架构(MDA)业务生成技术是新一代的软件开发方法学。在深入分析基于模型驱动的电信业务生成后,文章以SIP Servlet平台为例,�
这项研究以部委,部门和机构(MDA)为焦点小组,对尼日利亚公共服务领域内部审计职能与创新会计实践之间的关系进行了质询。 这项研究基于连续不断的公共服务欺诈案例,其伪造的财务报告淹没了尼日利亚的公务员领域,...
介绍MDA表之间的模型,并举例说明使用mda分析问题的方便性。
MDA&JTAG测试原理
MDA:新一代软件互操作体系结构