首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

跨框架與瀏覽器視窗的 Java Applet 通訊實作方案

     編輯:Java 相關知識

問題背景:標準 API 的侷限性

Java AppletContext 提供的 getApplet() 與 getApplets() 僅能存取「同一 HTML 頁面」上的 Applet。若需跨框架、跨視窗通訊(如股票交易 Applet 與獨立幫助系統 Applet 協作),標準 API 無能為力。

核心突破點:共享執行環境

關鍵發現:同一 Codebase 載入的所有 Applet 共享同一 JVM 執行環境,因此可透過 static 欄位交換物件參考,實現跨頁面、跨視窗通訊。

方案一:簡單靜態參考模式

AppletB(被呼叫端)主動註冊

public class AppletB extends Applet {
    public static AppletB selfRef = null;
    
    public void init() {
        selfRef = this;  // 發布自身實例參考
    }
    
    public void doSomething() { ... }  // 公開業務方法
}

AppletA(呼叫端)取得參考並調用

public class AppletA extends Applet {
    public void callAppletB() {
        AppletB target = AppletB.selfRef;
        if (target != null) {
            target.repaint();  // 直接呼叫公開方法
            target.doSomething();
        }
    }
}

注意:需處理 selfRef == null 情況(AppletB 尚未初始化)。

方案二:通用註冊中心 AppletList

設計優勢

  • 解耦:呼叫端不需知曉目標具體類別
  • 支援多對多:任意數量 Applet 註冊/查詢
  • 生命週期管理:start() 註冊、stop() 移除
  • 名稱查找:模仿 getApplet(String name) 風格

完整實作

import java.util.*;
import java.applet.Applet;

public class AppletList {
    private static Hashtable applets = new Hashtable();
    
    public static synchronized void register(String name, Applet applet) {
        applets.put(name, applet);
    }
    
    public static synchronized void remove(String name) {
        applets.remove(name);
    }
    
    public static synchronized Applet getApplet(String name) {
        return (Applet) applets.get(name);
    }
    
    public static synchronized Enumeration getApplets() {
        return applets.elements();
    }
    
    public static synchronized int size() {
        return applets.size();
    }
}

使用範例

// 註冊端(股票交易 Applet)
public class TradeApplet extends Applet {
    public void start() {
        AppletList.register("StockTrade", this);
    }
    public void stop() {
        AppletList.remove("StockTrade");
    }
    public void executeTrade(String symbol, int qty) { ... }
}

// 呼叫端(幫助系統 Applet)
public class HelpApplet extends Applet {
    public void runWizard() {
        TradeApplet trade = (TradeApplet) AppletList.getApplet("StockTrade");
        if (trade != null) trade.executeTrade("AAPL", 100);
    }
}

安全性與限制條件

條件說明
同一 Codebase所有 Applet 必須從相同目錄載入(同源策略)
單一瀏覽器進程若使用者開啟兩個獨立瀏覽器視窗(非分頁),可能擁有獨立 JVM,通訊失效
信任關係簽名 Applet 與非簽名 Applet 混合可能觸發安全例外

實測相容性矩陣

經測試通過的環境:

  • Windows 2000: IE 5.0/5.5, Netscape 4.72, Opera 4.01
  • Windows 98: IE 4.72/5.0, Netscape 4.02
  • Mac OS 9: IE 4.5, Netscape 4.5
  • Red Hat 6.2: Netscape 4.73

現代替代方案

Applet 技術已淘汰,現代 Web 應用建議採用:

  • WebSocket:雙向即時通訊
  • SharedWorker:跨分頁共享執行緒
  • BroadcastChannel API:同源分頁廣播訊息
  • localStorage + storage 事件:跨分頁資料同步

總結

靜態註冊中心模式巧妙繞過標準 API 限制,展現 Java 共享執行環境的特性。雖然 Applet 時代已終結,但「共享記憶體通訊」的設計思維在微服務共享記憶體、OSGI 服務註冊、Android 進程間通訊等領域仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved