程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 將Java Swing應用程序連接到Geronimo服務器

將Java Swing應用程序連接到Geronimo服務器

編輯:關於JAVA

創建可以與 Geronimo EJB 應用程序對話的獨立客戶端

簡介

本文將展示如何開發可以與運行在 Geronimo 應用服務器內部的 EJB 應用程 序通信的獨立(胖)客戶端。基於我的前兩篇文章 ——“將數據庫連接到 Geronimo 應用服務器的三種方法”(developerWorks,2005 年 6 月)和“利 用 Geronimo 深入 EJB Web 應用程序”(developerWorks,2005 年 7 月)— — 本文向您展示一個連接到使用 Geronimo EJB 應用程序構建的小型電話簿數 據庫的 Swing 客戶端。您將閱讀簡要的設計說明,然後閱讀有關運行該應用程 序所需的客戶端庫的信息。接下來我將介紹聯系服務器並對服務器上遠程無狀態 會話 bean 執行操作的方法。最後,您將學習如何開發、編譯並運行客戶端應用 程序,以及如何配置服務器以允許來自網絡中特定客戶端的安全訪問。

設計概述

首先簡要介紹一下示例應用程序設計 —— 一個描述電話簿客戶端應用程序 的統一建模語言 (Unified Modeling Language, UML) 部署圖 —— 如 圖 1 所 示。客戶端應用程序通過其 EJB 端口連接到 Geronimo,並與 PhoneBook Session EJB 對話以通過 PhoneBook Entry Container-Managed Persistence (CMP) 操作數據庫中的數據。

圖 1. 電話簿客戶端部署圖

Geronimo 的默認發行版對 EJB 端口有限制。僅當客戶端應用程序運行在同 一機器上並且通過環回地址(localhost 或 127.0.0.1) 連接時才能連接到該 端口。本文稍後的 配置 Geronimo 的 EJB 端口 一節提供了有關如何讓其他機 器上的客戶端訪問服務器的詳細信息。

用於連接到 Geronimo 的客戶端庫

要讓客戶端應用程序能夠連接到 Geronimo 的 EJB 端口並與 EJB 層通信, 客戶端類路徑中必須要有下列 Java 庫:

geronimo-spec-j2ee-1.4-rc4.jar

geronimo-kernel-1.0-SNAPSHOT.jar

geronimo-j2ee-1.0-SNAPSHOT.jar

geronimo-security-1.0-SNAPSHOT.jar

cglib-nodep-2.1.jar

openejb-core-2.0-SNAPSHOT.jar

從源代碼編譯 Geronimo 時,當您使用 Maven 構建腳本來編譯電話簿客戶端 應用程序時,這些庫被放置到本地 Maven 資源庫中且可供訪問。您可以在 project.xml 文件的依賴關系部分中查看所有這些庫位於 Maven 資源庫的哪個 位置。

其中一些庫在客戶端與服務器的通信中起著非常重要的作用。Geronimo 使用 CGLib 庫來執行動態代理生成。這使得服務器動態生成遠程調用服務器端組件的 代碼。如果在調試器中檢查客戶端上 InitialContext 對象的 lookup() 方法返 回的一個對象,可以看到動態生成的對象的類名包括 CGLib。geronimo-spec- j2ee.jar 文件包含所有的 Sun Java 2 Platform, Enterprise Edition (J2EE) 接口和類。沒有該文件,客戶端將無法理解任何動態代理實例。openejb- core.jar 文件是與服務器的 EJB 端口進行對話所必需的。用於在 Geronimo 服 務器中執行遠程目錄查詢的 Java Naming and Directory Interface (JNDI) 類 就在該 .jar 文件中。最後的三個 .jar 文件提供了其他支持類,比如與 Geronimo 對話的安全主體。

執行遠程會話本地查詢

