程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Eclipse Ganymede進行桌面、Web和移動設備開發,第2部分(二)

使用Eclipse Ganymede進行桌面、Web和移動設備開發,第2部分(二)

編輯:關於JAVA

第2部分: 采用Ganymede進行富客戶機平台開發

在工作空間中選擇 com.devworks.tutorial.po 並單擊 Add Required Bundles。另外 ,單擊 Validate Bundles 以確保已經包括所需的一切內容。

已經配置的 OSGi 框架包括 Jetty 服務器。Jetty 是輕量級開源 Web 服務器和 servlet 容器,並且在從工作區內部署它時由 Eclipse 使用以啟動 RAP 應用程序。您可 以在 Arguments 選項卡中配置 Jetty 的啟動值。

圖 18. 設置 Jetty 實參

例如,在默認情況下,Jetty 將偵聽端口 9090。如果需要更改此端口值,您可以修改 將此端口更改為其他端口的 VM 實參。如果是在 OS X 上進行開發,請將 - Djava.awt.headless=true 添加到 VM 實參中。要保存此啟動配置,請選擇 Common 選項 卡,然後將 Shared file 值編輯為 directory com.devworks.tutorial.po/launch。單 擊 Apply,然後單擊 Run。通過設置共享文件,Eclipse 將在運行時保存配置。

圖 19. 運行啟動配置

當然,單擊 Run 也將啟動 Jetty 服務器並隨所選包一起啟動 OSGi 框架。您可以在 Eclipse 控制台中看到該活動。

圖 20. 查看環境啟動

備忘記事本應用程序現在在啟動配置中指定的端口上本地運行(在我們的示例中,我 們保留了默認值 9090)。浏覽到 http://localhost:9090/rap 並查看備忘記事本應用程 序的運行。

圖 21. 在浏覽器中運行備忘記事本

實質上,您到這裡尚未做任何代碼更改,因此可以看到您已經掌握的大部分 RCP 應用 程序開發知識適用於 RAP。但是,在不得不刪除對 CellEditor 的引用時失去了一些功能 ;在這個版本的備忘記事本中,您無法編輯任務詳細信息。

恢復編輯功能

由於 RAP 沒有單元編輯器,因此讓我們用對話框編輯任務詳細信息。在用戶雙擊任務 和添加新任務時,將調用該對話框。在編輯器中打開 PersonalTaskViewer.java 類並修 改 createTableViewer 方法。

清單 3. 替換 PersonalTaskViewer 類中的 CellEditor 功能

private void createTableViewer(final Composite composite) {
   tableViewer = new TableViewer(table);
   tableViewer.setUseHashlookup(true);
   tableViewer.setColumnProperties(columnNames);

   // Enable Task Editing by Invoking the PersonalTaskDialog
   tableViewer.addDoubleClickListener(new IDoubleClickListener() {
     public void doubleClick(DoubleClickEvent event) {
       if (tableViewer.getSelection() != null) {
         PersonalTask task = (PersonalTask)  ((IStructuredSelection)
tableViewer.getSelection()).getFirstElement();
         openPersonalTaskDialog(composite.getShell(), task,
POUtilities.DIALOG_MODE_EDIT);
       }
     }
   });
   // Set the default sorter for the viewer
   tableViewer.setSorter(new PersonalTaskSorter (PersonalTaskSorter.TASK_DESC));

只要用戶雙擊 Task,就可以從選擇中檢索該任務並傳遞給 PersonalTaskDialog,它 包含在本教程的源代碼中。

圖 22. 在任務備忘記事本中運行 CellEditor 替換

為 Add 按鈕的雙擊事件添加類似代碼,以便在用戶單擊 Add 時調用對話框。反過來 ,在 PersonalTaskDialog 類中對單擊 OK 按鈕的事件使用一個方法,更新或向 PersonalTaskModel 中添加任務。

清單 4. 向 PersonalTaskModel 中添加數據的 OKSelection 方法

public class OKSelection extends SelectionAdapter {
   public void widgetSelected(SelectionEvent e) {
     super.widgetSelected(e);
     personalTask = getModifiedTask();
     if (dialogMode.equals(POUtilities.DIALOG_MODE_EDIT)) {
       taskModel.taskChanged(personalTask);
     } else if (dialogMode.equals(POUtilities.DIALOG_MODE_NEW))
       taskModel.addTask(personalTask);
     }
     taskDialogShell.dispose();
   }
}

我們已經為全局常量、映像和 SWT Center 及 Pack 實用程序添加了新實用程序類 POUtilities。該類也包含在本教程的源代碼中。

