使用Eclipse 富客戶端平台和Rational Application Developer V6創建EJB 客戶端(二)
相關文章:
使用Eclipse富客戶端平台和RAD V6創建EJB客戶端(一)
使用 SWT 布局小窗口構建視圖
現在我們將要構建視圖。download file 中提供了 View 類。我們將會導入該類(裝載我們通過視圖模板生成的類)並且接下來檢驗代碼的相關部分。啟動之前,我們需要確定我們的插件所依賴的插件。在視圖中我們將會使用標准窗口小部件工具箱(SWT)布局小窗口,因此我們需要設置包括布局小窗口的 Eclipse 插件的相關性。
選擇 Dependencies 選項卡然後選擇 Add (圖 39)。定位 org.eclispe.ui.forms 插件。
圖 39. 相關性
導入 download file 中提供的 View 類,裝載所生成的類。在 src 文件夾下,右鍵單擊com.ibm.issw.temperature.form.views 包,然後選擇 Import (圖 40)。
圖 40. 導入視圖
選擇 File System 然後接下來選擇 Next。浏覽目錄 C:\RCPEJBClient\View ,並且將三個文件導入包中,如圖 41 所示。
圖 41. 導入文件系統資源
您應該獲得將要裝載現有類的警告。選擇 Yes To All (圖 42)。
圖 42. 裝載類警告
打開導入的 TemperatureView.java (圖 43)。
圖 43. 打開導入的視圖
我們將會集中於兩種方法(圖 44):
createPartControl(組合)—— 用於構建您的源自不同 SWT 小窗口的視圖。
handleEvent() —— 在 inner 類中,提供了當點擊 SWT 小窗口命令按鈕時調用的邏輯。
圖 44. Main 方法
createPartContol() 方法如清單 1 所示。代碼使用了 FormToolkit 類幫助關於父組件的創建組件;在該情況下,創建所需的標簽、按鈕、以及文本框,並且將偵聽器賦給按鈕。偵聽器是 View 的內部類。
清單 1
public void createPartControl(Composite parent)
{
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
form.setText(RcpMessages.getString("TemperatureView.Title"));
GridLayout layout = new GridLayout(2,false);
form.getBody().setLayout(layout);
Label label = toolkit.createLabel(form.getBody(),
"Enter temperature in Celsius: ");
Text textBox = toolkit.createText(form.getBody(), "", SWT.BORDER);
GridData gdText = new GridData(8);
textBox.setLayoutData(gdText);
Button button = toolkit.createButton(form.getBody(),
RcpMessages.getString("TemperatureView.Button"),
SWT.PUSH);
Label result = toolkit.createLabel(form.getBody(), "");
result.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
MyListener listener = new MyListener();
listener.setInput(textBox);
listener.setResult(result);
listener.setParent(parent);
listener.setFormToolkit(toolkit);
button.addListener(SWT.Selection,listener);
}
內部類的事件處理方法如清單 2 所示。在這一類中,讀取了文本框的值以及使用 EJB 客戶端 API 調用 EJB。代碼查找 EJB home 並且獲得遠程接口。接下來調用該方法並且用結果值填充結果標簽。(要記住,最好將 EJB 調用隱藏在業務委派之後而不是在插件代碼中直接調用。對本文來說,我們簡化了代碼。通常不推薦從 view 中直接調用 EJB。)
清單 2.
public void handleEvent(Event event)
{
try
{
InitialContext ctx = new InitialContext();
String jndi = RcpMessages.getString("TemperatureView.JNDIName");
Object obj = ctx.lookup(jndi);
TempConverterHome homeRef = (TempConverterHome) PortableRemoteObject
.narrow(obj, TempConverterHome.class);
TempConverter serviceRef = homeRef.create();
retVal = serviceRef.celciusToFarenheight(Integer.parseInt(textBox.getText()));
System.out.println("TemperatureAction.testEJB EJB Successful
Return=" + + retVal);
result.setText(textBox.getText() + " degrees Celsius is
approximately " +
Integer.toString(retVal) + " degrees Fahrenheit!");
} catch (Exception th)
{
System.out.println("TemperatureAction.testEJB EJB call ex="
+ th);
th.printStackTrace();
result.setText(th.getClass().getName() + ": " +
th.getMessage());
}
}
也許您已經注意到了屬性文件是用於避免 EJB JNDI 名稱的硬編碼以及應用程序服務器的定位。當部署 RCP 應用程序時,您可以將屬性文件改變為針對實際的遠程 EJB 定位。
清單 3
TemperatureView.JNDIName=ejb/TempConverter
TemperatureView.Title=Celsius to Fahrenheit Temperature Converter
TemperatureView.Button=Convert to Fahrenheit
當構建插件時,您通常需要將插件添加到您的 plug-in.xml文件並且選擇擴展點(在該情況下,您擴展了 View 插件)。對於我們來說這是額外的,因為我們在向導中使用 View 模板。您可以在 Extensions 選項卡中查看或者您可以浏覽 plug-in.xml 資源。擴展配置如清單 4 所示。
清單 4
<extension
point="org.eclipse.ui.views">
<category
name="Temperature Category"
id="com.ibm.issw.temperature.form">
</category>
<view
name="Temperature View"
icon="icons/sample.gif"
category="com.ibm.issw.temperature.form"
class="com.ibm.issw.temperature.form.views.TemperatureView"
id="com.ibm.issw.temperature.form.views.TemperatureView">
</view>
</extension>
創建您自己的 RCP 工作台和透視圖
因為我們正在開發 RCP 應用程序,使用缺省的 Eclipse 工作台,工作台是按照 IDE 定制的,不是很理想的。因此,我們將會構建我們自己的工作台以及透視圖。我們將會導入類,下載文件提供了這些類,導入到我們的插件中,接下來向工作台以及透視圖的 plug-in.xml 中添加條目。
右鍵單擊 src 文件夾然後選擇 Import (圖 45)。
圖 45. 導入類
選擇 File system 然後選擇 Next。浏覽 C:\RCPEJBClient\RCPCode\src 文件夾並且導入三個類,如圖 46 所示。
圖 46. 導入類
將類導入 (默認包),它是根(圖 47)。
圖 47. 導入類
讓我們檢驗這些類:
RcpWorkbenchAdvisor —— 用於創建我們的工作台。代碼設置了某種配置,例如大小和標題,並且禁用某種缺省項。
清單 5
public class RcpWorkbenchAdvisor extends WorkbenchAdvisor {
public String getInitialWindowPerspectiveId() {
return "MyRCPPerspective";
}
public void preWindowOpen(IWorkbenchWindowConfigurer configurer) {
super.preWindowOpen(configurer);
configurer.setInitialSize(new Point(750, 600));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Temperature Converter");
}
}
MyRCPPerspective —— 向透視圖中添加視圖。這是透視圖的初始布局。因為我們沒有構建文件編輯的插件所以代碼也禁用編輯器區域。
清單 6
public class MyRCPPerspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
layout.addView("com.ibm.issw.temperature.form.views.TemperatureView",
IPageLayout.LEFT,0.66f,IPageLayout.ID_EDITOR_AREA);;
layout.setEditorAreaVisible(false);
}
}
platform —— RCP 應用程序的主類。創建了工作台並且啟動了 RCP 應用程序。
清單 7
public class TempRCPApplication implements IPlatformRunnable {
public Object run(Object args) throws Exception {
WorkbenchAdvisor workbenchAdvisor = new RcpWorkbenchAdvisor();
Display display = PlatformUI.createDisplay();
try {
int returnCode = PlatformUI.createAndRunWorkbench(display,workbenchAdvisor);
if(returnCode == PlatformUI.RETURN_RESTART)
{
return IPlatformRunnable.EXIT_RESTART;
}
else
{
return IPlatformRunnable.EXIT_OK;
}
} finally {
display.dispose();
}
}
}
關於當前添加的代碼,我們需要將它添加到我們的 plug-in.xml 中去。選擇 Extension 選項卡,然後接下來選擇 Add (圖 48)。
圖 48. 添加擴展
因為我們在編寫應用程序,所以我們需要擴展 org.eclipse.core.runtime.applications(圖 49)。
圖 49. 添加擴展
選擇 Finish。
在 Extension Details 對話框中,添加作為標識的 RcpApplication (圖 50)。
圖 50. 添加擴展
右鍵單擊擴展點並且選擇 New => application (圖 51)。
圖 51. 添加擴展
右鍵單擊 (application) 然後選擇 New => run (圖 52)。
圖 52. 添加擴展
在 Extension Element Details 對話框中,浏覽 TempRCPApplication 類(圖 53)。.
圖 53. 擴展元素細節
添加透視圖、添加其它擴展並且選擇 org.eclipse.ui.perspectives 擴展點(圖 54)。
圖 54. 擴展點的選擇
右鍵單擊該點並且選擇 New => perspective (圖 55)。
圖 55. 添加擴展
在 Extension Element Details 中,如圖 56 所示浏覽 perspective 類:
圖 56. 擴展元素細節
更新標識以符合類名(圖 57):
圖 57. 擴展元素細節
現在擴展應該表現為圖 58 所示。通過選擇 File => Save 或 Ctrl-S 保存插件配置。
圖 58. 添加擴展
換句話說,您可以通過手動直接將它添加到 plug-in.xml 文件中,如清單 8 所示。附加的代碼如黑體字所示:
清單 8
<plug-in>
<extension
point="org.eclipse.ui.views">
<category
name="Temperature Category"
id="com.ibm.issw.temperature.form">
</category>
<view
name="Temperature View"
icon="icons/sample.gif"
category="com.ibm.issw.temperature.form"
class="com.ibm.issw.temperature.form.views.TemperatureView"
id="com.ibm.issw.temperature.form.views.TemperatureView">
</view>
</extension>
<extension
point="org.eclipse.core.runtime.applications">
<application>
<run class="TempRCPApplication"/>
</application>
</extension>
<extension
point="org.eclipse.ui.perspectives">
<perspective
class="MyRCPPerspective"
name="com.ibm.issw.temperature.form.perspective1"
id="MyRCPPerspective"/>
</extension>
</plug-in>
測試您的 RCP EJB 客戶端
現在我們已經為運行 RCP EJB 客戶端做好了准備。我們首先將會從 Application Developer 內部進行 RCP 應用程序的單元測試。接下來我們將會導出插件並且為在開發環境外部運行對其進行設置。
Application Developer 內部測試
關於 Eclipse 3.0 版本,您可以為了運行插件創建 launch configurations。這些 launch configuration 為了使用 WebSphere V6 JRE 需要進行設置(包括了 IBM Application Client for WebSphere Application Server 以及 WebSphere Application Server),通過 Perspective Preferences 進行添加。然而,不是使用 Eclipse,而是我們將會使用Application Developer,其中已經安裝了 JRE。
從 Application Developer 的主菜單中選擇 Run =>Run...。(圖 59)。
圖 59. 創建 launch configuration
在 Launch Configuration 向導中選擇 Run-time workbench 以及 New (圖 60)。
圖 60. 創建 launch configuration
為 MyRCPClient 配置命名。在 Program to Run 部分中,選擇您的插件,對於運行應用程序,選擇 com.ibm.issw.temperature.form.RcpApplication,對於 JRE,選擇 WebSphere v6 JRE(圖 61)。
圖 61. 創建 launch configuration
對於 VM arguments,通過 C:\RCPEJBClient\Snippet1.txt 所提供的代碼(清單 9)輸入如圖 61 所示代碼。還不能運行。VM arguments 是針對安裝 IBM Application Client for WebSphere Application Server 目錄。如果您將它安裝在不同的目錄下,是用那個目錄。否則,使用 Application Developer 中定位於 <Application Developer_INSTALL_ROOT>/runtimes/base_v6 的 WebSphere 實例。
清單 9
-Djava.naming.provider.url=corbaloc::localhost
-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
-Dserver.root=C:\WebSphere6ND\AppClient
-Dcom.ibm.CORBA.ConfigURL=file:C:\WebSphere6ND\AppClient/properties/sas.client.props
-Djava.ext.dirs="C:\WebSphere6ND\AppClient\java\jre\lib\ext;
C:\WebSphere6ND\AppClient\java\jre\lib;C:\WebSphere6ND\AppClient\classes;
C:\WebSphere6ND\AppClient\lib;C:\WebSphere6ND\AppClient\lib\ext;
C:\WebSphere6ND\AppClient\properties
在 Plug-in 選項卡上,我們需要包括我們的新插件所依賴的插件。我們能夠容易地通過遵循圖 62 所示的點擊順序完成這一內容。
圖 62. 插件的依賴關系
選擇 Apply,接下來選擇 Run。客戶端應該與圖 63 相似。
圖 63. 運行客戶端
輸入值,然後選擇 Convert to Farenheit。
應該顯示結果,與圖 64 相似。(首次引用將會比後來的引用花費更長的時間,因為它需要與 WebSphere Application Server 建立初始的通信。)
圖 64. 客戶端結果
構建並運行 Application Developer 外部的 RCP 應用程序
為了運行 Application Developer 外部的 RCP 應用程序,我們將會需要使用導出插件向導。在 Eclipse 3 版本中,不存在任何 RCP 應用程序的導出機制,但您可以使用二進制構建完成這一流程。出於教學的目的,我們將親自進行部署。
右鍵單擊插件項目並且選擇 Export (圖 65)。
圖 65. 導出插件項目
在 Export 對話框中(圖 66)選擇 deployable plug-ins and fragments,然後選擇 Next。
圖 66. 導出插件項目
從可部署的插件及片斷對話框中選擇我們的插件,選擇將其作為 directory structure 進行配置,接下來在目錄上對其進行配置如圖 67 所示。選擇 Finish。
圖 67. 導出插件項目
將要運行 PDE 導出向導(圖 69)。
圖 68. PDE 導出向導
我們需要 BAT 文件來啟動應用程序。為簡單起見,由 download file 中提供。將 BAT 文件從 C:\RCPEJBClient\MyRCPApp.bat 復制到您導出插件的目錄。
BAT 文件將會使用應用程序客戶端 JRE(假設 IBM Client for WebSphere Application Server位於 C:\WebSphere6ND\AppClient;否則,為了替換目錄通過針對應用程序客戶端更新初始的變量而更新腳本,或者針對 WebSphere Application Server 如果您不使用客戶端的話)。
(我們在測試關於 WebSphere Application Server Base 的 RCP 應用程序。如果,在生產中,您將會調用部署到集群的 EJB 應用程序,參數 Djava.naming.provider.url=corbaloc::localhost 應該擁有表示像這樣一個集群:corbaloc::<host1>:<port>,:<host2>:<port> 的 URL。)
清單 10
set WAS_CLIENT_HOME=C:\WebSphere6ND\AppClient
start %WAS_CLIENT_HOME%\java\jre\bin\javaw
-Djava.naming.provider.url=corbaloc::localhost
-Djava.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
-Dserver.root=%WAS_CLIENT_HOME%
-Dcom.ibm.CORBA.ConfigURL=file:%WAS_CLIENT_HOME%/properties/sas.client.props
-Djava.ext.dirs=%WAS_CLIENT_HOME%\java\jre\lib\ext;%WAS_CLIENT_HOME%\java\jre\lib;%WAS_CLIENT_HOME%\
classes;%WAS_CLIENT_HOME%\lib;%WAS_CLIENT_HOME%\lib\ext;%WAS_CLIENT_HOME%\properties
-cp startup.jar org.eclipse.core.launcher.Main
-application com.ibm.issw.temperature.form.RcpApplication
因為我們親自導出了插件,所以需要從我們的 Eclipse 安裝目錄復制 startup.jar 以及基礎插件。在 Application Developer 之中,基礎 Eclipse 定位到 Application Developer 安裝目錄下的 eclipse 目錄(圖 69)。
圖 69. 復制 startup.jar
粘貼 startup.jar 到配置插件的目錄。
圖 70. 粘貼 startup.jar
接下來,復制所需插件:
org.eclipse.core.expressions_3.0.0
org.eclipse.core.runtime_3.0.1
org.eclipse.help_3.0.0
org.eclipse.jface_3.0.0
org.eclipse.osgi_3.0.1
org.eclipse.platform_3.0.1.1
org.eclipse.swt.win32_3.0.1
org.eclipse.swt_3.0.1
org.eclipse.ui.forms_3.0.0
org.eclipse.ui.workbench_3.0.1.1
org.eclipse.ui_3.0.1
org.eclipse.update.configurator_3.0.0
記住,您可以使用二進制構建或腳本化 ANT 構建使該流程自動化。
圖 71. 復制所需插件
通過 MyRCPApp.bat 運行應用程序。(再一次,初始請求會比後來的請求花費更長的時間。)
圖 72. 運行客戶端
結束語
這篇文章描述了如何使用 Eclipse Rich Client Platform (RCP)構建 EJB 客戶端應用程序。Eclipse 平台包括了大量的窗口、視圖、框架(例如 Eclipse Modeling Framework),以及其它能夠用於構建強大客戶端應用程序的的擴展。了解如何使 Eclipse RCP 應用程序與 WebSphere Application Server 一體化對於構建一體化客戶端應用程序是必不可少的。
本文配套源碼