熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

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

2013-11-15 11:45:58  來源: JSP教程 

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

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

  

  圖 PetStore與Jazz平台依賴關系

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

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

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

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

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

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

  Jazz技術概覽

  技術架構

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

  
    圖 Jazz Platform

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

  編程模型

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

  
    圖 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依賴BB依賴A或A依賴BB依賴CC依賴A)

   PetStore設計概覽

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

  
    圖 PetStore用例圖

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

  在Jazz PetStore示范應用中我們使用一個Jazz構件PetStore實現其功能其中包含三個plugin項目

  · mon 存放數據模型和服務接口申明

  · comibmpetstoreservice 實現服務接口

  · comibmpetstoreweb 實現基於JAF的胖客戶端UI

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

  數據持久化

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

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

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 PetStore數據模型

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

  創建common bundle

  下面我們將完成PetStore開發的第一步創建mon bundle並完成PetStore數據模型的開發創建插件項目如圖所示

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 創建插件項目

  指定項目名稱(mon)使用缺省的location目標環境設置為OSGi frameworkequinox如圖所示

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 指定項目名稱

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 設置插件特征

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 設置插件模板

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

  設置插件依賴

  在plugin manifest editor中添加以下的插件依賴項如圖所示

  · reruntime

  · orgeclipseemfecore

  · orgeclipseemfecoresdo

  · comibmmon

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 設置插件依賴

  在plugin的根目錄下創建一個名為srcgen的Source Folder用於將來存放由Ecore模型自動生成的代碼

  定義模型

  New>Source Folder取名為srcgen在plugin根目錄下同時創建一個名為models的子目錄(如圖所示) 然後在其中創建一個新的EMF ecore模型New>Other>Example EMF Model Creation Wizards>Ecore Model給模型取名為petstoreecore其余選項保持默認值即可

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 設置生成代碼的目錄

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

  注意如果你的目標平台沒有找到repositoryecore你需要手動的把comibmmon插件手動import到你的workspace中

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 EPackage節點屬性

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

   cellPadding= border=>
EAnnotation
Source
teamModel
Details Entry
Key
clientProject
Value
mon
Details Entry
Key
clientSrcFolder
Value
srcgen
 
 
 
 
 
 
 
 
 
 

  clientProject設為mon表示將來存放生成代碼的projectclientSrcFolder表示自動生成代碼放入的源代碼目錄這裡選擇之前建好的srcgen中目的是把自動生成的代碼分隔開進行管理

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 EPackage節點屬性

  注意Ns URI的值必須與組件名一致所以這裡必須是comibmpetstore

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

   cellPadding= border=>
EAnnotation
Source
teamPackage
Details Entry
Key
clientBasePackage
Value
comibm
Details Entry
Key
clientPackageSuffix
Value
commonmodel
Details Entry
Key
dbMapQueryablePropertiesOnly
Value
true

  clientBasePackage表示存放生成代碼的package前綴clientPackageSuffix表示存放生成代碼的package後綴這樣在加上EPackage petstore最終生成的代碼將會被放入到monmodel package裡dbMapQueryablePropertiesOnly設為true表示在生成的代碼裡只把queryable標簽設為true的屬性映射到數據庫中並在該持久化類的QueryModel裡提供對應的查詢字段

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>

  圖 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中並設置如下的屬性

   cellPadding= border=>
Name >
id
EType >
EInt
Lower Bound >

Default Value Literal >

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

   cellPadding= border=>
EAnnotation
Source >
queryableProperty colSpan=>
 
Details Entry
Details Entry
Key
Key >
unique
visibility >
Value
Value
 true
 DEFAULT

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

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

   cellPadding= border=>
Name >
name
EType >
EString
Lower Bound >

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

   cellPadding= border=>
EAnnotation
Source >
queryableProperty colSpan=>
 
Details Entry
Details Entry
Key
Key >
unique
visibility >
Value
Value
 true
 DEFAULT

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

   cellPadding= border=>
EAnnotation
Source >
teamProperty colSpan=>
 
Details Entry
Details Entry
Key
Key >
id
dbStringSize >
Value
Value
 false
 SMALL

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

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

   cellPadding= border=>
Name >
image
EType >
Content
Lower Bound >

Upper Bound >

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

  Category的EClass就建好了重復上述過程建立Product和Seller的EClass建完後整個ecore模型就建好了如下圖所示

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 ecore模型

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

  <fp src=http://imgeducitycn/img_///jpg border= twffan=done>
    圖 生成的模型層代碼

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

  總結

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

  參考資料

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

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

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

  Jazz開發環境搭建


From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19585.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.