19.5 Methoden der Applet- und AppletContext-Klasse
 
19.5.1 Wie das Applet den Browser-Inhalt ändern kann
 
Das Applet kann mit showDocument() auf den Inhalt der Seite Einfluss nehmen. So lassen sich Applets bauen, die eine Baumstruktur der Seite anzeigen und dann zum Inhalt verweisen, falls eine Seite ausgewählt wird. Verwendet werden hier die Methoden von AppletContext. In Kurzform:
getAppletContext().showDocument( new URL("http://www.ullilieb.com/") );
oder, falls ein spezieller Frame mit Namen angesprochen ist:
getAppletContext().showDocument( new URL("http://ulli.org"), "Framename" );
class java.applet. Applet
extends Panel
|
|
AppletContext getAppletContext()
Liefert den Kontext des Applets. Dieser erlaubt es ihm herauszufinden, in welcher Umgebung, also auf welcher Web-Seite er sich bewegt. |
interface java.applet. AppletContext
|
|
void showDocument( URL url )
Wechselt den Inhalt auf der aktuellen Seite mit einer neuen Seite der gegebenen URL. |
|
void showDocument( URL url, String target )
Wechselt den Inhalt auf der aktuellen Seite mit einer neuen Seite der gegebenen URL. Dabei wird das Dokument in einen Frame abgelegt, dessen Name zusätzlich festgesetzt ist. Für target sind erlaubt: _self (Seite, die das Applet enthält), _parent (bettet die neue Seite in die Vaterseite des Applets ein; falls diese nicht existiert, verhält es sich wie _self), _top (im Toplevel-Frame anzeigen; falls dieser nicht existiert, wie _self), _blank (erzeugt ein neues Fenster), und wenn der Name nicht mit den Konstanten übereinstimmt, wird die Anzeige in ein Frame gelegt, der diesen Namen trägt. |
19.5.2 Den Ursprung des Applets erfragen
 
Greift ein Applet auf Daten des Servers zu und ist ihm die Adresse nicht bekannt, so kann es nachfragen. Die Applet-Klasse stellt die Methoden getCodeBase() und getDocumentBase() zur Verfügung.
getCodeBase()
|
Liefert die URL des Applets.
|
getDocumentBase()
|
Liefert die URL der Web-Seite, die das Applet enthält.
|
Dann liefert getHost() eine String-Repräsentation der URL. So kommen wir mit den Methoden getCodeBase().getHost() an den Host-Namen und auch an die Daten des Servers.
Beispiel Applets können problemlos von Web-Seiten geklaut werden. Um dem einen Riegel vorzuschieben, können wir verlangen, dass die Zeichenkette von getDocument-Base().getHost() immer die Web-Seite unseres Servers repräsentiert.
String web = getDocumentBase().getHost();
if ( ! "www.mydomain.com".equals(web) )
{
// hier meckern, dass was nicht stimmt.
}
|
Wir könnten die Überprüfung auch über ein InetAdress-Objekt realisieren.
class java.net. URL
implements Serializable, Comparable
|
|
String getHost()
Liefert den Host-Namen des URL-Objekts. Handelt es sich um das »file«-Protokoll, so ist der Rückgabewert ein leerer String. |
class java.applet. Applet
extends Panel
|
|
URL getCodeBase()
Liefert die Basis-URL des Applets. |
|
URL getDocumentBase()
Liefert die URL der Web-Seite, die das Applet enthält. |
Beispiel Baue eine URL-Verbindung zu einer Grafikdatei auf. Wir benützen hier zunächst die Methode getDocumentBase(), um an die URL des Servers zu gelangen, und anschließend den URL-Konstruktor, der uns relativ zur Basisadresse eine Pfadangabe erlaubt.
URL u1 = getDocumentBase() ;
try {
URL u2 = new URL( u1 , "grafik.gif" );
...
}
catch ( MalformedURLException e ) {
...
}
|
19.5.3 Datenaustausch zwischen Applets
 
