歡迎您光臨本站 註冊首頁

基於Jazz技術構建企業級Web2.0應用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

Jazz技術平台是一個可伸縮、可擴展的團隊協作平台,用於無縫地集成整個軟體生命周期中的任務.同時Jazz技術平台也為Web2.0應用程序的開發和擴展提供了有用的框架,開發人員可以很容易地利用它開發出基於Ajax和REST編程模型的Web2.0應用.在REST服務端,Jazz提供一個REST服務框架,此框架抽象了處理REST請求的細節(HTTP、數據封裝和解封等).REST服務通過Java介面進行定義,該Java介面和相應的基於EMF的存儲模型在運行時用於對請求和響應進行封送處理.在Web UI端,Jazz基於開放源代碼的Dojo Toolkit,提供一個Jazz Ajax Framework(JAF),從而簡化了Ajax開發.

本系列文章首先概述Jazz平台技術架構和編程模型,然後以開發人員熟悉的PetStore為例,詳細闡述使用Jazz技術開發企業級Web2.0應用的全過程.其中PetStore與Jazz技術平台間的依賴關係如圖1所示.

圖 1. PetStore與Jazz平台依賴關係

通過閱讀本系列文章,您將獲得以下幫助:

· 了解Jazz技術架構和編程模型.理解如何利用Jazz技術進行應用組件開發

· 了解如何通過Jazz提供的基於EMF建模的O-R Mapping機制實現數據模型持久化

· 了解如果通過Jazz提供的Process構件來完成業務流程的管理和定製

· 了解如何通過Jazz提供的Ajax框架(JAF),開發出基於Ajax和REST編程模型的Web2.0應用

本文是該系列的第一部分,將介紹Jazz平台的技術架構和編程模型,並完成PetStore示例應用開發的第一步——數據模型設計與實現.

Jazz技術概覽

技術架構

Jazz具有模塊化、可擴展的體系結構.Jazz採用Eclipse插件體系,開發者可以通過提供Eclipse bundle對Jazz功能的進行擴展.圍繞某一功能而開發的若干個bundle被組織到一個Jazz構件中,目前Jazz的構件如圖2所示


圖 2. Jazz Platform

圖中的每個構件實現一定的功能.其中Repository和Team Process是必須的,它們構成Jazz的內核.其中Repository負責對數據進行處理、完成O-R 映射和數據持久化等,是所有數據驅動型應用必須依賴的組件.目前Repository組件提供了對Oracle、DB2和Derby等主流資料庫的操作,它通過IRepositoryItemService和IQueryService提供上層API來對數據的增、刪、改、查進行統一封裝,然後在根據用戶的資料庫選擇和配置信息,翻譯成具體資料庫廠商支持的SQL再調用底層的JDBC來實現對具體DBMS的操作.從而屏蔽了不同資料庫廠商對SQL標準實現不同的問題,為上層應用在不同資料庫上的移植提供了解決方案.在本系列文章的第二部分有對Repository組件的詳細介紹和使用.Process組件負責Jazz的業務流程管理,它為應用程序提供了AOP的底層支持.在本系列文章的第三部分有對Process組件的詳細介紹.這兩個核心構件不依賴任何其它構件,因而可以被任何其它構件所依賴.

編程模型

基於Jazz平台的開發和與基於眾多主流的J2EE框架開發類似,都採用MVC的分層模型.值得一提的是Jazz提供了各種不同形式的服務,如Restful服務、RPC服務和Http RAW服務,因此它為不同種類的客戶端接入提供了相對統一的基於service的介面,無論是基於Ajax的Web UI還是基於RCP的Eclipse UI都可以統一的使用同一套後端提供的服務,無需做任何修改,它為不同類型的UI接入提供了內在的支持.其模型如下圖3所示:


圖 3. Jazz Framework

在一個典型的Web應用中,一個Jazz構件可能包含的bundle包括:

· Common bundle:用於數據模型和服務介面的定義,類似於MVC的Model層

· Service bundle:用於服務的實現,類似於MVC的Controller層

· Web UI bundle:用於用戶界面的實現,類似於MVC的View層

