这篇文章的目的不是为了提供所使用的工具或技术的详细信息而是提供应用 MDA 技术的体验请参阅 下载一节 获得示例应用程序的完整源代码请参阅 参考资料 下载 AndroMDA 和 JBoss它们是运行示例所需要的软件
开始
AndroMDA 使用 XML 元数据交换(XML Metadata InterchangeXMI)文件格式的输出几乎所有的建模工具都基于特定于平台的 cartridge 生成应用程序的源代码针对这个示例的目的我将采用特定于 Spring 和 Hibernate 的 cartridge对于实际的 MDA 建模我可以采用任何能导出(或保存)标准 XMI 的工具AndroMDA 的主页上推荐了一些免费或几乎免费的工具但是它没有限定自己只能与这些工具一起工作
有些 MDA 工具声称可以从统一建模语言(UML)的模型生成完整应用程序有些则侧重于消除多数冗余的编码任务AndroMDA 属于后一类在应用程序中我需要编写大约 行代码所以可以说 AndroMDA 将为我生成 % 的代码
您将注意到 AndroMDA 采用 Maven(一个类似于 Ant 的开放源码工具)管理安装和一般性应用AndroMDA 也可以和 Ant 一起使用但是对于这个示例的目的我建议采用 Maven使用开放源码工具可以保证每个人都能使用这个示例
用例
示例应用程序包含三个用例如图 所示列出汽车(List Car)添加汽车(Add Car)和删除汽车(Remove Car)所有这些用例的都标记为 AndroMDA <<FrontEndUseCase>> 类型的 构造型(stereotype)这告诉工具这个用例与最终用户相关应当添加到用户界面<<FrontEndApplication>> 构造型告诉 AndroMDA 该用例必须在应用程序的第一页上活动
图 示例应用程序的用例图educitycn/img_///gif >
活动图
建立了用例之后下一步是画出每个用例的活动图活动图 描述了每个用例内部发生的情况重点是必须为每个活动图创建(并分配)一个控制器类控制器类只是一个普通的类它惟一的任务就是把来自 UI 的调用转发到业务逻辑层(即应用程序的服务)
图 是 List Cars 用例的活动图当用户请求汽车列表时应用程序得到数据库中的所有汽车图中第一个状态的 getAllCars() / defer 是对控制器类方法的引用图中的过渡把 Collection 传递给下一状态这将在应用程序界面上显示数据在第二个状态之后用户可以选择 Add Car 或 Remove Car或者再次列出汽车
图 List Cars 用例的活动图educitycn/img_///jpg >
在图 中可以看到 Add Car 用例的活动图它有点不同在这个图中最有意思的部分是从 Enter New Car 到 Store New Car 的过渡过渡有一个信号叫做 addNewCar它有三个参数使用这个信息AndroMDA 可以知道 Web 界面需要从用户请求这些参数在图的最后一个状态中我用控制器类的 createCar() 方法把数据传递给应用程序的业务逻辑
图 Add Car 用例的活动图educitycn/img_///jpg >
第三个活动图与第二个类似请参阅 下载一节 下载并研究整个模型
类图
类图 记录构成模型的所有类在查看应用程序生成的文件时可发现比类图中看到的更多的类和文件幸运的是这类支持类和文件只有开发特定平台的 cartridge 的架构师和程序员才需要考虑(例如示例使用的 Spring 和 Hibernate 的 cartridge)像 AndroMDA 这样的工具提供了 cartridge并负责从它们生成文件所以您可以把精力集中在应用程序建模上
在图 所示的图的底部是 Car 类它加上了 <<Entity>> 构造型的标记这告诉 AndroMDA 它是一个 Hibernate 实体使用 Hibernate cartridge 意味着不用担心应用程序持久性的处理它是自动生成的Cars 类加上了 <<Service>> 构造型的标记这意味着它是业务逻辑层的一部分业务逻辑用实体向其他层和同一层的类提供服务在图的顶部是控制器可以看到应用程序需要三个控制器分别处理三个用例
图 示例应用程序的类图educitycn/img_///jpg >
使用 AndroMDA
设计了应用程序模模型之后就可以开始使用 AndroMDA 了对于入门者来说可以用它检测模型是否有误只要进入项目的根目录并调用
maven
如果环境设置正确Maven 会从 Internet 下载必要的包生成源代码文件并编译好一切如果模型有错那么会得到消息在第一次启动 AndroMDA 之后可以把调用变成
maven o
这样会使用现有的包但偶尔也会提示包已经过时
手工编码
AndroMDA 生成了应用程序的许多文件但是我仍然需要做些手工编码我需要手工编码的四个文件如下
\core\src\\CarsImpljava
\web\src\\ListCarsControllerImpljava
\web\src\\add\AddCarsControllerImpljava
\web\src\\remove\RemoveCarsControllerImpljava
在清单 中我手工编码到 CarsImpljava 文件(它实现了 Services 类)中的行用 粗体 标记
清单 需要一些手工编码
public class CarsImpl
extends comdacecarsCarsBase
{
/**
* @see comdacecarsCars#getAllCars()
*/
protected javautilCollection handleGetAllCars()
throws javalangException
{
return thisgetCarDao()findAll();
}
/**
* @see comdacecarsCars#removeCar(javalangString)
*/
protected void handleRemoveCar(javalangString id)
throws javalangException
{
thisgetCarDao()remove(LongvalueOf(id));
}
/**
* @see comdacecarsCars#createCar(javalangString javalangString int)
*/
protected void handleCreateCar(javalangString make javalangString model int year)
throws javalangException
{
thisgetCarDao()create(model year make);
}
}
可以看到我并不需要很多手工编码清单 显示了我写入 ListCarsControllerjava 文件的 getAllCars() 方法体中的内容
清单 getAllCars() 方法
try
{
formsetCars(thisgetCars()getAllCars());
}
catch (Exception ex)
{
exprintStackTrace();
throw new RuntimeException(ex);
}
请 下载示例自行查看其余的修改
配置 JBoss
我需要对 JBoss 的配置稍做修改以便它能与 Hibernate 一起工作首先要检查是否启用了服务器的 HSQLDB TCP 连接然后编辑 [JBOSS_HOME]/server/[SERVER_NAME]/deploy/hsqldbdsxml 并取消两个元素的注释其中一个属于连接
<connectionurl>jdbc:hsqldb:hsql://localhost:</connectionurl>
另一个属于 Mbean
<mbean code=orgjbossjdbcHypersonicDatabase
name=jboss:service=Hypersonic>
<attribute name=Port></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)然后转到自己项目的根目录并输入
maven createschema
现在在自己项目的根目录中输入以下命令就可以部署应用程序了
maven deploy
假设一切正常将得到一条 BUILD SUCCESSFUL 消息
现在应当可以浏览//localhost:/cars使用应用程序了
应用程序架构
到最后才讨论应用程序架构看起来可能不合常规但是对于这类开发来说这么做是有意义的因为我使用 AndroMDA 和它的 cartridge 生成应用程序所以在最后我应当看看整体效果如果您还没有这么做请 下载 示例项目并现在就研究它
像应用程序本身一样架构也非常简单\core\target\ 目录包含持久性和业务逻辑类Car 实体类是 Hibernate 实体Cars 服务类是一个无状态会话 bean所有必要的文件和接口都是生成的UI 层可以在 \web\target\ 目录中找到应用程序的 Java 服务器页面(JSP)和级联样式表(CSS)文件以及控制器类都在那里包含整个应用程序的文件位于 \app\target\
图 显示了应用程序在 Web 浏览器中看起来的效果
图 示例应用程序的主屏幕educitycn/img_///jpg >
示例包 包含汽车管理应用程序的 UML 模型和实现类所以只需要设置环境变量并针对项目运行 AndroMDA就可以看到它的工作方式
结束语
通过一个简单的示例我演示了使用 AndroMDA 构建典型的 Web 企业应用程序SpringHibernate 应用程序的多数代码是由 Spring 和 Hibernate 的 cartridge 基于我的模型生成的我只手工编码了几行代码并且这些代码也毫不困难
显然应用程序越复杂开发起来就越不简单包含成百上千个类的应用程序不会像这里演示的程序那样简单但另一方面通过使用 AndroMDA 或类似的 MDA 工具可以把这类程序极大地简化