Communicating with Other Programs |
Applets can find other applets and send messages to them, with the following security restrictions:
- The applets must be running on the same page, in the same browser window.
- Many applet viewers require that the applets originate from the same server.
An applet can find another applet either by looking it up by name (using the
AppletContext getApplet
method) or by finding all the applets on the page (using theAppletContext getApplets
method). Both methods, if successful, give the caller one or moreApplet
objects. Once the caller finds anApplet
object, the caller can invoke methods on the object.Finding an Applet by Name: The getApplet Method
By default, an applet has no name. For an applet to have a name, one must be specified in the HTML code that adds the applet to a page. You can specify an applet's name in two ways:
- By specifying a
NAME
attribute within the applet's<APPLET>
tag. For example:<APPLET CODEBASE=example/ CODE=Sender.class WIDTH=450 HEIGHT=200 NAME="buddy"> . . . </applet>- By specifying a
NAME
parameter with a<PARAM>
tag. For example:<APPLET CODEBASE=example/ CODE=Receiver.class WIDTH=450 HEIGHT=35> <PARAM NAME="name" value="old pal"> . . . </applet>
Browser Note: One widely used Java-compatible browser does not allow applet names to contain uppercase letters. Specifically, thegetApplet
method (the method that looks up an applet by name) appears to convert the specified name to lowercase before looking for the applet. The expected behavior is for applet names to be case-sensitive, but for thegetApplet
method to perform a case-sensitive search. For exammple,getApplet("old pal")
andgetApplet("OLD PAL")
should both find an applet namedOld Pal
.
Below are two applets that illustrate lookup by name. The first, Sender, looks up the second, Receiver. When the Sender finds the Receiver, the Sender sends a message to the Receiver by invoking one of the Receiver's methods (passing the Sender's name as an argument). The Receiver reacts to this method call by changing its leftmost text string to "Received message from sender-name!".
Try this: Click the Send message button of the top applet (the Sender). Some status information will appear in the Sender's window, and the Receiver will confirm (with its own status string) that it received a message, After you've read the Receiver status string, press the Receiver's Clear button to reset the Receiver. In the Sender's text field labeled "Receiver name:," type inbuddy
and press Return. Since "buddy" is the Sender's own name, the Sender will find an applet named buddy but won't send it a message, since it isn't a Receiver instance.
Here's the whole Sender program. The code it uses to look up and communicate with the Receiver is listed below. Code that you can use without change in your own applet is in bold font.
The Sender goes on to make sure that the Receiver was found and that it's an instance of the correct class (Applet receiver = null; String receiverName = nameField.getText(); //Get name to search for. receiver = getAppletContext().getApplet(receiverName);Receiver
). If all goes well, the Sender sends a message to the Receiver. (Here's the Receiver program.)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); } } . . .From an applet's point of view, its name is stored in a parameter named
NAME
. It can get the value of the parameter using theApplet getParameter
method. For example, Sender gets its own name with the following code:myName = getParameter("NAME");For more information on using
getParameter
, see Writing the Code to Support Parameters.The example applets in this page perform one-way communication -- from the Sender to the Receiver. If you want your receiver to be able to send messages to the sender, then you just need to have the sender give a reference to itself (
this
) to the receiver. For example:((Receiver)receiver).startCommunicating(this);Finding All the Applets on a Page: The getApplets Method
ThegetApplets
method returns a list (an Enumeration, to be precise) of all the applets on the page. For security reasons, many browsers and applet viewers implementgetApplets
so that it returns only those applets that originated from the same host as the applet callinggetApplets
. Here's an applet that simply lists all the applets it can find on this page:
Below are the relevant parts of the method that calls
getApplets
. (Here's the whole program.)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"); } } . . . }
Communicating with Other Programs |