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

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

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

    Luben Park

    Java Ben 成長之路

    Java 技巧 101:applet 間通信的替代方法

    作者 Tobias Hill



    摘要
    您可能認為能讓 applet 彼此通信的唯一選擇就是使用 getApplet。不幸的是,getApplet 方法僅返回與發出調用的 applet 在同一個 HTML 頁面上的 applet,這樣就限制了您通過 applet 間的通信構建有趣界面的方式。這篇技巧說明的替代方法能使處于不同框架甚至不同瀏覽器窗口中的 applet 彼此調用對方的方法。

    java.applet 包中的 AppletContext 類包含兩個成員方法,即 getApplet 和 getApplets。通過使用這兩個方法,一個 applet 就可以找到其他 applet 并調用它們的方法。要這樣做必須滿足下面的安全要求:

  • 這些 applet 來自同一個服務器上的同一個目錄中。
  • 這些 applet 運行于同一個瀏覽器窗口中的同一個頁面上。

    這樣設計安全限制可能有很好的原因;但是,后一個要求限制了利用 applet 間的通信制作有趣的多 applet 界面的方式。

    試考慮這樣一種情況:

    您剛編好一個很好的股票市場交易 applet,并決定為它編寫一個良好的幫助系統。您希望幫助系統也是一個 applet,并希望將它與股票市場交易 applet 在不同的瀏覽器框架中運行。您作出這個決定可能是出于網站結構方面的考慮,也可能是出于始終顯示幫助系統的需要。另外,您希望使幫助系統根據用戶當前在股票交易 applet 中進行的操作轉至正確的信息/指導(就像 Microsoft Office 套件中的“回形針”一樣)。您甚至計劃在幫助系統中編制向導,這些向導可遠程指出問題,并可遠程執行股票市場交易 applet 中的任務。

    這一方案中體現的思想很不錯。但是,因為這兩個 applet 處于不同的頁面上,所以 AppletContext 中的 Java API 無法幫助您實現這個想法 -- 但這篇技巧可以幫助您。


    使用 AppletContext API

    在說明 applet 間通信的替代機制前,我將首先簡要說明一下 getApplet 和 getApplets 這兩個方法是如何工作的。一個 applet 通過使用 getApplet 方法可以按名稱找到同一個 HMTL 頁面中的另一個 applet,而通過使用 getApplets 方法可以找到同一個頁面上的所有 applet。這兩個方法如果成功執行,則會向調用者返回一個或多個 Applet 對象。調用者一旦找到一個 Applet 對象,它就可能調用這個 Applet 的公用方法。

    假定有下面這樣一段 HTML 代碼:
    PHP代碼:
    <applet code="Applet1" width="400" height="100" name="app1">
    </
    applet>

    <
    applet code="Applet2" width="400" height="100" name="app2">
    </
    applet>

    通過使用 applet 標記中的 name 屬性,您就可以用下面的方式引用一個特定的 applet:
    PHP代碼:
    Applet theOtherApplet = getApplet("app1");
    theOtherApplet.anyMethod(); //調用任一個公用方法

    或者,您也可以用以下的代碼來檢索這個頁面上的所有 applet:
    PHP代碼:
    Enumeration allAppletsOnSamePage = getApplets();
    while(
    allAppletsOnSamePage.hasMoreElements()) {
    Applet appl = (Applet) allAppletsOnSamePage.nextElement();
    appl.anyMethod(); //調用任一個公用方法
    }

    當發出調用的 applet 在它所在的同一個 HTML 頁面上檢索到一個或幾個 applet 之后,它就可以調用這些 applet 的公用方法。

    使用靜態數據結構

    不幸的是,如果使用標準方法,則只能與同一個 HTML 頁面中的 applet 通信。幸運的是,您很容易就可以避開這個限制。使 applet 間跨頁面通信的方法基于這樣一個事實,即如果兩個 applet 的 codebase 相同,則即使它們是在不同的瀏覽器窗口中被加載的,它們也共享同一個運行時環境。粗略地說,codebase 就是從中加載 applet 的那個目錄。請參閱文后的參考資源,其中有一個鏈接指向有關 codebase 的一篇教程。

    由于運行時環境是共享的,因此所有 applet 實例都可以訪問靜態域和靜態結構,這樣這些靜態域和結構就可用來在不同 applet 之間傳遞信息。

    applet 不僅可以存儲諸如整數、字符和字符串這樣的簡單數據類型,而且每個 applet 都可以將其自身(實例)的一個引用存儲在一個靜態域(可能在它自己的類中)中。任何 applet 都可以訪問這個域,從而獲得指向這個實例的引用。

    這聽起來復雜嗎?不,一點也不復雜。我首先舉一個簡單的例子。假定您的一個 applet (AppletA.class) 在一個框架中,而另一個 applet (AppletB.class) 在另一個框架中,而且這兩個 applet 都是從同一個 codebase 加載的。

    您現在希望授予 AppletA 訪問 AppletB 的公用方法的權限。您必須讓 AppletB 將其自身的一個引用存儲在一個靜態公用域中,就像下面這樣:
    PHP代碼:
    public class AppletB {
    public static
    AppletB selfRef = null; // 初始歸零

    public void init() {
    // 生成對該實例的引用
    selfRef = this;
    }
    ...
    }

    現在您就可以從 AppletA 訪問 AppletB 的實例了:
    PHP代碼:
    public class AppletA {
    AppletB theOtherApplet = null;

    public
    void callAppletB() {
    // 獲取靜態域,其中存儲著指向 AppletB 的
    // 實例的指針。
    theOtherApplet = AppletB.selfRef;

    // 此后就可以調用實例方法了,
    // 如下所示...
    theOtherApplet.repaint();
    }
    ...
    }

    這就是我們所要做的全部工作。因為運行時環境是由不同的 applet 共享的,所以即便 applet 不在同一個頁面上,這個方法同樣奏效。

    值得注意的一點是,上面的代碼并沒有處理在啟動 AppletB 之前就調用 AppletA 中的 callAppletB 方法的情況。如果發生這種情況,則 selfRef 將是 null,這樣不能進行任何通信。

    一種更通用的方法

    當然,還有一種更通用的方法。您可以創建這樣一個類,創建它的唯一目的就是在靜態數據結構中存儲 applet 的引用。稍后您將看到的 AppletList 類就屬于這種情況。希望其他 applet 訪問自己的公用方法的 applet 實例通過 AppletList 將自己注冊。按照 AppletContext.getApplet(string name) 中的模式,每個注冊項都與一個字符串相關聯。當一個 applet 調用某個 applet 的引用時,這個字符串就起關鍵字的作用。

    通常,applet 是按下面的方式注冊的:
    PHP代碼:
    public class AppletA {
    public
    void start() {
    AppletList.register("Stock-trade-applet", this);
    ...
    }
    }

    另一個 applet 獲取對它的訪問權:
    PHP代碼:
    public class AppletB {
    public
    void run() {
    AppletA tradeApplet =
    (
    AppletA) AppletList.getApplet("Stock-trade-applet");
    ...
    }
    }

    當該 applet 停止運行時,您必須緊記在 AppletList 中撤銷注冊:
    PHP代碼:
    public void stop() {
    AppletList.remove("Stock-trade-applet");
    ...
    }

    AppletList 類的完整源代碼如下所示:
    PHP代碼:
    0: import java.util.*;
    1: import java.applet.Applet;
    2:
    3: public class AppletList {
    4: private static Hashtable applets = new Hashtable();
    5:
    6: public static void register(String name, Applet applet) {
    7: applets.put(name,applet);
    8: }
    9:
    10: public static void remove(String name) {
    11: applets.remove(name);
    12: }
    13:
    14: public static Applet getApplet(String name) {
    15: return (Applet) applets.get(name);
    16: }
    17:
    18: public static Enumeration getApplets() {
    19: return applets.elements();
    20: }
    21:
    22: public static int size() {
    23: return applets.size();
    24: }
    25: }

    要獲得說明如何使用這個類的示例,請在參考資源中下載 exampleCode.zip。

    局限性

    正如我在前面提到的那樣,必須從同一個 codebase 中加載這些 applet。此外,如果瀏覽器的兩個不同副本正在運行,并且 applet 被加載到每個副本中,則 applet 可能無法彼此通信(取決于瀏覽器的版本和設置),因為它們可能不再共享同一個運行時環境。但是,如果是瀏覽器本身衍生出新的瀏覽器窗口,則沒有任何問題。

    該技巧已在幾個平臺和幾個瀏覽器版本中通過測試,但在某些配置中每個 applet 的運行時環境可能是獨立的。該技巧已在下面的操作系統和瀏覽器組合中通過測試:
  • Windows2000: Internet Explorer 5.0,Internet Explorer 5.5,Netscape Navigator 4.72,Opera 4.01
  • Windows 98: Internet Explorer 4.72,Internet Explorer 5.0,Netscape Navigator 4.02
  • Mac OS 9: Internet Explorer 4.5,
  • Netscape Navigator 4.5
    Red Hat 6.2: Netscape Navigator 4.73

    小結

    這篇技巧說明了能使 applet 彼此通信的一種替代方法。這種方法以 Java API 的 getApplet() 方法不支持的方式工作。這篇技巧中介紹的知識增大了將 applet 作為網站或內部網的一部分的可能性 -- 可以用它替代或補充 getApplets 方法。

    作者簡介

    Tobias Hill 是 Citerus 的創辦者之一,該公司以瑞典為基地,致力于在 Java 平臺上構建因特網、內部網和外部網系統。Hill 從 1996 年開始用 Java 編程,參與了許多項目,從為自主控制的機器人編程到開發在線焰火明信片制作程序等等。

    參考資源

    * 說明如何使用 AppletList 類的示例:
    exampleCode.zip
    * Sun 提供的關于 applet 間通信的 Java 教程:
    http://web2.java.sun.com/docs/books...tsonly/iac.html
    * Sun 提供的有關 codebase(在其他問題中)的 Java 教程:
    http://web2.java.sun.com/docs/books...sonly/html.html
    * 查看以前的所有 Java 技巧以及提交您自己的技巧:
    http://www.javaworld.com/javatips/j...tips.index.html
  • posted on 2005-12-23 17:06 Ben 閱讀(371) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 一级毛片一级毛片免费毛片| 亚洲综合自拍成人| 香蕉蕉亚亚洲aav综合| 亚洲 自拍 另类小说综合图区| 免费视频成人国产精品网站 | 国内外成人免费视频| 无码人妻一区二区三区免费| 免费人成在线视频| 四虎成人免费大片在线| 手机看片久久国产免费| 免费va人成视频网站全| 亚洲午夜福利精品无码| 国产片AV片永久免费观看| 一级特黄a大片免费| eeuss在线兵区免费观看| 亚洲人成网站999久久久综合| 亚洲自偷自偷在线成人网站传媒| 亚洲日本在线看片| 亚洲精品亚洲人成在线麻豆| 亚洲卡一卡二卡乱码新区| 亚洲高清一区二区三区电影 | 在线免费不卡视频| 国产精品久久久久影院免费| 无码不卡亚洲成?人片| 色噜噜AV亚洲色一区二区| 亚洲国产综合91精品麻豆| 亚洲人成网站在线观看播放青青 | 99在线视频免费观看视频 | 最近免费中文在线视频| 国产精品无码永久免费888| A级毛片高清免费视频在线播放| 久久aa毛片免费播放嗯啊| 国产精品免费一区二区三区| 免费看黄的成人APP| 欧洲一级毛片免费| 国产免费人成视频在线观看 | 大地资源在线观看免费高清| 无码不卡亚洲成?人片| 亚洲天天做日日做天天欢毛片| 亚洲最大无码中文字幕| 成人免费夜片在线观看|