Previous | Next | Trail Map | Writing Applets | 他のプログラムとコミュニケートする


同じページの他のアプレットにメッセージを送る

アプレットは他のアプレットを探し、それらにメッセージを送ることができる。この場合、セキュリティに関する以下の制約事項がある。

アプレットは、名前を調べる (AppletContext の getApplet() メソッ ドを使用) か、そのページ上のすべてのアプリケーションを検索する (AppletContext の getApplets() メソッドを使用) ことによって別の アプレットを見つけることができる。 どちらのメソッドも、正常に動作すれば、1 つまたは複数の Applet オブジェクトを 呼び出し側に返す。 呼び出し側が Applet オブジェクトを見つけると、そのオブジェクトにあるメソッド を起動することができる。

以下に、重要なポイントを例示する 2 つのアプレットを示す。 1 つ目の Sender が 2 つ目の Receiver を探すようになっている。 Sender が Receiver を見つけると、Sender は Receiver のメソッドの 1 つを起動 する (このとき、Sender の名前を引数として渡す) ことによってメッセージを Receiver に送る。 Receiver は、左端のテキスト文字列を "Received message from Sender 名!" に変更して、このメソッド呼び出しに反応する。

トライしてみよう: トップアプレット (Sender) の Send message ボタンをクリックする。 Sender のウィンドウに何らかの状態情報が表示され、Receiver はメッセージを受け取ったことを (Receiver の状態文字列によって) 確認する。 状態文字列を読み終えたら、Receiver の Clear ボタンを押して Receiver をリセットする。

注: Sender の状態フィールドで "Couldn't find any applet named Old Pal" というメ ッセージが表示された場合は、ブラウザのバグにぶつかった可能性がある。 Netscape Navigator 2.0 ブラウザでは、本来成功すべきところでgetApplet() がよく失敗する。 Sender は、getApplet() が失敗したときはgetApplets() を起動することでこのバグに対処している。 この回避策の詳細は、このページで後述する。

トライしてみよう (使用中のブラウザが getApplet() を正しく実装している場合): Sender の "Receiver name:" とラベルの付いたテキストフィールドにBuddy と入力してリターンキーを押す。"Buddy" は Sender 自体の名前であるため、Sender は Buddy という名前のアプレットを見つける。し かし、Receiver のインスタンスではないため、メッセージは送らない。

名前でアプレットを見つける: getApplet() メソッド

このセクションでは、Sender が名前でアプレットを見つけるときのコードを示す。 (Sender プログラム全体 も用意されている。) 読者の作成するアプレットに変更なしで使えるコードは ボールド書体 で示 してある。

Applet receiver = null;
String receiverName = nameField.getText(); //検索対象の名前を取り出す
receiver = getAppletContext().getApplet(receiverName);

Sender は次に、Receiver が見つかったことと、それが正しいクラスのインスタンス (Receiver) であることを確認する。すべてに問題がなければ、Sender は Receiver にメッセージを送る。 (Receiver プログラムも用意されている。)

if (receiver != null) {
    if (!(receiver instanceof Receiver)) {
        status.appendText("Found applet named "
                          + receiverName + ", "
                          + "but it's not a Receiver object.¥n");
    } else {
        status.appendText("Found applet named "
                          + receiverName + ".¥n"
                          + "  Sending message to it.¥n");
        ((Receiver)receiver).processRequestFrom(myName);
    }
} . . .

ブラウザの中には getApplet() を正しく実装していないものもあるので、このアプレットは receivernull であっても処理をそこでやめないようになっている。 その代わり、次のセクションで説明するように、getApplets() メソッ ドを呼び出す。

このページのアプレット例は、Sender から Receiver への単方向通信を実行する。 受信側からも送信側へメッセージを送れるようにしたい場合は、送信側がそれ自体へ の参照 (this) を受信側に渡すようにするだけでよい。次に例を示す 。

((Receiver)receiver).startCommunicating(this);

ページ上のすべてのアプレットを見つける: getApplets() メソッド

getApplets() メソッドは、そのページにあるすべてのアプレットのリ ストを返す (正確さを図るため列挙法 (Enumuration) による)。 セキュリティ上の理由から、多くのブラウザや Applet ビューワーは、getApplets() を呼び出しているアプレットと同じホストから配信され たアプレットだけを返すように getApplets() の実装を限定している 。 次に、このページ上で見つけられるすべてのアプレットを単にリストするアプレット の例を示す。

以下に、あるメソッドのgetApplets() に関連する部分を示す。 (プログラム全体も用意されている。)

public void printApplets() {
    //Enumuration には、メッセージの宛先にできる
    //このページのすべてのアプレット (これ自体も) が入る。
    Enumeration e = getAppletContext().getApplets();
    . . .
    while (e.hasMoreElements()) {
        Applet applet = (Applet)e.nextElement();
        String info = ((Applet)applet).getAppletInfo();
        if (info != null) {
            textArea.appendText("- " + info + "¥n");
        } else {
            textArea.appendText("- " + applet.getClass().getName() + "¥n");
        }
    }
    . . .
}

このページで示した最初の例では、Sender アプレットが Receiver を見つけられないときは、Sender はそれを Netscape のバグによるものとみなしている。Netscape には getApplets() が実装されているため、Sender はgetApplets() を回避策として試みる。 Sender のこの実装は単に、getApplets() が返した最初の Receiver に processRequestFrom() メッセージを送るだけである。 ここで注意しなければならないのは、Receiver にprocessRequestFrom() メッセージを送る前に、Receiver の名前を確認することである (Receiver クラスにメソッドを追加する必要が生じる)。

次に、getApplet() が何も返せなかった場合の Sender のコードを示 す。

public void searchAllApplets() {
    Enumeration appletList = getAppletContext().getApplets();
    boolean foundReceiver = false;

    while (appletList.hasMoreElements() && !foundReceiver) {
        Applet applet = (Applet)appletList.nextElement();
        if (applet instanceof Receiver) {
            status.appendText("  Found Receiver applet.¥n"
                              + "  Sending message to it.¥n");
            ((Receiver)applet).processRequestFrom(myName);
        }
    }
}


Previous | Next | Trail Map | Writing Applets | 他のプログラムとコミュニケートする