這篇文章的目的不是為了提供所使用的工具或技術的詳細信息
而是提供應用 MDA 技術的體驗
請參閱 下載一節 獲得示例應用程序的完整源代碼
請參閱 參考資料 下載 AndroMDA 和 JBoss
它們是運行示例所需要的軟件
開始 AndroMDA 使用 XML 元數據交換(XML Metadata Interchange
XMI)文件格式的輸出
幾乎所有的建模工具都基於特定於平台的 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\
\CarsImpl
java
\web\src\
\ListCarsControllerImpl
java
\web\src\
\add\AddCarsControllerImpl
java
\web\src\
\remove\RemoveCarsControllerImpl
java
在清單
中
我手工編碼到 CarsImpl
java 文件(它實現了 Services 類)中的行用 粗體 標記
清單
需要一些手工編碼
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);
}
}
可以看到
我並不需要很多手工編碼
清單
顯示了我寫入 ListCarsController
java 文件的 getAllCars() 方法體中的內容
清單
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:
</connection
url>
另一個屬於 Mbean
<mbean code=
org
jboss
jdbc
HypersonicDatabase
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 create
schema
現在
在自己項目的根目錄中輸入以下命令
就可以部署應用程序了
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 企業應用程序
Spring
Hibernate 應用程序的多數代碼是由 Spring 和 Hibernate 的 cartridge 基於我的模型生成的
我只手工編碼了幾行代碼
並且這些代碼也毫不困難
顯然
應用程序越復雜
開發起來就越不簡單
包含成百上千個類的應用程序不會像這裡演示的程序那樣簡單
但另一方面
通過使用 AndroMDA 或類似的 MDA 工具
可以把這類程序極大地簡化
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27999.html