第2部分: 采用Ganymede進行富客戶機平台開發
Eclipse IDE 的 Ganymede 發行版包括 24 個獨立項目,涵蓋各種各樣的技術。這些 項目大部分都十分成熟,而此發行版將提供對這些項目的增量改進。但是 Ganymede 還包 括把新技術引入到 Eclipse 平台中的許多新項目。在這個 “使用 Eclipse Ganymede 進 行桌面、Web 和移動設備開發” 三部分系列教程中,我們將介紹以下新 Ganymede 特性 :RCP、RAP 和 eRCP,這些特性將允許用一個通用代碼庫分別為桌面平台、Web 平台和移 動平台開發軟件;使用 Subversion 進行版本控制;以及使用 p2 進行更新和安裝。
開始之前
本教程適用於想要了解如何獲得使用成熟的 Rich Client Platform(RCP)編寫的代 碼,並將其修改為使用新的 Rich Ajax Platform(RAP)在 Web 上實現富客戶機體驗的 所有 Eclipse 開發人員。您應當了解 Eclipse 平台並且熟悉一些 Rich Internet Application(RIA)理念。另外,您應當了解如何配置 servlet 容器並在其中部署應用 程序。
關於本系列
第 1 部分 將介紹 RCP 的新特性、新 Subversion Eclipse 集成以及 p2 打包和分發 系統。第 2 部分將引入 Rich Ajax Platform(RAP)來編寫 Web 應用程序。第 3 部分 將討論如何使用內置的 Rich Client Platform(eRCP)為移動設備開發應用程序。
關於本教程
Eclipse IDE 的 Ganymede 發行版將捆綁 Eclipse 旗下的 20 多個新項目和現有項目 。在這個共分三部分的系列教程的第 1 部分中,您了解了一些可以簡化開發的新添特性 ,包括 Subversion 支持和名為 p2 的新插件分發模型。通過開發一個簡單的備忘記事本 插件應用程序,然後將它存儲在 Subversion 中並通過 p2 進行部署,您還看到了成熟的 Rich Client Platform(RCP)中的一些增量改進。
Ganymede 中添加的另一項令人興奮的內容是 Rich Application Platform(RAP)。 RAP 用於構建富客戶機應用程序 — 類似於為桌面應用程序開發的有狀態 GUI 應用 程序 — 並將其部署以供在 Web 中使用。RAP 把 Eclipse 編程模型引入到 Web 中 ,允許在構建基於 RAP 的應用程序時重用大部分現有的 RCP 代碼。這是使用 Ajax 完成 的,但是 Eclipse 可以讓您輕松地利用使用 RCP 開發桌面應用程序的知識。為了演示, 您將把在 第 1 部分 中開發的備忘記事本修改為使用 RAP。
主題包括:
如何下載並把 RAP 環境安裝到 Eclipse 中
如何把現有 RCP 代碼遷移到 RAP 中
如何為 Web 構造代碼
如何打包並把代碼部署到 Web 服務器中
系統要求
Eclipse GanymedeEclipse Ganymede 位於 Eclipse Foundation。 Java 2 Standard Edition從 Sun Microsystems 可以獲得 Java™ 2 Standard Edition V5 或更高版本。Eclipse RAP在 Eclipse.org 的 Eclipse Foundation RAP 部 分 可以獲得 Eclipse RAP 插件。Apache Tomcat為了把已完成的 RAP 應用程序部署到獨 立的 servlet 容器中,本教程將使用 Apache Tomcat。請下載最新穩定版本。
開始使用 RAP
在開始用 RAP 進行開發前,必須先從 Eclipse Web 站點下載並 設置目標平台才能使用它。
用 RAP 進行開發
RAP 允許使用 Eclipse 開發 模型構建啟用 Ajax 的 Web 應用程序。如果您已經熟悉如何用 Eclipse RCP 開發桌面應 用程序,則已經具備了 RAP 開發技術。實際上,為 RCP 應用程序編寫的大部分代碼可以 在 RAP 應用程序中重用。這意味著您可以充分利用 Java 技術和 Eclipse API 的功能來 開發基於 Web 的應用程序。然後,您的用戶將體驗到一個無需刷新頁面的完整的 GUI 應 用程序,就像一個典型的 Web 應用程序一樣,但是用戶不必在他們的台式機中下載並安 裝您的應用程序。RAP 通過提供一個特殊的標准部件工具包(Standard Widget Toolkit ,SWT)、JFace 和 Workbench 等的實現(實際上是 RCP 的子集)做到了這一點。
由於 RCP 和 RAP 的基本架構類似(參見圖 1),因此在源代碼中進行極少的更 改就可以實現插件重用。同在桌面環境中執行 RCP 應用程序的方法一樣,通過標准浏覽 器可以訪問 RAP 應用程序。這是由 RAP Widget Toolkit(RWT)實現的,這是 RCP 中使 用的 SWT 的替代品。
浏覽器端部件呈現是用 qooxdoo Ajax 庫完成的。qooxdoo 一個功能完善的 Ajax 框架,它利用了面向對象的 JavaScript,使用戶可以構建跨浏覽 器應用程序。RAP 抽象出了關於 JavaScript 的詳細信息,允許您使用 Java API 構建 Rich Internet Application(RIA)。自定義部件開發人員需要具備 JavaScript、 qooxdoo 和 RAP 知識。客戶端開發允許嵌入諸如其他 JavaScript 框架、Flash 和 applet 之類的客戶端技術。
圖 1. 比較 RAP 和 RCP 的架構
下載 RAP
由於 RAP 是 RCP 子集,因此它不能與 RCP 在同一個 Eclipse 實例中共存; 必須單獨下載並安裝 Eclipse 的 RAP 環境。
將浏覽器指向 www.eclipse.org/rap/downloads(參見圖 2)。
注:如果想要把 RCP 源代碼遷 移到 RAP 中,則建議為 RAP 下載目標平台。這樣可以針對目標 RAP 代碼編譯和運行現 有 RCP 代碼。如果傾向於使用 RAP 開發新 Web 應用程序並且需要擁有開發平台,則建 議通過 p2 更新機制獲得 RAP SDK,這種方法已經在 第 1 部分 中介紹過。
圖 2. Eclipse RAP 主頁
選擇 文件名中帶有 “target platform” 的 V1.1rRelease,然後選擇適當的鏡像 。
圖 3. Eclipse RAP 下載頁面
將 ZIP 文件下載到本地硬盤驅動器的一個臨時目錄中,即 Eclipse 安裝可以訪問的位置。 傳輸完成後,把它解壓縮到臨時目錄中。打開 Eclipse Ganymede 實例,並確保工作空間 指向保存第 1 部分的備忘記事本項目所在的位置,然後把 Eclipse 桌面打開到插件開發 透視圖。打開 Eclipse 的 Preferences 面板。如何完成此操作取決於您的操作系統 — 例如,對於 Windows®,操作為 Window > Preferences(參見圖 4); 對於 Mac OS X,操作為 Eclipse > Preferences。浏覽到 Plug-in Development > Target Platform。
圖 4. 指定目標平台
將 location 框的值改為解壓縮下載文件使用的目錄,然後單擊 Reload。
圖 5. 把目標平台設為 RAP
此操作將載入與 RAP 有關的插件並把目標平台從 RCP 切換為 RAP。您現在可以開始 修改備忘記事本,從而使用 RAP,詳見下一節。
從 RCP 遷移到 RAP
讓我們繼續看一看如何將備忘記事本示例從 RCP 遷移到 RAP。在此過程中,感覺一下 兩個環境之間的一些差異。
通過錯誤發現差異
您可能會注意到雖然已經切換了目標平台,但是 Eclipse 指出備忘記事本代碼中存在 錯誤。
圖 6. 切換到 RAP 後備忘記事本出現編譯器錯誤
導致這種情況的一個原因是由於現有項目照道理應該使用 RCP,但是通過切換目標, 您的構建路徑中現在缺少可以解析備忘記事本使用的一些元素的插件。其中一些插件在 RAP 中有對應的等效插件,而另一些沒有。因此您還必須完成一些小修改才能通過編譯。 此過程可以讓您洞察 RCP 與 RAP 之間的一些差異。
在 Dependencies 窗口中,高亮顯示 org.eclipse.ui 並單擊 Remove 將其從必備插 件列表中刪除。
圖 7. 刪除不需要的插件
在同樣的位置中,添加 RAP 中的等效插件。單擊 Add 並選擇 org.eclipse.rap.ui。
圖 8. 把 RAP 插件添加到項目中
您將看到僅此一項操作就可以解決許多編譯錯誤。讓我們逐個查看其余的錯誤。首先 ,編輯 PersonalTaskViewer.java。
圖 9. 編輯 PersonalTaskViewer.java 產生的錯誤
在 RCP 中,用默認的 no-args 構造函數可以創建 shell,但是 RAP 需要您在創建時 顯式指定不需要向 shell 中添加任何樣式或顯示。將代碼行 Shell shell = new Shell (); 改為 Shell shell = new Shell(SWT.NONE);。然後轉到 PersonalTaskViewer.java 中的下一個錯誤。
圖 10. 刪除 SWT.HIDE_SELECTION 屬性
SWT.HIDE_SELECTION 不存在於 RAP 的 SWT 實現中,因此只需刪除該引用。RAP 的 JFace 實現不支持 CellEditors,因此必須刪除對 CellEditor 的所有引用。只需在代碼 中搜索並刪除這些引用,例如在 createTableViewer 類中。
清單 1. 修改後沒有 CellEditor 引用的 createTableViewer 類
/**
* Create the TableViewer
*/
private void createTableViewer() {
tableViewer = new TableViewer(table);
tableViewer.setUseHashlookup(true);
tableViewer.setColumnProperties(columnNames);
tableViewer.setSorter(new PersonalTaskSorter (PersonalTaskSorter.TASK_DESC));
}
由於不再有 CellEditor,因此可以刪除 TaskCellModifer 類。轉到 Package Explorer,然後刪除 TaskCellModifier.java。
圖 11. 刪除 TaskCellModifier 類
在實現清單 1 和圖 11 中的更改後,應當可以解決編譯錯誤。下面總結了將 RCP 代 碼遷移到 RAP 這一過程中所作的更改:
組織 RAP 應用程序插件依賴關系。
查找編譯錯誤並用兼容的 API、常量等更正這些編譯錯誤。
修改或刪除 RAP 中目前不支持的功能(例如,CellEditors)。
定義入口點
RAP 啟用應用程序的方式不同於 RCP。RCP 將使用 IApplication 接口的實現;RAP 中的等效接口稱為 IEntryPoint。如名稱所示,RAP 將識別可以啟動應用程序的點,並且 一個應用程序可以有多個入口點(每個入口點都是通過惟一標識符來辨別的,這些標識符 都是作為用於啟動應用程序的 URL 中的參數傳遞的 — 例如, <host>:<port>/rap?startup=<entrypointname>)。
EntryPoint 表示 RAP 應用程序的主入口點。它可以與 SWT 應用程序中的 main() 方 法相比。EntryPoint 將在 WorkbenchAdvisor、Initial Perspective 和 ApplicationActionBarAdvisor 的輔助下創建 UI。
通過打開 plugin.xml 並選擇 Extensions 選項卡(參見圖 12),定義備忘記事本的 EntryPoint。入口點是作為擴展點添加到應用程序中的。Extensions 選項卡將顯示此插 件通過工作空間或目標平台中的其他插件增加的擴展列表。因此,可以把此擴展視為其他 插件所提供的接口的實現。
圖 12. 為 RAP 應用程序添加 EntryPoint
單擊 Add 以查看擴展點列表並查找 org.eclipse.rap.ui.entrypoint。
圖 13. 選擇 EntryPoint 擴展
單擊 Finish,然後您將看到 plugin.xml 中列出了 Extension Point Details。
圖 14. 設置 EntryPoint 屬性
該類屬性要求項目中實現 IEntryPoint 接口的 Java 類。您可以在 plugin.xml 編輯 器屏幕中創建一個這樣的 Java 類。把字段中的默認類名重命名為 POEntryPoint 並單擊 class 的超級鏈接。Eclipse 將打開 New Java Class 向導。
圖 15. 通過 New Java Class 向導創建 IEntryPoint 實現
該類向導將創建實現 IEntryPoint 的 POEntryPoint 類。該類將定義 RAP 應用程序 的基本生命周期。單擊 Finish 並編輯文件以查看其中包含的內容。
清單 2. IEntryPoint 實現
package com.devworks.tutorial.po;
import org.eclipse.rwt.lifecycle.IEntryPoint;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.application.WorkbenchAdvisor;
public class POEntryPoint implements IEntryPoint {
public POEntryPoint() {
}
public int createUI() {
Display display = PlatformUI.createDisplay();
WorkbenchAdvisor advisor = new ApplicationWorkbenchAdvisor ();
return PlatformUI.createAndRunWorkbench(display, advisor);
}
}
如名稱所示,createUI() 方法負責創建顯示和 WorkbenchAdvisor,並將這些內容傳 遞給 Workbench 來運行。
創建啟動配置
要從 Eclipse 內啟動應用程序,需要定義啟動配置以告訴 Eclipse 要在哪種環境中 運行。您可以在每次想要運行它時手動完成此操作,但是更方便的方法是創建啟動配置並 將其隨項目一起保存以供以後重用。
使用 Package Explorer,在 com.devworks.tutorial.po 下直接創建名為 launch 的 目錄。
圖 16. 創建 launch 目錄
在菜單欄中,選擇 Run > Run Configuration 並選擇 OSGi 框架。命名為 PO_RAP_OSGI(參見圖 17)。Equinox 的 OSGi 框架組件是符合 OSGi 核心框架 R4 規范 的完整實現。此外,OSGi 框架將生成啟動程序、引導結構和幫助在最終用戶生產場景中 使用 Equinox OSGi 的應用程序模型。由於 RAP 使用 OSGi 作為服務器端框架,因此需 要用 OSGi 框架啟動應用程序以確保該應用程序運行正常。
注:既可以用 OSGi Launcher 也可以用 RAP Launcher 啟動和測試該應用程序。RAP Launcher 基於 OSGI Launcher,並且添加了 Main 選項卡。通過 OSGi Launcher 在 Equinox 上運行應用程序將確保它也將通過 Equinox 在 servlet 容器中運行,這是我們 在本教程中這樣做的原因。
圖 17. 創建啟動配置