客戶端通信部分的實現十分簡單。將客戶端連接到服務器時,Geronimo 與其 他任何 J2EE 服務器沒有任何不同,遵守健全的通過 JNDI 查詢和遠程方法調用 (RMI) 進行的通信標准。JNDI 查詢是獲得對遠程對象的引用的標准訪問。要通 過 JNDI 進行連接,必須使用大量特定於 Geronimo 的屬性來創建 InitialContext 實例,該實例用於執行查詢。 清單 1 展示了有關如何創建會 話的示例。

清單 1. 創建到 Geronimo 托管會話 bean 的遠程會話

import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public void Connect() {
    String hostName = getHostName();
   String port = getPort();
   Properties props = new Properties();
   props.setProperty ("java.naming.factory.initial",
          "org.openejb.client.RemoteInitialContextFactory");
    props.setProperty("java.naming.provider.url", hostName+":"+port);
   props.setProperty("java.naming.security.principal", "username");
   props.setProperty ("java.naming.security.credentials", "passwd");
   Context ic;
   try {
      ic = new InitialContext(props);
      PhoneBookSessionHome sessionHome = (PhoneBookSessionHome)
         PortableRemoteObject.narrow(
          ic.lookup(PhoneBookSessionHome.JNDI_NAME),
          PhoneBookSessionHome.class);
      phoneBookSession = sessionHome.create();
   } catch (Throwable ex) {
       ex.printStackTrace();
   } finally {
      if (ic != null) {
         ic.close();
      }
   }
}

如 清單 1 所示,創建了 Properties 對象並設置了四個屬性。第一個並且 是最重要的屬性是 java.naming.factory.initial 屬性,它必須設置為 org.openejb.client.RemoteInitialContextFactory。其他屬性指定提供者 URL 以及安全主體和憑證。提供者 URL 是用冒號隔開的主機名和端口。

前已提及,EJB 端口當前只接受從客戶端連接到 127.0.0.1 或 localhost 的連接。默認端口是 4201。盡管如此,主機名和端口都可以進行配置。有關詳 細信息,請參閱 配置 Geronimo 的 EJB 端口 一節。

創建好屬性之後,就可以創建並使用 InitialContext 實例了。通過將屬性 傳遞給構造函數完成這一操作。創建好實例之後,可以執行查詢。清單 1 包括 一行復雜的代碼,該行執行查詢並對結果執行 PortableRemoteObject.narrow() 。對於向用戶隱藏有關協議傳輸 —— RMI 或者可能是 Internet Inter-ORB Protocol (IIOP)—— 的詳細信息,這是必需的。完成之後,遠程會話就可供使 用了。在 清單 1 中,該行只創建了新 PhoneBookSession,並將其存儲在一個 字段中以供將來使用。

具有對遠程會話的引用之後,該引用可用於所有操縱電話簿數據庫信息的操 作。現在只需要一個應用程序來練習該遠程會話。

客戶端的設計和開發

現在我們來深入研究一個小 Swing 應用程序的設計和開發,這個小應用程序 用來浏覽、創建、刪除和修改電話簿數據庫條目。我盡量將 Swing 行話減到最 少,以防您比較熟悉的是另一種 GUI 技術,比如 Standard Widget Toolkit (SWT)。事實上,如果需要的話,應用程序架構已經使得將顯示從應用程序內部 邏輯分離出來並將其連接到另一種 GUI 技術變得非常容易。

應用程序架構如 圖 2 所示,這是一個詳細顯示應用程序靜態結構的 UML 類 圖。

圖 2. 客戶端應用程序的 UML 類圖

圖 2 中帶綠色陰影的類是主要的應用程序類。Main 類是包含菜單和拆分窗 格(其左側是 PhoneNumberListPanel,右側是 PhoneBookEditorPanel)的框架 。該菜單還允許用戶設置連接到哪個服務器的首選項,連接到服務器,並退出程 序。Application 類是一個單身類(singleton class),用作應用程序的所有 操作的控制器。它是惟一一個執行 EJB 操作的類,並保存對 PhoneBookSession 無狀態會話 bean 的引用。

