摘要
您可能認為能讓 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 程式碼:
<applet code="Applet1" width="400" height="100" name="app1">
</applet>
<br>
<applet code="Applet2" width="400" height="100" name="app2">
</applet>
<br>
通過使用 applet 標記中的 name 屬性,您就可以用下面的方式引用一個特定的 applet:
Applet theOtherApplet = getApplet("app1");
theOtherApplet.anyMethod(); //調用任一個公用方法
或者,您也可以用以下的代碼來檢索這個頁面上的所有 applet:
Enumeration allAppletsOnSamePage = getApplets();
while(allAppletsOnSamePage.hasMoreElements()) {
Applet appl = (Applet) allAppletsOnSamePage.nextElement();
appl.anyMethod(); //調用任一個公用方法
}
當發出調用的 applet 在它所在的同一個 HTML 頁面上檢索到一個或幾個 applet 之後,它就可以調用這些 applet 的公用方法。