Rich Ajax Platform,第 2 部分: 開發應用程序(轉摘)

Rich Ajax Platform,第 2 部分: 開發應用程序

基於 Eclipse 開發模式的 Web 2.0

developerWorks
文檔選項
將打印機的版面設置成橫向打印模式

打印本頁

將此頁作爲電子郵件發送

將此頁作爲電子郵件發送

樣例代碼



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 部分 或查看 參考資料

請訪問 Ajax 技術資源中心,這是有關 Ajax 編程模型信息的一站式中心,包括很多文檔、教程、論壇、blog、wiki 和新聞。任何 Ajax 的新信息都能在這裏找到。

RSS 訂閱 Ajax 相關文章和教程的 RSS 提要

RAP 的架構

要高效地開發基於 RAP 的應用程序,在某些情況下您需要知道它的工作原理。我們不希望介紹過多內部機制讓您感到厭煩,但是必須說明一些基本概念來幫助您用 RAP 進行開發。下面的示意圖通過對比 RCP 的方式介紹了 RAP 組織方式。


圖 1. RCP 和 RAP 的對比
RCP 和 RAP 的對比

正如您所看到的,RAP 分爲兩部分。一方面,有運行在 Equinox(OSGi 規範的 Eclipse 實現)之上的服務器端 部分。而另一方面,有客戶機 部分,這部分是您在瀏覽器中看到的內容。兩端將交換事件,各自的 UI 將相應更新。這意味着大部分代碼在服務器上執行,而瘦客戶 端僅在必要時更新。這樣做的好處是可以運行乾淨的 Java™ 應用程序而無需在客戶機上安裝應用程序本身。





回頁首


RAP 不是 RCP

構造可以在兩種環境中運行的應用程序
即使 RAP 不是 RCP,也可以在 RAP 和 RCP 應用程序之間共享大量代碼。爲此,建議配置一個插件,將該插件用作包含可以在 RAP 和 RCP 中使用的 UI 代碼的基本插件。要完成此操作,建議使用 MANIFEST.MF 中的 Import-Package 來指定依賴性。這將允許您的基本插件使用來自 RAP 或 RCP 的包。您不會將自己與某個具體實現綁定起來。設置完基本插件後,建議多配置兩個插件,一個用於 RAP 專用的代碼,另一個用於 RCP 專用的代碼。最後,配置兩個工作區,其中一個設置 RAP 的目標平臺,另一個設置 RCP 的目標平臺。將來,我們希望隨着工具的演變,應用程序開發人員編寫在 RAP 和 RCP 中運行的代碼會變得更容易。

此部分的標題應該不會嚇到您,但是您必須瞭解它。如 第 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. 運行的自定義主題
運行的自定義主題





回頁首


自定義小部件

構造可以在兩種環境中運行的應用程序
Google Web Toolkit 和 RAP 十分類似,它們都允許您使用 Java 技術編寫富 Internet 應用程序。最大的差別是 GWT 運行在客戶機上,而 RAP 主要運行在服務器上。由於 RAP 運行在服務器上,因此它允許您通過 OSGi 訪問完整的 Java API 和使用著名的 Eclipse 插件模型。可以從 Eclipse 方面看待這種差別,GWT 類似一個獨立的 SWT 應用程序(只是一個小部件工具包),而 RAP 爲 Web 應用程序啓用了 RCP 樣式的方法。

最重要的是:RAP 中有兩種自定義小部件。可以通過組合現有小部件構成一個新的小部件來開發小部件,也可以開發真正自定義小部件(也稱爲自制 小部件。當談到混合小部件時,SWT (RCP) 與服務器端 (RAP) 沒有差別。在大多數時間裏,您都應當能夠在 RAP 應用程序中重用現有混合小部件。

更復雜的情況是創建一個真正自定義的小部件。用 RAP 開發小部件時,必須注意我們有兩個不同的運行時:服務器端客戶端 實現。在服務器上,小部件帶有自定義小部件用戶所使用的公共 API。在客戶機上,真正的實現是用 JavaScript 完成的。訣竅在於連接客戶機和服務器部分。RAP 提供了一種生命週期 內部概念,其中將考慮到所有小部件。生命週期負責初始化和小部件在客戶機與服務器之間的數據交換。實現自定義小部件略微超出本文的討論範圍,建議在 RAP 幫助文檔中瞭解關於自定義小部件的更多信息(請參閱 參考資料)。爲了進行說明,圖 7 顯示了 SWT 小部件中封裝的 Google Maps的屏幕快照,其訪問方式與所有其他小部件相同。


圖 7. Google Maps RAP 小部件
Google Maps RAP 小部件





回頁首


結束語

分享這篇文章……

digg 提交到 Digg
del.icio.us 發佈到 del.icio.us
Slashdot 提交到 Slashdot!

第 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
關於下載方法的信息


參考資料

學習

獲得產品和技術
  • 下載 IBM 產品評估版,並開始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的應用程序開發工具和中間件產品。

  • 使用 IBM 試用軟件 改進您的下一個開發項目,這些軟件可以通過下載或從 DVD 中獲得。

討論
  • Eclipse Platform 新聞組 應當是討論關於 Eclipse 的問題的第一站(選擇此鏈接將啓動默認的 Usenet 新聞閱讀器應用程序並打開 eclipse.platform)。

  • Eclipse 新聞組 中有很多參考資料適用於對使用和擴展 Eclipse 感興趣的人員。

  • 參與 developerWorks blog 並加入 developerWorks 社區。



關於作者

Benjamin Muskalla

Benjamin Muskalla 在位於卡爾斯魯厄的 Innoopract Informationssysteme 中擔任軟件開發人員兼顧問。他是富 Ajax 平臺 (RAP) 項目的提交者,主要負責工作區實現。他也是 Eclipse Platform 的積極貢獻者。


 
發佈了20 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章