技術存在著一定的周期性。在經歷了一段由瘦客戶端統治的時期後,富客戶端技術開始了它的回歸。大量的組織正在將它們的應用程序構建成富客戶端,其中許多組織將其應用程序建立在RCP(Eclipse Rich Client Platform)的基礎上。術語富客戶端首先表明此應用程序為用戶提供豐富的體驗;其次,它還表明此應用程序是某台服務器的客戶端。雖然富客戶端並不必須具有對應的服務器組件,但是它們通常會有對應的服務器組件。
富客戶端在很多方面與胖客戶端類似。它們兩者都能為用戶帶來本地桌面體驗,並提供那些通過瘦客戶端技術很難、不方便或不可能交付的信息和功能。然而,富客戶端可提供更多好的特性。胖客戶端通常是一個難以部署和更新的大型單體應用程序,而富客戶端在體積上更為輕巧,並且是基於部署和更新相對容易的組件模型的。從歷史上來看,胖客戶端是特定於平台的;而當今的富客戶端技術發揮了底層平台的強大功能,同時隱藏了底層平台的細節,從而允許開發人員將精力集中於任務而不是各種特殊平台的特殊細節。
相對於胖客戶端,富客戶端還具有更好的可伸縮性。傳統上,胖客戶端直接與數據庫相連接。這樣就限制了胖客戶端的運行環境(防火牆可能會限制胖客戶端與數據庫之間的連接),同時應用程序的可伸縮性(客戶端與服務器之間的連接總數)也可能會受到數據庫的限制。富客戶端通常利用應用服務器,後者負責建立到數據庫的連接。這種配置非常靈活(防火牆友好的)並且具有高度的可伸縮性。當然,技術中並沒有必然限制胖客戶端與應用服務器進行通信的東西,只不過在胖客戶端技術流行的時候,應用服務器還沒出現罷了。
沒有規則規定富客戶端應用程序必須是某台對應服務器的客戶端。許多利用富客戶端技術的組織正在構建健壯、可擴展、可更新、本地化的獨立應用程序。同樣,雖然富客戶端通常利用應用服務器,但是並不存在要求必須這麼做的規則或技術限制。沒有理由說富客戶端應用程序不能直接訪問數據庫。
富客戶端技術代表了胖客戶端與瘦客戶端二者優勢的結合:豐富的用戶體驗、高可伸縮性、平台獨立,以及非常易於部署和更新。
Eclipse RCP是一項位於Eclipse平台核心的功能。大多數人想到Eclipse時,他們會想到Java集成開發環境(IDE)。如果您將Eclipse中關於IDE的內容剝去,剩下的就是一個提供基本工作台功能的核心,這些功能包括對可移動和可疊加的窗口組件(編輯器和視圖)、菜單、工具欄、按鈕、表格、樹形結構等等的支持。這個核心功能就是Eclipse RCP。
Eclipse RCP為應用程序開發人員提供了:
·應用程序和特性的一致且本地的外觀
·公共應用程序服務,例如窗口管理、更新管理、幫助和選擇管理
·本地的外觀,利用Windows、Mac OS X、Linux、Solaris、HP-UX、AIX和嵌入式設備上的實際平台窗口部件
·標准化的組件模型
·普及的可擴展性
·整合的更新機制
·頂級開發工具(Eclipse 軟件開發包(SDK)是世界級的軟件開發環境)
盡管使用這個術語事實上是不合適的,但Eclipse RCP仍可以被視為構建富客戶端應用程序的中間件。它提供應用程序所需的基礎設施,從而允許開發人員將精力集中於核心應用程序功能而不是細節。別再浪費時間了:立即使用Eclipse RCP吧。
組件
Eclipse RCP由許多組件構成,每個組件負責整個環境中相應部分的功能。事實上,Eclipse RCP幾乎所有的部分都是由組件構成的;除了少量的引導代碼,RCP的每一部分都是一個組件。在Eclipse世界中,組件更多時候是被稱為插件(或者在OSGI詞匯中被稱為包裹)。術語“插件”表明了這項組件功能在某種程度上屬於二級功能,或者它只是內置功能的一個附加物。但事實並非如此;Eclipse RCP對待所有的插件都是平等的,內置和定制插件之間並沒有明確的概念界限。您創建的用於實現應用程序行為的插件可與構成Eclipse RCP的插件一起運行。
通常,富客戶端應用程序的開發都是從單一插件開始的。在一個單獨的插件中,您可以為您的應用程序定義整個用戶界面、業務邏輯和對象模型。創建一個新的Eclipse RCP應用程序非常容易,您只需選擇菜單項File>New>Project...、選擇創建新的Plug-in Project(插件項目)、然後遵循出現的向導中的步驟。在向導的Content(內容)頁面上,對於問題“Would you like to create a rich client application?(您是否希望建立一個富客戶端應用程序?)”,記得選擇“Yes(是)”。圖1中顯示的是向導的Templates(模板)頁面;在這裡我們選擇創建“RCP application with a view(帶有視圖的RCP應用程序)”。
圖1. New Plug-in Project向導的Templates頁面
這將創建一個包含RCP應用程序所需部分的新插件,其中包括工作台(菜單欄和工具欄)設置和包含一個表格的單一視圖(參見圖2)。
圖2. 向導創建了一個具有全部功能的RCP應用程序
向導生成了以下類:
Application.java
生成的Application類包含一個單一方法,run(Object args),此方法負責運行應用程序(真奇怪)。這個方法引導並打開工作台窗口,當它退出時,應用程序將關閉。
ApplicationActionBarAdvisor.java
ApplicationActionBarAdvisor類負責構建菜單欄、工具欄和狀態行。這一生成的類會創建一個帶有單一File菜單(其中包含Exit項)的菜單欄。您可以利用fillCoolBar(ICoolBarManager coolBar)方法為您的工作台窗口添加一個工具欄。類似地,您也可以用fillStatusLine(IStatusLineManager statusLine)來為工作台窗口添加一個狀態行。
ApplicationWorkbenchAdvisor.java
ApplicationWorkbenchAdvisor類提供大量到應用程序生命周期的鉤子。例如,您可以添加程序啟動或關閉時調用的方法。生成的實現只是指定呈現給用戶的初始視圖。
ApplicationWorkbenchWindowAdvisor.java
和ApplicationWorkbenchAdvisor類似,ApplicationWorkbenchWindowAdvisor類提供到工作台生命周期的鉤子。您可以添加創建、打開、還原或關閉工作台窗口時調用的方法。生成的實現提供一個preWindowOpen()方法,此方法設置窗口的初始大小和標題,以及是否隱藏工具欄和狀態行(二者都是隱藏的)。
Perspective.java
Eclipse SDK提供了大量的視圖。生成的應用程序包括一個視圖;您可以根據要求指定額外的視圖。生成的視圖隱藏了編輯器區(即,編輯器在視圖中是隱藏的)並且會添加由向導生成的視圖。這種視圖被設置為固定的:它的視圖沒有熟悉的標題欄,而且不能移動。用戶可以通過將設置從false修改成true(和為應用程序添加一些新的視圖)來隨意調整視圖的位置。
View.java
生成的View類包含了一個帶有少量硬編碼條目的表格。您可以利用它來制定您的應用程序外觀。如果表格是您所需的,您可以通過將其與您的對象模型相連接來定制它,或者使用一個或多個窗口組件徹底替換掉它。
下一步我們將根據要求,通過更改或增加菜單、菜單項、工具欄、視圖,以及編輯器來修改生成的代碼。
進階
以這種方式構建應用程序可以使開發人員了解到很多基本功能。RCP不僅是一個窗口組件的集合,它還提供了一個用於管理應用程序用戶界面的系統,其中包括了更高等級概念的編輯和視圖(可以移動和疊加)、工具欄、菜單、選擇管理等等。但是用這種方式構建應用程序僅僅發揮了Eclipse的一小部分功能。這是一個進入Eclipse應用程序構建的不錯的開始;接下來的步驟自然就是構建真正的組件了。
插件是Eclipse平台的一項重要功能。實際上,Eclipse本身就是一個插件集;Eclipse中的大部分組件都是插件(除了一小部分引導代碼)。這使得Eclipse極具可擴展性。可以通過創建一個或多個插件(這些插件可由框架動態發現和安裝)的方式,將新功能添加進SDK。插件可被動態發現;添加插件時並不需要更新插件列表。
類似於Eclipse SDK,RCP應用程序也是一個插件的集合。插件的外形大小不一。如上面所說的,您可以用一個單一的插件建立整個Eclipse RCP應用程序並執行ECP全部的功能。或者您也可以將RCP應用程序建設成一個插件集,每一個插件都會執行程序的一部分功能。
將RCP應用程序構建成插件集有很多獲益,包括:
·延遲加載
Epclise只在需要的時候加載插件。如果您將您的程序分解成很多插件,您就可以縮短程序的啟動時間,改善它的內存占用率。在啟動時,只有初始化所需的插件子集會被加載,而不是整個應用程序;這將減少啟動所需的時間和內存。
·更新
Eclipse可根據需要更新單一插件。如果您的應用程序是由多重插件構成的,那麼更新時只需下載所需插件的那一部分進行安裝。這樣的話,就會減少應用程序更新的時間和所需的資源。
·擴展性
將一個應用程序分割成多重插件有利於程序今後的擴展性。
·重用
將應用程序建成一個組件集合,使得您有機會在其他程序中重用這些組件而無須修改代碼。
·更好的設計
使用多插件更利於設計。當您分割一個應用程序時,您會被迫去考慮一些類似於“我該如何去定義組件之間的接口”或“怎樣才能使它們之間的交流更便利”之類的重要問題。不幸的是,這並不保證您能得到一個偉大的設計,但它確實鼓勵您往這方面努力。
分割應用程序的一個普遍的方式是將您的領域業務邏輯和對象模型歸入一個插件,將您的用戶界面歸入另一個。這樣做的話,您可以有效地按照模型觀察控制器模式所列出的程序行來編寫您的程序。那就意味著,應用程序的業務邏輯(包含在其自身的插件裡)和用戶界面的細節互不干涉(理想狀態下,這就避免了任何用戶界面技術或語言的概念)。用戶界面代碼(觀察和控制層)由另一個插件來提供,從而不會牽涉到商戶邏輯的執行。業務邏輯插件從屬於用戶界面插件,後者會調用某些在業務邏輯中定義的模型。這種架構形式十分類似於Java EE應用程序:一個網絡模型(WAR文件)包含了小服務程序(控制器)和JSP(視圖);其他的JAR文件則包含了業務邏輯和對象模型。
Eclipse組件在這種架構模式下提供了極其出色的服務。通過加強可視化模型,Eclipse迫使開發人員不再願意把用戶界面代碼放入模型中(當然,真正的程序員可以解決這個問題)。商戶邏輯插件(或其他的插件)都從屬於用戶界面插件集:在視圖中可以看到模型,但反過來卻不行。通過鼓勵這種分割方式,代碼中的耦合度降低了,從而使代碼在修改過程中不再那麼脆弱而且代碼的重用率也提高了。
組件的集合
當您將您的應用程序代碼分割成多重插件之後,接下去的步驟就是將這些插件組合成一個整體,從而建立一個RCP應用程序。定義一個應用程序所需的插件集是產品配置的功能之一。產品配置中也包含了品牌信息,包括啟動畫面的位置、窗口圖標、介紹圖像和文本等。
將一個插件集合組裝成一個應用程序是一項簡單的工作。實際上,在這一步中,最大的挑戰就是如何品牌化應用程序從而使其更加美觀,作為品牌化過程的一步,您可以添加啟動畫面、窗口圖標、啟動圖標和介紹圖形。通過選擇菜單條目File>New>Product Configuration,您可以為您的應用程序創建一個產品配置。此向導如圖3所示。
圖3.“New Product Configuration(新產品配置)”向導
作為創建新的產品配置的一部分,您需要指定一個父插件項目。通常,就是這個插件定義了應用程序。創建初始配置的方法有三種:
·創建一個包括了基本設置的配置文件。選擇這一項後,將創建一個空配置文件,您必須自己完全配置它。
·使用一個現有的產品。選擇這一選項後,您將根據現有的產品配置中的值創建一個新配置文件。
·使用啟動配置。選擇這一選項後,初始配置是基於現有啟動配置中引用的插件集的。如果您先前是通過菜單中的Run As>Eclipse Application來運行您的程序,那麼您就可以使用這一選項。
您可以創建多個產品配置。例如,當基本程序需要通過所添加的可選插件來實現一些功能,那麼創建這些插件的配置就顯得很有必要。向導中的第二個選項旨在方便多個類似配置的創建。
在產品配置編輯器的Configuration(配置)選項卡上(參見圖4),您可以為應用程序所需的插件命名。
圖4. 產品配置編輯器的Configuration(配置)頁面。
插件列表需要包括所有應用程序自帶以及所需的插件。編輯器會幫助您為所需的插件分類。當您把應用程序的插件添加到插件列表後,單擊Add Required Plug-ins按鈕;這樣就會將您的插件所要參考的插件,以及那些插件所要調用的插件全部添加進了插件列表。這個集合會包含很多Eclipse平台本身的插件。使用這個按鍵時,您只要添加最上層的插件,隨後編輯器會自動搜索並添加與這些上層插件相關聯的插件。這一功能同樣可以使用在產品的配置上;事實上,使用更新系統就是為了使用新的功能。
啟動文件與那些負責啟動程序的可執行文件相關聯。在這一頁面上,您可以定義文件浏覽器中的圖標和名稱。Branding頁面負責品牌化應用程序(真奇怪)。其中包含了啟動畫面的識別、可選啟動進度條的位置、窗口圖標,以及關於對話。這些您所指定的信息將在導出項目時使用。
導出程序時,所有在配置頁面列出的插件會連同標記信息以及基本Eclipse配置一起被建立(如果需要的話)或復制到您的文件系統的目錄中。這個結合了Java Virtual Machine(JVM)的目錄就是您運行應用程序所需的全部。
運行程序並不需要對其進行導出;您可以在工作台中直接運行應用程序。對於測試配置和用調試器確定並解決問題,這是一個很棒的方法。在產品配置編輯器的全局頁面上,有兩個選項可以用來運行程序。這兩個選項是以超鏈接形式出現的:“運行產品”和“在調試模式中運行產品”,兩者分別在常規和調試模式中運行啟動配置。
建立平台
到目前為止,這場討論主要集中在一個由眾多定義非常明確的插件集構成的應用程序上。Eclipse的一個非常出色的功能就是它能夠動態地搜索和加載組件。這使得開發人員能夠去構建擴展性很強的應用程序。更進一步說,您可以將RCP應用程序構建成具有您自己的開放API的基礎平台。
在Contributing to Eclipse: Principles, Patterns, and Plug-Ins這本書中,作者們討論了一些有關於擴展性的規則。第一,開放規則指出,“只要有可能,就讓其他人服務於您的工作。”為了做到這一點,您可以定義您自己的擴展點集,使得其他開發人員能夠在您的應用程序上進行他們自己的創作。Eclipse的工作台大量使用了這一機制,每個開發人員都能添加他自己的視圖、編輯窗口、菜單入口等等。
想象RCP應用程序正在管理一張to-do列表。這個應用程序的核心功能提供了這項to-do任務的對象表達,以及可視化這張任務列表的能力。圖5顯示了列表的視覺表達。
圖5.To Do View
就其自身來說,這個應用程序已經夠吸引人的了。而更強大的功能是在我們將程序帶入擴展的空間後出現的。用硬編碼編寫應用程序來存儲任務信息會變得相對簡單。但除了硬編碼,您可能會開放您的應用程序以便讓其他的開發人員通過擴展點將他們的存儲系統與您的代碼相連。您的初始實現可以引導擴展點使其具有在本地數據庫存儲信息的能力。另一個開發人員可能會利用一項網絡服務或其他功能來擴展您的應用程序使得它能夠在遠程服務器上存儲信息。
想象一下您的應用程序是如何與桌面交互的。為應用程序提供對拖拽的支持相對簡單。但是從哪裡拖?在您的初始實現中,您可能會將文本從浏覽器中托拽入應用程序。如果您在應用程序中建立一個擴展點,您可以允許其他開發人員能夠擴展您的程序,使其能夠從諸如Microsoft Outlook或Mozilla Thunderbird之類的應用程序中進行拖拽。
通過建立一個擴展點,您使自己和其他開發人員能夠在不改變應用程序的基礎上對其進行擴展。利用擴展點動態地搜索可利用的擴展能使您的程序變得完全可制定。例如,也許讓應用程序能夠從Outlook中把程序包拖到Linux中沒有什麼意義;對此配置來說,您只需將那個支持Outlook的插件去掉即可。
當然,有效地利用擴展點機制需要不斷的實踐。
結束語
Eclipse RCP是一個用於構建富客戶端應用程序的功能強大的框架。直觀上,RCP將主機平台與本地外觀、窗口管理、可定制性(具有可疊加的編輯器和視圖)緊密整合在了一起。但這只是它的表面。位於RCP核心的是將功能和靈活性完全發揮的OSCI-兼容組件模型。當被請求時,RCP會動態地發現和加載這些組件;它們可以進行更新和擴展。
人們最終必將完全接受Eclipse RCP。一開始,您可能會把精力放在熟悉Eclipse RCP的界面上。隨著對組件模型的熟悉程度不斷加深,您會開始將代碼分割成多重插件。最終,當您掌握了基於多重擴展插件的領域平台開發後,Eclipse RCP真正的強大功能將展現在您的眼前。