因此Jazz把一個典型的Web開發轉化成了Eclipse插件的開發,應用程序通過對不同擴展點進行擴展實現相應的功能並具有很強的重用性和可擴展性.一個Jazz構件可以依賴其它Jazz構件,並調用被依賴構件提供的服務.而應用程序只需要關注對不同服務的調用,服務的實例化和維護由Jazz平台進行提供,簡化應用程序開發,體現了控制反轉(Inverse Of Control)的思想.有一點需要注意:Jazz構件之間的依賴關係是單向的,不能形成直接或間接的循環依賴(即不能出現A依賴B,B依賴A;或A依賴B,B依賴C,C依賴A).

PetStore設計概覽

PetStore示範應用是一個基於Web的電子商務應用系統,它將實現以下幾個主要用例:查詢寵物、購買寵物、發布寵物、查看交易記錄.用例如圖4所示


圖 4. PetStore用例圖

用戶能夠通過PetStore平台編輯寵物的相關信息,發布自己欲出售的寵物;可以通過分類的方式瀏覽別人出售的寵物,搜索寵物信息等;對自己感興趣的寵物可以進行購買,並查詢自己的歷史交易記錄.

在Jazz PetStore示範應用中,我們使用一個Jazz構件PetStore實現其功能.其中包含三個plug-in項目:

· com.ibm.petstore.common 存放數據模型和服務介面申明

· com.ibm.petstore.service 實現服務介面

· com.ibm.petstore.web 實現基於JAF的胖客戶端UI

下面我們將以PetStore的模型層設計為例,介紹基於Jazz的數據持久化過程.

數據持久化

Jazz平台提供了一個基於EMF的O-R mapping框架,能夠幫助開發人員以EMF建模的形式完成資料庫建模和數據持久化工作.開發人員只需根據業務的需要設計自己的實體對象POJO(Plain Old Java Object)以及POJO之間的關係,並在EMF的Ecore模型中為實體對象提供基於Jazz的元數據信息,Jazz的Repository工具會根據建立的Ecore模型自動生成相應的POJO,並把這些POJO映射到資料庫的表結構中.從而實現了Ecore模型->POJO->資料庫持久化的目標,因此Jazz的儲存模型可以被視為一種有著Jazz特殊格式的Ecore模型.

在Jazz中所有的持久化數據都被存儲 style="COLOR: #000000" href="http://storage.it168.com/" target=_blank>存儲在repository中,每個持久化數據都被稱為條目(item),每個條目都含有自己的itemId和stateId.Jazz包含兩種不同的數據類型: SimpleItem和Auditable.它們是其它持久化數據類型的超類.SimpleItem用於那些不需要記錄歷史情況的簡單數據,Auditable則記錄了數據的歷史情況,每次對數據條目的修改都將產生一個新的stateId,所不同的是對於SimpleItem僅僅保留最新的stateId而不保存之前的記錄.Auditable的數據不僅保存新的stateId還會把之前每次修改的數據保存起來,每個數據版本都與一個stateId對應,並且可以通過數據的itemId取到這個數據每個版本的歷史記錄.

在我們示範應用中,我們將建立Category、Product、Seller三個POJO來存儲持久化數據.其中Category用來描述寵物的種類信息,Seller用來描述賣家信息,Product用來描述寵物,每個寵物都一個種類和一個出售者.為了簡單起見,我們不需要保留數據的歷史記錄,採用了SimpleItem作為它們的超類.它們之間的關係如圖5所示,注意:Content是Jazz里的內建數據類型,被用來保存圖片信息.


圖 5. PetStore數據模型

完成了PetStore的數據模型的設計后,下面我們將詳細介紹如何基於Jazz提供的O-R mapping功能完成數據模型持久化的過程.

創建common bundle

下面我們將完成PetStore開發的第一步:創建com.ibm.com.petstore.common bundle並完成PetStore數據模型的開發.創建插件項目,如圖6所示.


圖 6. 創建插件項目

指定項目名稱(com.ibm.petstore.common),使用預設的location,目標環境設置為OSGi framework:equinox,如圖7所示.