橙色的兩個接口定義系統中的主要事件。每當 Application 決定電話號碼列 表需要更新時,就會激活 DataChangeEvent。PhoneNumberListModel 注冊該事 件。因為它是 PhoneNumberListPanel 中的主要數據模型列表視圖,所以列表是 通過模型更改來更新的。這與 Swing 應用程序的設計方法一致。

PhoneNumberListPanel 和 PhoneBookEditorPanel 類都實現 PhoneBookSelectionListener 接口並注冊來自 Application 單身類的事件。當 它們收到事件時,它們相應地更新當前的選擇。如果是 PhoneBookEditorPanel ,當前選擇導致 Name 和 Number 字段由來自當前選擇的電話簿條目中的數據填 充。

如果希望節省編寫用戶接口代碼的時間,通常可以在 Internet 上找到高質 量的免費工具。優秀的工具有 JGoodies Forms 1.0.5 和 FormLayoutMaker, FormLayoutMaker 是一個用於可視化創建窗體的小工具(參閱 參考資料 以獲得 到這些工具的鏈接)。FormLayoutMaker 工具生成代表 JGoodies 窗體布局約束 的 XML 文件。這些工具幫助我快速創建了 Phone Number 編輯面板和 Preferences 面板的窗體。

構建應用程序

編譯應用程序有兩種方法。我使用 Eclipse Visual Editor (VE) 插件 1.2 版本在 Eclipse 中開發了該應用程序。它生成應用程序的大部分代碼框架,但 它是以一種非入侵的方式完成的(沒有代碼標記和不可訪問的代碼塊),所以如 果沒有安裝 VE 的話也應該沒有問題。可以只加載項目並嘗試運行它。

您可能需要設置 MAVEN_REPO 構建變量以指向本地 Maven 資源庫。還需要構 建與本文一起提供的源代碼中包括的 Geronimo 和 PhoneBook 服務器應用程序 (參閱 下載)。這是因為,要編譯客戶端應用程序,包含服務器應用程序中 EJB 接口的 .jar 文件必須發布到本地 Maven 資源庫中。PhoneBook 的 Maven 構建腳本通過下列 Maven 構建腳本段完成該操作:

清單 2. Maven 構建腳本段

<goal name="client" prereqs="java:compile">
<ant:jar destfile="target/${pom.artifactId}- client.jar">
<fileset dir="target/classes">
<include name="**/*.class"/>
</fileset>
</ant:jar>
<artifact:install artifact="target/${pom.artifactId}- client.jar"
type="jar" project="${pom}"/>
</goal>

用於構建應用程序的第二種方法就是使用 Maven 。在 PhoneBook 目錄中解壓文件並運行 maven 命令。然後在 PhoneBookClient 目錄中進行相同操作。如果一切順利,就已經在目標子目錄中創建了 UberJar —— 一個包含運行客戶端所需的所有內容的 JAR 文件。

兩種構建方法運行得同樣好。使用 Maven 方法的優點是如果您尚未下載依賴 關系,則它會自動從 ibiblio Web 站點(參閱 參考資料)上的遠程 Maven 資 源庫中下載這些依賴關系。所以如果 Eclipse 中的依賴關系有問題,就在項目 上至少運行一次 Maven 來校正缺少的庫。

運行應用程序

確保 PhoneBook 服務器應用程序部署到 Geronimo 服務器中且正在運行。然 後鍵入下列命令:

java -jar phonebook-client-uber.jar

將會看到應用程序彈出,如 圖 3 所示。

圖 3. Geronimo 電話簿客戶端應用程序

首先,從 File 菜單中選擇 Connect。如果是連接到 localhost:4201 端口 ,則應該獲得一個連接;否則,控制台窗口將會顯示錯誤消息。可以通過選擇 Edit > Preferences、更改信息並嘗試重新連接來更改連接的服務器和端口 。一旦連接上之後,可以通過在電話號碼編輯器中鍵入姓名和號碼並單擊 Save 來創建新記錄。該記錄將顯示在姓名列表中。通過選擇條目並單擊 Delete 來刪 除條目。通過選擇條目、進行修改並單擊 Save 來更改條目。

