<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java Votary

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      48 隨筆 :: 1 文章 :: 80 評論 :: 0 Trackbacks

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

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

    developerWorks
    文檔選項
    將此頁作為電子郵件發送

    將此頁作為電子郵件發送

    未顯示需要 JavaScript 的文檔選項

    討論

    樣例代碼


    對此頁的評價

    幫助我們改進這些內容


    級別: 初級

    Neal Sanche , Java 開發人員, Pure Technologies

    2005 年 8 月 24 日

    在前兩篇 developerWorks 文章(參閱 參考資料) 中,作者 Neal Sanche 使用簡單的電話簿應用程序來展示如何將 Apache Geronimo 應用服務器連接到數據庫,以及如何使用 Geronimo 創建具有 Enterprise JavaBeans (EJB) 后端的基于 Struts 的 Web 應用程序。本文進一步使用電話簿應用程序來展示如何創建獨立客戶端應用程序以操作電話號碼數據庫。您還將學習如何配置 Geronimo 以允許來自特定客戶端的安全訪問。

    簡介

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

    要最有效地利用本文,您需要熟悉用于構建 Java 桌面應用程序的 Java Swing API 以及 Apache Maven 構建系統(參閱 參考資料 以鏈接到 Maven Web 站點)。



    回頁首


    設計概述

    首先簡要介紹一下示例應用程序設計 —— 一個描述電話簿客戶端應用程序的統一建模語言 (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
    對構建結構的備注

    因為對前面文章中代碼的構建結構進行了一些小的修改,所以本文的代碼包含了電話簿應用程序和電話簿客戶端應用程序。下載 包括了有關如何使用 Maven 構建這兩個應用程序的詳細說明。

    從源代碼編譯 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 類圖
    客戶端應用程序的 UML 類圖

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

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

    PhoneNumberListPanelPhoneBookEditorPanel 類都實現 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 電話簿客戶端應用程序
    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</attribute>
    <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 端口。不妨嘗試一下。




    回頁首


    下載

    描述名字大小 下載方法
    Source code for the phonebook applicationPhonebookClient.zip227 KB  FTP
    關于下載方法的信息獲取 Adobe? Reader?


    回頁首


    參考資料



    回頁首


    關于作者

    作者照片

    Neal Sanche 是一位最近才涉足 Microsoft? .NET 世界的 Java 開發人員,他正在克服困難脫離他原來習慣了的開發環境。他的經驗包括開發多個商業 J2EE 應用程序和多個獨立 Java 應用程序。在業余時間,他作曲、攝影并撰寫技術文章。訪問他的 Web 站點 可以看到相應的多個示例。您可以通過 neal@nsdev.org 與 Neal 聯系。

    posted on 2005-12-09 23:22 Dion 閱讀(1246) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 国产日韩AV免费无码一区二区| 日韩亚洲精品福利| aa毛片免费全部播放完整| 亚洲av无码电影网| 亚洲伦理一区二区| 久久影视国产亚洲| 国产亚洲福利一区二区免费看| aⅴ在线免费观看| 在线涩涩免费观看国产精品 | 色www免费视频| 国产午夜亚洲精品国产| 亚洲综合精品一二三区在线| 国产亚洲大尺度无码无码专线 | 亚洲色中文字幕在线播放| 亚洲综合一区二区精品导航| 久久精品国产亚洲Aⅴ蜜臀色欲| 免费观看大片毛片| 久久精品免费全国观看国产| 免费国产污网站在线观看15| 免费无码又爽又刺激网站| 一个人看的在线免费视频| 特级毛片aaaa级毛片免费| 亚洲国产精品成人综合色在线| 亚洲香蕉久久一区二区| 亚洲神级电影国语版| 日木av无码专区亚洲av毛片| 亚洲AV综合色区无码一区爱AV | 亚洲美国产亚洲AV| 亚洲一区二区三区乱码在线欧洲| 亚洲视频小说图片| 中文字幕亚洲免费无线观看日本| 国产精品国产亚洲精品看不卡| 亚洲中文字幕久久精品无码喷水 | 亚洲a无码综合a国产av中文| 亚洲精品av无码喷奶水糖心| 亚洲性无码一区二区三区| 亚洲色无码国产精品网站可下载| 国产成人精品日本亚洲专| 亚洲偷自拍另类图片二区| 亚洲第一成年网站视频 | 日韩a级毛片免费视频|