Rich Ajax Platform,第 2 部分: 開發應用程序基於 Eclipse 開發模式的 Web 2.0 |
|
Benjamin Muskalla ([email protected]), 軟件工程師, Innoopract Informationssysteme GmbH
2008 年 1 月 14 日
Rich Client Platform (RCP) 是一項用於構建企業應用程序的強大平臺技術。在 Rich Ajax Platform (RAP) 的幫助下,它將變得更有趣,因爲可以重用 Web 應用程序的現有代碼庫和開發技巧,如 “富客戶端平臺”系列的第 1 部分中所述。RAP 有一些值得注意的功能使 Web 開發更具吸引力。本文將超越 Hello World 示例,並說明一些關鍵概念以及如何使用 RAP 所提供的高級功能。
在開始研究新功能之前,我們希望大致介紹 RAP 的組織方法及其重要性。然後,我們將討論一些有趣的主題,如後臺作業、用戶界面 (UI) 自定義,並且將介紹更加高級的主題,例如自定義小部件和主題。如果這些討論超出了您所掌握的現有 RAP 知識,請返回到 第 1 部分 或查看 參考資料。
|
要高效地開發基於 RAP 的應用程序,在某些情況下您需要知道它的工作原理。我們不希望介紹過多內部機制讓您感到厭煩,但是必須說明一些基本概念來幫助您用 RAP 進行開發。下面的示意圖通過對比 RCP 的方式介紹了 RAP 組織方式。
圖 1. RCP 和 RAP 的對比
正如您所看到的,RAP 分爲兩部分。一方面,有運行在 Equinox(OSGi 規範的 Eclipse 實現)之上的服務器端 部分。而另一方面,有客戶機 部分,這部分是您在瀏覽器中看到的內容。兩端將交換事件,各自的 UI 將相應更新。這意味着大部分代碼在服務器上執行,而瘦客戶 端僅在必要時更新。這樣做的好處是可以運行乾淨的 Java™ 應用程序而無需在客戶機上安裝應用程序本身。
|
|
此部分的標題應該不會嚇到您,但是您必須瞭解它。如 第 1 部分 中所示,將 RCP 應用程序遷移到啓用 Web 的 RAP 副本中非常簡單。開發 RCP 應用程序時,通常的情況是一次將只有一個用戶使用該應用程序。相反地,運行在服務器上的 RAP 應用程序將由多個(或者上千)用戶同時使用。這種情況將導致重新思考 RAP 應用程序開發中的一些概念。一個有趣的方面是實現 單例(singleton) 模式的類的單例性。在所謂的 “應用程序範圍” 內,單例是惟一的。在 RAP 應用程序中存在幾個範圍:
- 應用程序範圍
- 應用程序範圍是適用於所有用戶的最大範圍。單例對於整個應用程序都是惟一的,並且因此存在於應用程序範圍內。這意味着應用程序的所有用戶都將使用單例的同一個實例。這可能非常有益,但如果實例保存一些用戶特定的信息,那麼也不總是一件好事。
- 會話範圍
- 會話範圍僅與當前用戶可用的當前用戶會話綁定。要實現一個僅綁定特定會話的單例,可以使用 RAP 提供的
SessionSingletonBase
類。通過擴展該類並覆蓋其getInstance
方法,該類將像單例一樣運行,但是僅可用於會話範圍內。
- 請求範圍
- 請求範圍是三個範圍中最小的範圍。只有在處理請求時它纔可用。大多數時間裏,此範圍實際上與普通開發人員無關(除非需要了解 RAP 的生命週期概念)。
|
RAP 最令人激動的功能之一是支持 Eclipse Jobs 框架。通過作業的幫助,可以在後臺運行需要長期運行的任務,而 UI 仍然可以做出響應。爲了瞭解其工作原理,我們將用一個安排作業的新操作來擴展第 1 部分中的郵件應用程序(參見清單 1)。
清單 1. 添加操作 (ApplicationActionBarAdvisor.java)
.... private Action progressAction; ... protected void makeActions(final IWorkbenchWindow window) { ... progressAction = new SampleProgressAction(); progressAction.setText("Count me!"); progressAction.setId("progress.action"); register(progressAction); } ... protected void fillCoolBar(ICoolBarManager coolBar) { ... toolbar.add(progressAction); } |
除了作業 API 之外,RAP 還提供了大家熟知的用於處理作業的 UI,我們稍後就會看到它。要在工作區中激活此功能,可以指示 Eclipse 顯示進度指示器(參見清單 2)。
清單 2. 啓用進度指示器 (ApplicationWorkbenchWindowAdvisor.java)
...
public void preWindowOpen() {
...
configurer.setShowProgressIndicator(true);
}
...
|
接下來是最有趣的部分:作業。我們的示例是一個簡單實現(參見清單 3),該實現只是把變量增加到一個特定數量並在完成每個步驟之後等待,以便查看 UI 中發生的情況。
清單 3. 作業 (SampleProgressAction.java)
package rap.mail; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.Action; public class SampleProgressAction extends Action { private static final int TASK_AMOUNT = 100; public void run() { Job job = new Job("Long Running Action:") { protected IStatus run(final IProgressMonitor monitor) { monitor.beginTask("Number counting", TASK_AMOUNT); for (int i = 0; i < TASK_AMOUNT; i++) { if (monitor.isCanceled()) { monitor.done(); return Status.CANCEL_STATUS; } int done = i % TASK_AMOUNT; monitor.subTask("work done: (" + done + "%)"); monitor.worked(1); try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } monitor.done(); return Status.OK_STATUS; } }; job.setName(job.getName() + " " + job.hashCode()); job.setUser(true); job.schedule(); } } |
在啓動應用程序並單擊 antion 後,將顯示一個新對話框,告訴我們當前運行的作業的進度。如果不需要等待作業完成,可以通過單擊 Run in background 把它隱藏起來。此外,還可以在狀態欄中單擊進度圖標打開進度視圖。如果同時有多個作業在運行,則可以在進度視圖中輕鬆地查看這些作業(參見圖 2)。
圖 2. 後臺作業
|
對於大多數基於 RCP 和基於 RAP 的應用程序,需要根據喜好標識 它們。標識是指修改應用程序的外觀以滿足您的目的,如符合現有企業標識。如果曾經開發過 RCP 應用程序,則有一個 .product
文件的概念可以幫助標識應用程序。由於 RAP 的目標是另一個平臺 (Web),因此需要做一些額外的工作來自定義應用程序。
圖 3. 帶有樣例標識的清單編輯器
正如您所見,自定義 RAP 應用程序的方法有很多種。
屬性 | 描述 |
---|---|
servletName | servletName 將定義應用程序可用於外部世界的 servlet 的名稱。這意味着應用程序的 URL 將顯示爲 http://<host><port>/<servletName> |
defaultEntrypointId | 在沒有 startup 參數的情況下訪問應用程序,通常有一個應當默認裝載的入口點,因此可以定義 defaultEntrypointId 。 |
themeId | 可以在這裏指定用於此標識的主題。需要爲 org.eclipse.rap.ui.themes 的擴展所定義的主題提供一個 ID。如果沒有 themeId ,則使用 RAP 標準主題。 |
title | 可以用此屬性自定義頁面標題 —— 在大多數瀏覽器中顯示爲窗口標題或者選項卡標題。 |
favicon | favicon 是顯示在瀏覽器地址欄中的圖標。這必須是一個有效的 .ico 文件 才能顯示在瀏覽器中。 |
body | 如果 RAP 索引頁面中需要使用一些自定義 (X)HTML 標記,則可以用生成的索引頁面的 body 標記中包括的 body 屬性來註冊一個有效的 (X)HTML 文件。 |
exitConfirmation | 如果非空,則 exitConfirmation 中的字符串將顯示給想要離開 RAP 應用程序的用戶。該屬性對於避免用戶意外關閉瀏覽器窗口/選項卡十分有用。 |
重新啓動帶有新標識的應用程序後,可以看到結果。
圖 4. 帶有標識的應用程序
|
RAP 應用程序的主題將定義用戶將看到的應用程序的界面外觀。請不要認爲它類似於 RCP 工作區中的主題支持,它更類似於常用操作系統對定義窗口、按鈕等外觀的支持。通常,RAP 主題允許定義:
- 自定義顏色
- 自定義字體
- 自定義邊界
- 自定義尺寸和框尺寸(填充等)
- 自定義圖片和圖標
不過,實際上可以自定義哪些方面取決於要定義主題的特殊控件。一些控件允許更大的靈活性,而其他控件需要硬連接。例如,默認界面外觀與自定義主題之間的差異可能如圖 5 所示。
圖 5. 運行的自定義主題
在 RAP 中,主題文件是簡單的 Java 屬性文件。可以在 RAP org.eclipse.rap.rwt 插件的 src/ 目錄中找到名爲 theme-template.properties 的模板。只需要指定與自定義相關的那些屬性(未定義的屬性將保留爲默認值)。查看下列清單以獲得屬性值的語法。下面是簡單主題文件的示例。
清單 4. 簡單主題文件
# Alternative Demo Theme # # Frame border for group boxes # default: 1 solid #aca899 group.frame.border: 2 dotted #56a0ea # Font for title bar of Shells # default: bold 11 "Segoe UI", Corbel, Calibri, Tahoma, "Lucida Sans Unicode", sans-serif shell.title.font: bold 15 "Trebuchet MS", Arial, Helvetica, sans-serif # Height of the title bar of Shells # default: 18 shell.title.height: 25 ... |
要使主題可用,必須用擴展點 org.eclipse.rap.swt.themes
註冊它。在應用程序項目的 plugin.xml 中,添加如清單 5 所示的擴展。
清單 5. 使主題可用
<extension point="org.eclipse.rap.swt.themes"> <theme id="org.eclipse.rap.dw.demotheme" name="Alternative Demo Theme" file="theme1/theme.properties" /> </extension> |
要激活主題,必須在標識中指定 themeId
。將其設置爲新創建主題的 ID:org.eclipse.rap.demo.alttheme
。重新啓動應用程序後,可以看到新樣式下的應用程序。
圖 6. 運行的自定義主題
|
|
最重要的是:RAP 中有兩種自定義小部件。可以通過組合現有小部件構成一個新的小部件來開發小部件,也可以開發真正自定義小部件(也稱爲自制 小部件。當談到混合小部件時,SWT (RCP) 與服務器端 (RAP) 沒有差別。在大多數時間裏,您都應當能夠在 RAP 應用程序中重用現有混合小部件。
更復雜的情況是創建一個真正自定義的小部件。用 RAP 開發小部件時,必須注意我們有兩個不同的運行時:服務器端 和客戶端 實現。在服務器上,小部件帶有自定義小部件用戶所使用的公共 API。在客戶機上,真正的實現是用 JavaScript 完成的。訣竅在於連接客戶機和服務器部分。RAP 提供了一種生命週期 內部概念,其中將考慮到所有小部件。生命週期負責初始化和小部件在客戶機與服務器之間的數據交換。實現自定義小部件略微超出本文的討論範圍,建議在 RAP 幫助文檔中瞭解關於自定義小部件的更多信息(請參閱 參考資料)。爲了進行說明,圖 7 顯示了 SWT 小部件中封裝的 Google Maps的屏幕快照,其訪問方式與所有其他小部件相同。
圖 7. Google Maps RAP 小部件
|
|
在 第 1 部分 中,我們瞭解了把現有 RCP 應用程序轉換爲實際的 Web 應用程序是多麼簡單。在本文中,瞭解了 RAP 是一項爲 Web 開發提供許多自定義功能的振奮人心的技術。通過使用強大的 Rich Client Platform (RCP)、服務器端和 Web 瀏覽器中的 Equinox,RAP 讓所有人都可以運行應用程序而無需配置。此外,RAP 還有一個吸引人的特性,它允許 Eclipse 開發人員重用現有技能和世界級工具來創建 Web 應用程序。最後,瞭解了 RAP 充分利用了桌面和 Web 瀏覽器的優點。
|
描述 | 名字 | 大小 | 下載方法 |
---|---|---|---|
樣例代碼 | os-eclipse-richajax2-mail-project.zip | 38KB | HTTP |
關於下載方法的信息 |
學習
- 您可以參閱本文在 developerWorks 全球站點上的 英文原文。
- 從閱讀 “Rich Ajax 平臺,第 1 部分:簡介” 開始獲得關於 RAP 的介紹性文章,瞭解如何設置 RAP 開發環境,並獲得一些演示和示例。
- 瞭解更多信息並下載 Rich Ajax Platform (RAP)。
- 查閱 Eclipse Foundation 的 RAP 維基 瞭解新功能和高級用例。
- 參閱 Eclipse Foundation 的 RAP Theming 維基 瞭解關於主題的更多信息。
- 閱讀 RAP 項目官方幫助文檔 以瞭解關於 RAP 的更多信息。
- 參閱 Eclipse Foundation 的 RAP 自定義小部件幫助文檔 以瞭解關於構建自定義小部件的更多信息。
- 查閱 Eclipse Corner 獲得關於 Eclipse Jobs API 的更多信息。
- 瀏覽 developerWorks 上的全部 Eclipse 文章和Eclipse 教程。
- 您是 Eclipse 新用戶?閱讀 developerWorks 文章 “Eclipse 平臺入門” 以瞭解它的起源和架構,以及如何用插件擴展 Eclipse。
- 查閱 IBM developerWorks 的 Eclipse 項目資源 擴展 Eclipse 技巧。
- 收聽針對軟件開發人員的有趣訪談和討論,一定要訪問 developerWorks podcast。
- 要獲得關於 Eclipse 平臺的介紹性文章,請參閱 “Eclipse 平臺入門”。
- 隨時關注 developerWorks 的 技術事件和網絡廣播。
- 查看免費的 developerWorks On demand demo 觀看並瞭解 IBM 及開源技術和產品功能。
- 查閱最近將在全球舉辦的面向 IBM 開放源碼開發人員的研討會、交易展覽、網絡廣播和其他 活動。
- 訪問 developerWorks 開放源碼專區,獲得豐富的 how-to 信息、工具和項目更新,幫助您用開放源碼技術進行開發,並與 IBM 產品結合使用。
獲得產品和技術
- 下載 IBM 產品評估版,並開始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的應用程序開發工具和中間件產品。
- 使用 IBM 試用軟件 改進您的下一個開發項目,這些軟件可以通過下載或從 DVD 中獲得。
討論
- Eclipse Platform 新聞組 應當是討論關於 Eclipse 的問題的第一站(選擇此鏈接將啓動默認的 Usenet 新聞閱讀器應用程序並打開 eclipse.platform)。
- Eclipse 新聞組 中有很多參考資料適用於對使用和擴展 Eclipse 感興趣的人員。
- 參與 developerWorks blog 並加入 developerWorks 社區。
Benjamin Muskalla 在位於卡爾斯魯厄的 Innoopract Informationssysteme 中擔任軟件開發人員兼顧問。他是富 Ajax 平臺 (RAP) 項目的提交者,主要負責工作區實現。他也是 Eclipse Platform 的積極貢獻者。 |