配置 Geronimo 的 EJB 端口

當前,配置 Geronimo 的 EJB 端口的方法需要編輯 XML 文件,然後重新編 譯 Geronimo。Tom McQueeney 的大型 Geronimo Live blog 上的一篇短文清楚 介紹了如何使用 openejb\modules\assembly\src\plan\j2ee-server-plan.xml 文件更改 Geronimo Jetty 監聽端口的詳細信息(參閱 參考資料 以鏈接到該 blog)。同一文件還包含 EJB 端口的配置信息(參閱 清單 3)。

清單 3. j2ee-server-plan.xml 文件中的代碼段

<gbean name="EJBNetworkService"
class="org.openejb.server.StandardServiceStackGBean">
<attribute name="name">EJB</attribute>
<attribute name="port">4201</attribute>
<attribute name="address">127.0.0.1</attribute>
<attribute name="allowHosts">127.0.0.1</attribute>
<attribute name="logOnSuccess">HOST,NAME,THREADID,USERID</attribu te>
<attribute name="logOnFailure">HOST,NAME</attribute>
<reference name="Executor"><name>DefaultThreadPool</name> ;</reference>
<reference name="Server">
<gbean-name>openejb.server:name=EJBServer,*</gbean- name>
</reference>
</gbean>

您需要編輯 j2ee-server-plan.xml 文件並更改 allowHosts 屬性。 Geronimo 支持許多不同類型的地址。必須用下列模式之一輸入逗號分隔的地址 列表:

最後一格為 0 的 IP 地址。例如,192.168.10.0 允許 192.168.10 網絡上 的任何機器與服務器通信。

任何完全指定的 IP 地址。

分解的 IP 地址。 這是一種特殊模式,允許指定地址的網絡部分和以大括號擴住的主機地址列表。 例如,192.168.10.{5,6,7} 允許以下三個機器訪問服務器:192.168.10.5、 192.168.10.6 和 192.168.10.7。

網絡掩碼 IP 地址。這是網絡管理員熟悉 的一種地址。基於精確的位模式匹配規則(超出本文范圍),IP 地址與網絡掩 碼相匹配。例如,192.168.255.255 允許 192.168.* 網絡中的所有地址訪問服 務器。

准確的 IPv6 地址。當將來的 IP 網絡到來時,Geronimo 將准備好服 務,允許列出特定的 IP 地址。

網絡掩碼 IPv6 地址。

有關服務器接受的 特定模式的詳細信息,請咨詢源代碼文件 —— ServiceAccessController.java —— 位於來源的 openejb\modules\core\src\java\org\openejb\server 目錄 中。在此將會找到與支持的每個地址類型相匹配的明確的正則表達式。

對 j2ee-server-plan.xml 文件進行修改之後,重新編譯並更新服務器部署 ,您將具有一個專門滿足您需要的服務器。(如果只想查看針對同一機器上的服 務器運行的客戶端,則無需這樣做。默認情況下,Geronimo 被配置來完成這些 操作。)

結束語

本文提供了一個構建獨立(胖)客戶端的具體示例,該客戶端可以與運行在 Geronimo 應用服務器內部的 EJB 應用程序進行對話。Geronimo 團隊已經認真 實現了健全的標准,推廣用簡單的 JNDI 查詢方法獲得與無狀態會話 bean 的遠 程連接。如果只想讓簡單的應用程序運行,那麼這是一個好消息,因為它只需要 您編寫少量代碼。

按照我所介紹的模式,您能夠將許多比較大的數據庫連接到與 Geronimo 服 務器位於同一機器上的客戶端應用程序。使用本文提供的指示,您還能夠配置 Geronimo 服務器以允許從連接到您的網絡或 Internet 上的其他機器訪問服務 器 EJB 端口。不妨嘗試一下。

下載:http://www.ibm.com/developerworks/cn/opensource/os-ag- swing/

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