圖 7. 指定項目名稱


圖 8. 設置插件特徵

設置插件特性,這裡使用預設值,如果不需要activator就取消勾選框,如圖8所示.


圖 9. 設置插件模板

不使用模板,點擊「Finish」完成插件項目的創建.

設置插件依賴

在plug-in manifest editor中添加以下的插件依賴項,如圖10所示.

· org.eclipse.core.runtime

· org.eclipse.emf.ecore

· org.eclipse.emf.ecore.sdo

· com.ibm.team.repository.common


圖 10. 設置插件依賴

在plug-in的根目錄下創建一個名為src-gen的Source Folder,用於將來存放由Ecore模型自動生成的代碼.

定義模型

New->Source Folder取名為src-gen在plug-in根目錄下同時創建一個名為models的子目錄(如圖11所示), 然後在其中創建一個新的EMF ecore模型.New->Other...->Example EMF Model Creation Wizards->Ecore Model給模型取名為petstore.ecore,其餘選項保持默認值即可.


圖 11. 設置生成代碼的目錄

現在打開這個模型,你將看到一個樹形結構的Ecore模型編輯器.首先你需要把Jazz提供的repository.ecore加入到petstore Ecore模型的資源引用中,右鍵點擊編輯器里的任意節點,在上下文菜單中選擇Load Resource...在選擇資源的對話框里填入如下的URI,這個 URI代表repository.ecore在你的目標平台中的位置platform:/plugin/com.ibm.team.repository.common/models/repository.ecore

注意:如果你的目標平台沒有找到repository.ecore,你需要手動的把com.ibm.team.repository.common插件手動import到你的workspace中.

然後點擊OK按鈕.這時你將看到repository.ecore被成功的引入到Ecore編輯器中.然後選擇EPackage節點(初始時是null),點擊右鍵並選擇Show Properties View.你將通過屬性編輯窗口來編輯每個節點的屬性. 我們首先為EPackage節點設置如下屬性值,如圖12所示.


圖 12. EPackage節點屬性

在EPackage節點下添加EAnnotation子節點 (右鍵點擊PetStore EPackage然後選擇New Child->EAnnotation),並給它設置如下的source和詳細的keys 和values:

EAnnotation
Source

teamModel
Details Entry
Key
clientProject
Value
com.ibm.petstore.common
Details Entry
Key
clientSrcFolder
Value

src-gen

clientProject設為com.ibm.petstore.common表示將來存放生成代碼的project,clientSrcFolder表示自動生成代碼放入的源代碼目錄,這裡選擇之前建好的src-gen中,目的是把自動生成的代碼分隔開進行管理.

現在在根EPackage下添加一個名為petstore的子EPackage,並設置如下的屬性值:


圖 13. EPackage節點屬性

注意:Ns URI的值必須與組件名一致,這裡必須是com.ibm.petstore

在這個EPackage下添加一個名為teamPackage的EAnnotation,並給它設置如下的Source值和詳細的keys和values:

EAnnotation
Source
teamPackage
Details Entry
Key
clientBasePackage
Value

com.ibm
Details Entry
Key
clientPackageSuffix
Value
common.model
Details Entry
Key
dbMapQueryablePropertiesOnly

Value
true

clientBasePackage表示存放生成代碼的package前綴,clientPackageSuffix表示存放生成代碼的package後綴,這樣在加上EPackage petstore,最終生成的代碼將會被放入到com.ibm.petstore.common.model package里.dbMapQueryablePropertiesOnly設為true表示在生成的代碼里,只把queryable標籤設為true的屬性映射到資料庫中並在該持久化類的QueryModel里提供對應的查詢欄位.

至此,你已經完成了建立所有持久化模型都必須經過的步驟.此時的ecore模型應該如圖14所示:

圖 14. ecore模型

然後,我們開始為Category, Product, Seller三個持久化類建立對應的EClass.我們將以Category的建立過程為例來說明整個過程,讀者可以參照這個過程自行建立Product和Seller對應的EClass.

