Aplet może wysyłać i odbierać komunikaty od innych apletów pod warunkiem spełnienia następujących kryteriów:
Aplet potrafi znaleźć inny aplet przez podanie jego nazwy
(przy wykorzystaniu metody AppletContext getApplet
)
lub przez wyszukanie wszystkich apletów na stronie (przy
wykorzystaniu metody AppletContext getApplets
).
W przypadku, gdy wyszukiwanie to zakończy się powodzeniem, zostanie
zwrócony jeden lub wiele obiektów typu Applet
.
Gdy aplet wywołujący znalazł obiekt typu Applet
,
może on wywoływać metody należące do znalezionego apletu.
Domyślnie aplet nie posiada żadnej nazwy. Nadanie nazwy danemu apletowi musi się odbyć w kodzie HTML w jeden z następujących sposobów:
NAME
wewnątrz tagu
<APPLET>
, np.:
<APPLET CODE=Sender.class WIDTH=450 HEIGHT=200 NAME="buddy"> . . . </applet>
NAME
wewnątrz
tagu <PARAM>
, np.:
<APPLET CODE=Receiver.class WIDTH=450 HEIGHT=35> <PARAM NAME="name" value="old pal"> . . . </applet>
Poniżej zamieszczono dwa aplety ilustrujące ideę wyszukiwania przez podanie nazwy. Pierwszy aplet, Sender (Nadawca), szuka drugiego apletu, Receiver (Odbiorca). Kiedy Nadawca znajdzie Odbiorcę, wysyła komunikat do Odbiorcy przez wywołanie jednej z metod Odbiorcy ( z podaniem nazwy Nadawcy jako argument). Odbiorca reaguje na ten komunikat przez zmianę tekstu na "Received message from sender-name!".
buddy
i nacinij Enter.
Ponieważ "buddy" jest własną nazwą Nadawcy, znajdzie on aplet tak
nazwany, ale nie prześle komunikatu, gdyż nie jest to
aplet typu Receiver.
Tu zamieszczono cały kod apletu Sender. Część kodu odpowiadającą za wyszukanie i komunikację z apletem typu Receiver zamieszczono poniżej. Kodu pogrubionego można użyć bez zmian w innych apletach.
Aplet Sender upewnia się, czy odnaleziono aplet o nazwie Receiver i czy jest on instancją właściwej klasy - (Applet receiver = null; String receiverName = nameField.getText(); //Get name to search for. receiver = getAppletContext().getApplet(receiverName);
Receiver
).
Jeśli wszystko jest w porządku, Sender wysyła komunikat do apletu
Receiver. (Tu zamieszczono kod
apletu Receiver.)
if (receiver != null) { //Use the instanceof operator to make sure the applet //we found is a Receiver object. 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"); //Cast the receiver to be a Receiver object //(instead of just an Applet object) so that the //compiler will let us call a Receiver method. ((Receiver)receiver).processRequestFrom(myName); } } . . .
Nazwa apletu jest przechowywana w parametrze NAME
.
Wartość tego parametru można otrzymać przy pomocy metody
Applet getParameter
. Na przykład, Sender
czyta swoją nazwę w tym fragmencie kodu:
myName = getParameter("NAME");
Pokazany wyżej układ apletów umożliwia jedynie jednostronną
komunikację - od apletu Sender do apletu Receiver.
Aby umożliwić apletowi Receiver wysyłanie komunikatów do
apletu Sender, aplet Sender musi przekazać apletowi Receiver
wskazanie na siebie samego (this
). Na przykład:
Tę dwustronną komunikację realizuje nieco zmodyfikowany układ apletów. Warto zauważyć, że pierwszym krokiem zawsze musi być wysłanie wiadomości przez aplet Nadawca. Bez tej poczštkowej wiadomości niemożliwe jest udzielanie odpowiedzi.((Receiver)receiver).startCommunicating(this);
Tu zamieszczono kod apletu Sender2, a tu - apletu Receiver2.
MetodagetApplets
zwraca listę (typu Enumeration) wszystkich apletów znajdujących się na stronie. Ze względów bezpieczeństwa wiele przeglądarek implementuje metodęgetApplets
w ten sposób, że zwraca ona tylko te aplety, które pochodzą z tego samego serwera co aplet wywołujący metodęgetApplets
. Poniżej umieszczono aplet wyświetlający listę wszystkich apletów na tej stronie:
Poniżej przedstawiono część kodu z wywołaniem metody
getApplets
(Tu znajduje się kod całego programu.)public void printApplets() { //Enumeration will contain all applets on this page (including //this one) that we can send messages to. 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"); } } . . . }