Sind mehrere Applets auf einer Web-Seite untergebracht, gibt es Fälle, in denen die Applets Daten austauschen wollen. Zwei Lösungen bieten sich an: Da alle Applets in einer einzigen JVM laufen, lässt sich über statische Attribute auf die anderen Elemente zugreifen. Dies spricht jedoch gegen die Datenkapselung und ist sehr unfein. Diese Technik hat einen weiteren Schwachpunkt: Statische Variablen hängen eng mit dem Klassenlader zusammen. Hier traten in der Vergangenheit bei Netscape einige Probleme auf (die nun aber behoben sein sollten). Eleganter ist da schon die Möglichkeit über die Schnittstelle AppletContext.
class java.applet. Applet
extends Panel
|
|
AppletContext getAppletContext()
Bestimmt die Umgebung eines Applets. |
interface java.applet. AppletContext
|
|
Applet getApplet( String name )
Sucht das Applet namens name in dem Dokument, das durch den AppletContext gegeben ist. Der Name kann durch das HTML-Tag gesetzt sein. Falls kein Applet dieses Namens existiert, liefert die Methode null. |
|
Enumeration getApplets()
Findet alle Applets, die durch AppletContext gegeben sind. |
Zwei Lösungen bieten sich nun an: Die ältere Variante erwartet, dass das Applet einen Namen besitzt. Dieser wird mit dem NAME-Attribut im APPLET-Tag zugewiesen, etwa <APPLET ... NAME=Name ...>.
Eine Verbindung der Methode aus Applet und AppletContext führt zu folgender Zeile
Applet anotherApplet = getAppletContext.getApplet( "Name" );
Wie wir oben gesehen haben, lässt sich auch eine Enumeration aller Applets einer Seite mit getApplets() besorgen.
Applet otherApplet = null;
Enumeration applets = getAppletContext.getApplets();
while ( applets.hasMoreElements() )
{
otherApplet = (Applet)applets.nextElement();
if ( otherApplet != this)
break;
// Jetzt können wir etwas mit dem anderen Applet machen, etwa
// if ( otherApplet instanceof Applet2 )
// ...
}
Ein Applet kann sich gegebenenfalls in eine Unterklasse casten. Dann lassen sich alle Methoden aufrufen und die Variablen auslesen. Leider funktionieren beide vorgestellten Methoden nur, wenn die Applets in einem gleichen Frame liegen. Liegen sie in verschiedenen Frames, findet zumindest die Netscape-Methode getApplet() das Applet leider nicht. Hier bleibt aber noch die Variante über statische Variablen übrig. Eine weitere Möglichkeit, Applets über verschiedene Frames kommunizieren zu lassen, führt über eine JavaScript-Funktion. Sie fungiert als Brücke. Dies erörtern wir allerdings nicht weiter.
Das folgende Beispiel zeigt zwei Applets Applet1 und Applet2 auf einer Web-Seite. Zunächst der HTML-Code:
Listing 19.5
TwoApplets.html
<html><body>
<applet code="Applet1.class" name="applet1"
heigth=200 width=200>
</applet>
<applet CODE="Applet2.class" name="<span class="listing">applet2</span>" height="200" width="400">
</applet>
</body></html>
Es folgen die Implementierungen für die beiden Applets:
Listing 19.6
Applet1.java
import java.applet.Applet;
import java.awt.*;
public class Applet1 extends Applet
{
private TextField inputText = new TextField( "", 10 );
public void init()
{
add( inputText );
add( new Button( "Sende an Applet2" ) );
}
public boolean action( Event ev, Object arg )
{
if ( ev.target instanceof Button )
{
Applet2 applet2 = (Applet2) getAppletContext().getApplet( "applet2" );
if ( applet2 != null )
{
applet2.appendTheText( inputText.getText().trim() );
return true;
}
}
return false;
}
}
Listing 19.7
Applet2.java
import java.applet.Applet;
import java.awt.TextArea;
public class Applet2 extends Applet
{
private TextArea textBox = new TextArea( 5, 40 );
public void init()
{
add( textBox );
}
public void appendTheText( String s )
{
textBox.append( s + "\n" );
}
}
Da bei verschiedenen Frames getAppletContext() jedoch das andere Applet nicht zurückgeben muss, bleibt nur noch die Variante über die statische Variable. Glücklicherweise lassen sich mit Observer/Observable auch elegante Benachrichtigungen realisieren.
19.5.4 Was ein Applet alles darf
 
Ein Applet unterliegt bestimmten Sicherheitsbeschränkungen, die eine Java-Security-Einheit überprüft. In Kapitel 25 über Sicherheit werden wir dies näher beleuchten.
Viele der bekannten Fehler in Java, die potenzielle Sicherheitslücken darstellen, sind mittlerweile behoben. Schon das Auffinden setzt eine erbarmungslose Kenntnis der Java-Quelltexte voraus. Beispielsweise der Fehler mit der Host-Adresse: Wenn ein Benutzer ein Applet von »java-tutor.com« liest, darf dieses Applet nur mit dem Host eine Verbindung aufbauen und mit keinem anderen. Doch leider war in den Quelltexten von Java ein Fehler, so dass das Applet nur den Rechnernamen des Hosts vergleicht, nicht aber die IP-Adresse. Ein kluges Applet kann nun dem DNS (Domain-Name-Server) eine falsche Zuordnung von Rechnername und IP-Adresse vorspielen, und nun verhält sich »java-tutor.com« wie »www.ganz-boese.com«.
|