您現在擁有一個全功能 RAP 應用程序,幾乎全部由為 RCP 編寫的代碼組成。在下一 節中,您將重構這段代碼,以便它擁有適用於 Web 的界面外觀。

為 Web 重構

只進行了少量的修改,您已經把 RCP 應用程序遷移到 RAP,但是外觀和感覺並不符合 您所需要的基於 Web 的應用程序的外觀和感覺。RAP 擁有自定義應用程序的機制:主題 化與標記。主題化基於層疊樣式表(Cascading Style Sheet,CSS)構建,用於自定義外 觀和感覺;而標記用於在浏覽器中自定義特定於應用程序的設置。

標記(Branding)任務備忘記事本

此時,任務備忘記事本是使用默認 URL 啟動的(http:localhost:9090/rap),該 URL 將不會告訴用戶關於正在運行的應用程序的任何信息。浏覽器中的標題(如圖 23 所 示)也是一個相當乏味的 RAP 啟動頁面。

圖 23. 查看 RAP 部署的默認值

標記化將允許您將這些值修改為對於應用程序更有意義的內容,並且還為用戶提供在 運行備忘記事本時關閉浏覽器情況下的處理機制。這種標記化類似於為 RCP 應用程序執 行的標記化,但是它將提供對於 Web 有用的額外屬性。

要標記備忘記事本,請打開 plugin.xml 並浏覽到 Extensions 選項卡。

圖 24. 添加標記擴展點

單擊 Add 並選擇 org.eclipse.rap.ui.branding。

圖 25. 選擇標記擴展點

單擊 Finish,然後系統將把標記擴展點添加到 plugin.xml 中。現在,您可以同樣設 置屬性窗格中的屬性,如圖 26 所示:

id: com.devworks.tutorial.po.branding此屬性將為擴展提供惟一 ID。 servletName: taskOrganizer允許用戶通過 localhost:9090/taskOrganizer 而不是 /rap 訪問應用程序。title: Personal Task Organizer在浏覽器中顯示為 Web 頁面的標 題(位於標題欄或者選項卡中)。favicon: icons/alt_window_16.gif可用作在 第 1 部 分 中完成的工作的一部分,但是如果在 .ico 文件中有您自己的標識,請使用該標識, 因為許多浏覽器僅接受 .ico 作為 favicon。exitConfirmation: Do you want to Exit Personal Task Organizer?在運行應用程序時,如果用戶關閉浏覽器或者浏覽到其他 URL ,將顯示在對話框中。

圖 26. 設置標記屬性

這將把清單 5 中的代碼添加到 plugin.xml 中。

清單 5. 通過標記 plugin.xml 添加屬性

<extension point="org.eclipse.rap.ui.branding">
   <branding defaultEntrypointId="com.devworks.tutorial.po.rapEntrypoint"
     exitConfirmation="Do you want to Exit Personal Task  Organizer ?"
     favicon="icons/alt_window_16.gif"
     id="com.devworks.tutorial.po.branding"
     servletName="taskOrganizer"
     title="Personal Task Organizer">
   </branding>
</extension>

保存文件,並重新啟動應用程序。您現在可以通過 localhost:9090/taskOrganizer 浏覽到該應用程序,並且您將看到標題現在與輸入內容相匹配。

圖 27. 查看正在運行的備忘記事本中的被標記屬性

根據浏覽器的不同,您可能還會看到 favicon 已經從默認值變為所選圖像。嘗試關閉 浏覽器。您應當會看到詢問是否確認要退出應用程序的對話框出現。

圖 28. 確認退出應用程序

您已經標記了應用程序。現在可以用 RAP 的主題化特性更改其界面外觀。

將備忘記事本主題化

主題化是基於 CSS 的,並且允許定義部件的顏色、字體、邊框、空白和圖像。部件自 身將定義哪些屬性是可以自定義的,其中一些屬性比其他屬性更加靈活。不幸的是,文檔 中沒有說明可以在哪些部件中設置哪些屬性,因此必須查看 RAP 源代碼,可以在位於 http:/www.eclipse.org/rap/cvs.php 的 CVS 站點獲得(可以在 Eclipse 中將這段源代 碼作為獨立項目導入)。在 org.eclipse.rap.rwt 包中查找名為 *.theme.xml 的文件。

圖 29. 查看主題化的 RAP 部件屬性

例如,菜單的主題列於 Menu.theme.xml 中,列表列於 List.theme.xml 中等等。這 些文件定義通過 CSS 可以為各自部件設置的主題屬性。對於備忘記事本,我們將把文本 、工具欄和表主題化。使用 Package Explorer,在主題的根目錄下直接創建目錄並命名 為 po_theme。在該目錄中,創建名為 po.css 的文件並添加以下 CSS 定義。