teamPackage是我們添加EClasses的地方,在EClass里需要定義你希望 存儲在Jazz儲存庫中的持久化對象、對象具有哪些屬性、屬性都有什麼類型和特性,這些都是通過加上一些特殊的Jazz標籤完成的,Jazz在以後生成具體的SQL DDL去建表時會去參考這些標籤值.

首先我們在teamPackage裡面創建一個名為Category的EClass,並指定它的ESuper Type為SimpleItem,(這裡使用SimpleItem而非Auditable,我們不需要 保存Category的歷史信息)然後我們為Category添加一個名為id的EAttribute到這個EClass中,並設置如下的屬性:

Name
id

EType
EInt
Lower Bound
1
Default Value Literal
0

EType信息表示屬性的類型,Lower Bound表示最少出現的次數,填1表示這個這個屬性是必須的,填0表示這個屬性可選,Default Value Literal表示屬性的默認值.然後我們還需要往EAttribute id里添加一個名為queryableProperty的EAnnotations註解,並設置如下的source值和詳細的keys和values:

EAnnotation
Source

queryableProperty
Details Entry
Details Entry
Key
Key
unique
visibility
Value
Value
true
DEFAULT

unique設為true表示id這個屬性在資料庫表中必須唯一,visibility設為DEFAULT表示這個屬性在生成的POJO中可見.

然後添加一個名為name的EAttribute到這個EClass中,並設置如下的屬性:

Name

name
EType
EString
Lower Bound
0

我們還需要往EAttribute name里添加兩個EAnnotations註解.首先添加名為queryableProperty的EAnnotations註解,並設置如下的source值和詳細的keys和values:

EAnnotation
Source
queryableProperty

Details Entry
Details Entry
Key
Key
unique
visibility
Value
Value
true
DEFAULT

再添加名為teamProperty的EAnnotations,並設置如下的source值和詳細的keys和values:

EAnnotation
Source
teamProperty

Details Entry
Details Entry
Key
Key
id
dbStringSize
Value
Value
false
SMALL

我們還需為Category添加一個名為description的EAttribute,添加過程與name EAttribute類似,在此略去讀者只需重複上述過程即可.唯一不同的是把dbStringSize調整為LARGE來獲取大於2048位元組的存儲空間.

我們為Category添加名為image的EReference,並設置如下的屬性:

Name

image
EType
Content
Lower Bound
0
Upper Bound
1

Lower Bound設為0,Upper Bound設為1表示每個Category只有0或1張圖片.如果允許每個種類有多張圖片可以把Upper Bound設為-1,這樣在生成的Category POJO里將會有一個圖片的List.

Category的EClass就建好了,重複上述過程建立Product和Seller的EClass,建完后,整個ecore模型就建好了,如下圖15所示:


圖 15. ecore模型

接下來我們運行Jazz提供的code gen工具,進行從ecore模型到Java代碼的自動生成.在Package Explorer 視圖中,右鍵點擊petstore.ecore文件然後選擇執行Jazz Tools->Generate Component,這樣所有持久層的代碼都會自動生產到src-gen目錄中,如圖16所示:


圖 16. 生成的模型層代碼

生成完模型層的代碼后,PetStore數據模型層的設計和持久化就完成了.接下來需要進行業務服務層的設計與實現,這將在本系列文章的第二部分中介紹.

總結

本文首先介紹了Jazz的技術架構和編程模型,讓讀者對Jazz技術平台和開發方式有個直觀的認識.然後結合PetStore應用實例,詳細闡述如何利用Jazz平台的O-R mapping完成數據模型設計和持久化的過程.

參考資料

Jazz新手入門為您全面介紹Jazz平台的技術概覽,並提供相關的入門學習資源

Jazz技術文檔中心為您提供最新的Jazz技術文檔和入門教程,是深入學習Jazz技術的最佳中文技術資源.

Hello Jazz介紹了如何編寫簡單的Jazz組件

Jazz開發環境搭建


[火星人 ] 基於Jazz技術構建企業級Web2.0應用已經有660次圍觀

http://coctec.com/docs/java/show-post-61748.html