在这一期文章中,把已经学到的关于 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 的更多内容。
分享到:
相关推荐
模型驱动架构(Model Driven Architecture, MDA)是一种软件开发方法,它强调使用模型作为软件开发的核心,并通过一系列转换过程将高层的抽象模型转化为具体的平台实现。MDA旨在提高软件开发的效率,可重用性,并...
模型驱动体系架构(Model-Driven Architecture,简称MDA)是由对象管理组织(Object Management Group,简称OMG)定义的一种系统开发方法。MDA提供了一种通过模型和架构来驱动整个系统(包括物理系统、组织系统和IT...
5. 实战案例:提供实际的MDA应用示例,展示如何从PIM到PSM的整个过程,可能包括一个简单的业务应用程序或移动应用的开发。 6. MDA的挑战和最佳实践:讨论MDA实施中可能遇到的问题,如模型的复杂性管理和维护,以及...
模型驱动的体系架构MDA
模型驱动架构(MDA)在HLA仿真系统中的应用研究 模型驱动架构(MDA)是由对象管理组(OMG)提出的先进软件开发方法,它强调通过形式化模型来规范和实现系统的互操作性。MDA的核心在于统一建模语言(UML)、XML元...
MDA,全称为Model Driven Architecture(模型驱动架构),是软件工程领域的一种重要方法论,由OMG(Object Management Group)提出,旨在提高软件开发的效率、质量和可维护性。MDA的核心思想是通过高层次的抽象模型...
MDA(Model Driven Architecture,模型驱动架构)是OMG(Object Management Group,对象管理组织)提出的一种软件开发方法论,它旨在通过模型化的方式提高软件开发的效率和质量。MDA的核心思想是将业务逻辑与技术...
MDA,即模型驱动架构,是一种由对象管理组织(OMG)提出的软件开发方法论。它强调的是使用模型来进行软件项目的分析、设计、构建、部署及维护等活动,旨在提高软件的可移植性、互操作性和重用性。 #### 模型的概念 ...
**Alloy MDA:MDA对Alloy的支持** MDA(Model Driven Architecture,模型驱动架构)是一种由OMG(Object Management Group)提出的软件开发方法论,它强调使用模型作为软件开发的核心,并通过一系列自动化的转换...
模型驱动开发(Model Driven Architecture,MDA)是由OMG(Object Management Group)提出的一种软件开发方法论,它强调以模型为中心,通过元模型(Meta-models)和平台独立模型(Platform Independent Models, PIMs...
**MDA(模型驱动架构)概述** MDA,即Model-Driven Architecture,是 OMG(Object Management Group)提出的一种软件开发方法论,旨在提高软件开发的效率、可维护性和可重用性。MDA的核心思想是将业务逻辑和系统...
模型驱动架构(Model Driven Architecture,简称MDA)是一种由对象管理组织(Object Management Group, OMG)提出的软件开发方法论,其主要目的在于通过分离系统规格说明与平台实现的具体细节,从而达到提高软件的可...
### 模型驱动架构(MDA):实践与承诺 #### 概述 《MDA Explained: The Practice and Promise of the Model Driven Architecture》是一本深入探讨模型驱动架构(Model Driven Architecture,简称MDA)及其应用的...
**标题:“Sybase ASE MDA关系”** 在Sybase Adaptive Server Enterprise (ASE)数据库管理系统中,MDA(Metadata Data Access)是一种强大的工具,用于监控和分析数据库的性能问题。MDA提供了一种方法来深入了解ASE...
中国移动手机桌面助理(MDA)是一款专为中国移动用户设计的智能管理软件,旨在提升手机用户的使用体验和效率。MDA 3.1.0.132是该应用的一个特定版本,提供了丰富的功能和服务,包括但不限于: 1. **联系人管理**:...
在探讨MDA基础模型提案的知识点之前,首先需要明确MDA(模型驱动架构)的概念。MDA是一种系统开发方法,它强调使用模型来指导软件的理解、设计、构建、部署、操作、维护和修改的整个过程。MDA的核心在于模型、元模型...