清單 6. 包含備忘記事本的主題化屬性的 po.css

/* Text */
Text[BORDER] {
  border: 1px solid #1080ee;
}

/* Toolbar */
ToolItem:hover {
  background-color: rgb( 200, 200, 200 );
}

/* Table */
TreeColumn:hover, TableColumn:hover {
  background-color: #8cc0ea;
}

您必須將此文件注冊為用於主題化的文件。打開 plugin.xml 並選擇 Extensions 選 項卡。單擊 Add 並選擇 org.eclipse.rap.ui.themes。

圖 30. 添加主題擴展點

單擊 Finish 把此擴展點添加到 plugin.xml 中。將文件屬性值編輯為指向 po_theme/po.css 文件。通過名稱屬性把此文件屬性命名為 Personal Task Organizer Theme 並將 ID 設為 com.devworks.tutorial.po.theme。

圖 31. 設置主題化屬性

這將注冊主題,但是必須激活該主題,方式是讓標記擴展點知道該主題。從擴展列表 中選擇 org.eclipse.rap.ui. 標記,並且在 themeId 的屬性中,輸入 Personal Task Organizer Theme 的 ID:com.devworks.tutorial.po.theme。

需要確保 Eclipse 在編譯時知道查找此文件的位置,因此浏覽到 plugin.xml Build 選項卡。在 Binary Build 目錄中,一定要選中 po_theme 框。

圖 32. 把 po_theme 添加到構建中

保存 plugin.xml 文件並浏覽應用程序以查看主題化結果。

圖 33. 查看主題化的備忘記事本

通過非常少的編碼和一些屬性更改,您已經將應用程序修改為可以使用通過 Web 部署 的附加特性。但是為了讓代碼可以在全世界使用,您不可以依賴 OSGi 框架的內置 Jetty 服務器。在下一節中,您將看到如何打包和部署應用程序以在 Eclipse 外部使用。

打包並部署到服務器中

現在您已經將備忘記事本修改為將其遷移到 RAP,並且已經調整了界面外觀以在 Web 中利用其部署,現在我們來看看如何用適用於 Web 部署的方法打包應用程序。在本節中 ,您將了解完成此操作的必需步驟。

擺脫 Eclipse

Jetty HTTP 服務器和 servlet 容器是在開發期間測試應用程序的便利工具,但是在 准備好部署到世界各地後,需要做一些准備以在創建的啟動配置中復制 Eclipse 為您完 成的操作。

需要把應用程序部署到 servlet 容器中。對於本示例,我們將使用非常流行的開源 Apache Tomcat,可以在 tomcat.apache.org 獲得。您可以使用這個 servlet 容器或其 他標准 servlet 容器,但是在開始本節前,一定要確保所需內容已安裝並正確配置,並 且您足夠熟悉如何在其中部署應用程序。

有一連串步驟需要遵循,並且要實現干淨利落的部署,必須正確完成每個步驟。

導入必備插件

首先,需要在備忘記事本部署中綁定一些必要的插件。要在現有 servlet 容器中啟動 應用程序,必須具有 ServlerBridge 插件。這些插件將在 servlet 容器中啟動 OSGi 框 架並支持 OSGi HTTP 服務、servlet 和 HTTP 擴展點。簡言之,ServletBridge 連接了 OSGi 框架與 servlet 容器。要獲得插件,您將從 Eclipse Web 站點導入項目定義文件 ,該文件將把必備插件添加到項目工作空間中。

將 http://www.eclipse.org/equinox/server/downloads/servletbridge-anon.psf 下載到計算機中的臨時位置。這剛巧會定義 OSGi 框架(這個 Eclipse 實現被稱為 Equinox — 因而是 URL 中的名稱)所需的所有插件,並且可以使用它讓 Eclipse 獲得 所需內容而無需手動輸入。

在菜單中,選擇 File > Import。在 Import 屏幕中,選擇 Team > Team Project Set,並單擊 Next。在文件名中輸入已下載的 servletbridge-anon.psf 文件的 位置和名稱,並單擊 Finish。

圖 34. 為必備插件導入 servletbridge-anon.psf 文件

這將把四個項目導入工作空間:

org.eclipse.equinox.servletbridge啟動框架並為框架提供綁定回 servlet 容器的 位置。org.eclipse.equinox.servletbridge.http綁定回 servlet 橋接並把請求委托給 servlet 容器以提供 OSGi HttpService。org.eclipse.equinox.http.servlet提供在初 始注冊 OSGi HttpService 時 http.servletbridge 所使用的 HttpServiceServlet。 org.eclipse.equinox.http.registry提供基於 OSGi HttpService 的 servlet、資源和 HTTP 上下文擴展點。javax.servlet標准 servlet API 的綁定版本。

在這些項目全部下載後,項目組織器將具有獨立構建和部署所需的一切,包括 RAP 源 代碼、自定義插件和 OSGi(aka Equinox)服務器代碼。

圖 35. 查看添加的包

創建部署腳本

可以用一系列 Ant 腳本和資源模板執行應用程序構建。由於總是使用這些資源,因此 最簡單的是從一個示例開始。查看 org.eclipse.rap.demo.feature 的結構。

圖 36. 查看現有構建結構

部署腳本和模板的目錄結構:

src\org.eclipse.rap.tools\ConfigIniCreator.java這將創建簡單 config.ini 文件 的內容。在 Ant 構建腳本(webappBuilder.xml 和 pde.exportFeatures)完成後運行此 文件,然後在構建中替換 config.ini 文件的內容。deployment\rapdemo.war這是最後要 部署的應用程序 WAR 文件。script\webappBuilder.xmlRAP 應用程序的 Web 應用程序構 建腳本,該應用程序將使用 equinox servlet 橋接以在 servlet 容器中運行。此腳本假 定 servlet 橋接項目在當前工作空間中可用。templates\WEB- INF\eclipse\configuration\config.ini用於識別需要啟動的關聯包的 Eclipse 運行時 配置文件。templates\WEB-INF\eclipse\launch.initemplates\WEB-INF\web.xml

從這裡把模板和腳本文件夾復制到 com.devworks.tutorial.po.feature 包中。

配置部署腳本

從 com.devworks.tutorial.po.feature 打開 feature.xml 並添加應當隨功能一起打 包的必備插件:

com.devworks.tutorial.po

com.ibm.icu

org.eclipse.core.commands

org.eclipse.core.contenttype

org.eclipse.core.databinding

org.eclipse.core.databinding.beans

org.eclipse.core.expressions

org.eclipse.core.jobs

org.eclipse.core.runtime

org.eclipse.equinox.app

org.eclipse.equinox.common

org.eclipse.equinox.http.registry

org.eclipse.equinox.http.servlet

org.eclipse.equinox.http.servletbridge

org.eclipse.equinox.preferences

org.eclipse.equinox.registry

org.eclipse.equinox.servletbridge

org.eclipse.osgi

org.eclipse.osgi.services

org.eclipse.rap.jface

org.eclipse.rap.jface.databinding

org.eclipse.rap.rwt

org.eclipse.rap.rwt.q07

org.eclipse.rap.ui

org.eclipse.rap.ui.forms

org.eclipse.rap.ui.views

org.eclipse.rap.ui.workbench

圖 37 顯示了將要添加的插件列表。

圖 37. 添加插件

打開 script 文件夾中的 webappBuilder.xml。此文件是在 templates 文件夾、目標 和 Eclipse 的 PDE 導出特性的幫助下構建的。必須把 servletbridge.dir 屬性更改為 下載並存儲該包的本地文件系統中的相應路徑(在本例中為 C:/temp/eclipse/workspace/org.eclipse.equinox.servletbridge)。還必須把 webapp.name 屬性的值改為在特性構建後顯示的文件夾。

圖 38. 設置 servletbridge.dir 屬性

保存文件。現在您已經准備好構建應用程序。

構建應用程序

在 Package Explorer 中,打開 webappBuilder.xml 的上下文菜單,並選擇 Run As > Ant Build。

圖 39. 構建插件

Eclipse 將顯示 Edit 配置和啟動窗口。命名為 Task Organizer,然後選擇 JRE 選 項卡。確保選中 “Run in the same JRE as the workspace” 單選按鈕。這將給工作空 間中的所有必備插件提供構建訪問。

單擊 Run,然後等待所有必備插件構建完畢。您可以通過控制台監視進度。

圖 40. 查看插件構建

在所有構建完成後,在 Package Explorer 中按 F5 鍵或在上下文菜單中選擇 Refresh 刷新 com.devworks.tutorial.po.feature 項目。現在將看到構建所創建的目錄 結構。

圖 41. 在 Package Explorer 中查看構建結果

Config.ini 包含在應用程序初始化期間載入的包。在部署前必須更新此文件。一種簡 單方法是運行 org.eclipse.rap.demo.feature 中附帶的 ConfigIniCreator.java 類。 打開此文件並編輯指向插件目錄的文件路徑以表示插件部署到的位置。在本例中,我們使 用 C:\temp\eclipse\workspace\com.devworks.tutorial.po.feature\build \PersonalTaskOrganizer\WEB-INF\eclipse\plugins。

圖 42. 修改助手類

在 Package Explorer 中打開此文件的上下文菜單並選擇 Run 以編譯並運行它。它將 在控制台中輸出所需配置。

圖 43. 助手類的輸出

在編輯器中打開 config.ini 文件並把內容從控制台復制到該文件中。一定要保存。 現在可以開始創建 WAR 文件以進行部署。

創建 WAR 文件

WAR 是 Web 歸檔文件(Web Archive),這是打包 Web 應用程序以輕松地部署到 servlet 容器中的簡潔方法。使用 Eclipse 可以輕松地將任何基於 Web 的應用程序打包 到 WAR 中,包括 RAP 應用程序。要創建備忘記事本的 WAR,請在 com.devworks.tutorial.po.feature 項目中選擇 WEB-INF 目錄並打開上下文菜單。選擇 Export > General > Archive File。

圖 44. 將應用程序打包為 WAR 文件

將文件命名為 po.war 並把它放在所選的臨時目錄中。確保選中整個 com.devworks.tutorial.po.feature 樹,並確保選中 Create only selected directories 單選按鈕,然後單擊 Finish。

您現在有一個名為 po.war 的自包含 WAR 文件,該文件適於在所選 servlet 容器中 部署。在下一節中,我們將展示如何在 Tomcat 中部署它。

在 Tomcat 中部署

在我們的配置中,Tomcat 將在 1234 端口上運行,可是它通常在 8080 端口上運行。 您可以使用內置 Tomcat 管理器部署 po.war 文件。浏覽到 http:localhost:1234/manager/html。

圖 45. 通過 Tomcat 管理器部署 WAR

在標有 “WAR file to deploy” 的部分中,輸入剛創建的 po.war 的路 徑和文件名並單擊 Deploy。在 Tomcat 完成部署 WAR 後,您可以通過浏覽到 localhost:1234/po/taskOrganizer 運行備忘記事本。

圖 46. 通過 Tomcat 運行 任務備忘記事本

您現 在已經成功地構建了獨立的任務備忘記事本,並在本地 servlet 容器中部署了它(只是 為了證明它是完全自立的,請關閉 Eclipse 並嘗試它)。

如果需要讓此應用程序 變為活動的應用程序,只需要把同一個 WAR 移到可以公開訪問的 Web 服務器中,但是請 記住:為了顯示 Ganymede 特性,我們已經簡化了此應用程序,因此目前在會話之間並未 存儲您的任務,但是有時候任務組織器也可以不必記錄昨天所做的工作。擁有完整的類桌 面功能的同一個應用程序可以在所有平台(Windows、Mac OS X 或 Linux®)和所有 品牌的浏覽器(Internet Explorer、Firefox、Safari 或 Opera)中順利地運行,您不 需要作出任何修改,並且用戶也不需要安裝任何特殊插件或下載軟件。

結束語

Eclipse IDE Ganymede 項目發行版包括令人興奮的 Rich Ajax Platform(RAP)技術,該技術允許使用您已經通過開發 RCP 桌面應用程序所掌握的技巧 構建和部署富 Internet 應用程序。這些 Internet 應用程序擁有桌面應用程序的所有功 能,但是使用了功能強大的分發模型和獨立於 Web 的平台。

RAP 是 RCP 的子集 ,因此必須把它下載並作為獨立目標平台安裝到 Eclipse 環境中。但是作為子集,它允 許利用使用 RCP 開發的現有應用程序,並且只需很少的修改,就可以把這些應用程序轉 換為 Web 應用程序。使用通用的業務邏輯代碼庫,您可以在項目的生命周期內輕松地維 護各個部署環境,而無需完全不同的 UI 邏輯。

通過利用標准部件工具包 (Standard Widget Toolkit,SWT)、JFace 和 Workbench,Eclipse RAP 將實現 RCP 與 Web 之間的連接。

您可以使用 Eclipse OSGi 實現(Equinox)及其內置 Jetty 服務器進行測試。但是對於部署,必須遵循一個過程才能構建打包為 WAR 且適於 部署到 servlet 容器中的獨立應用程序。

在這個 “使用 Eclipse Ganymede 進行桌面、Web 和移動設備開發” 系列教程的第 3 部分中,您將再次修 改備忘記事本以使用令人興奮的 Ganymede 的新 embedded Rich Client Platform(eRCP )項目為移動設備進行開發。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved