Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort

Download:
- ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
7., aktualisierte Auflage
geb., mit DVD (November 2007)
1.492 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1146-8
Pfeil 20 Applets
Pfeil 20.1 Applets in der Wiege von Java
Pfeil 20.1.1 (J)Applet und Applikationen
Pfeil 20.1.2 Das erste Hallo-Applet
Pfeil 20.1.3 Die Zyklen eines Applets
Pfeil 20.1.4 Parameter an das Applet übergeben
Pfeil 20.1.5 Wie das Applet den Browser-Inhalt ändern kann
Pfeil 20.1.6 Den Ursprung des Applets erfragen
Pfeil 20.1.7 Datenaustausch zwischen Applets
Pfeil 20.1.8 Was ein Applet alles darf
Pfeil 20.2 Fehler in Applets finden
Pfeil 20.2.1 Ist Java im Browser aktiviert?
Pfeil 20.2.2 Läuft das Applet unter Netscape oder Microsoft Explorer?
Pfeil 20.2.3 Datenaustausch zwischen Applets und Java-Skripten
Pfeil 20.3 Webstart

Mode ist, was man selbst trägt. Altmodisch ist, was die anderen tragen. – Oscar Wilde

20 Applets


Galileo Computing - Zum Seitenanfang

20.1 Applets in der Wiege von Java Zur nächsten ÜberschriftZur vorigen Überschrift

Bisher haben wir mit Applikationen gearbeitet, die auf der Kommandoebene oder vom Fenstersystem gestartet werden und über unmittelbaren Zugriff auf die Rechnerressourcen verfügen. Im Gegensatz dazu stehen Applets, die im Webbrowser oder Applet-Viewer ablauffähig sind. Mittlerweile bieten Applets ausgezeichnete Möglichkeiten, wie es beispielsweise die Webseite http://map24.de/ zeigt.

Da Microsoft gemäß seiner Produktpolitik in den neuen Versionen seines Betriebssystems (Windows XP) keine vorinstallierte JVM mehr vorsieht, bremst dies die Verbreitung von Applets im Internet jedoch aus.


Galileo Computing - Zum Seitenanfang

20.1.1 (J)Applet und Applikationen Zur nächsten ÜberschriftZur vorigen Überschrift

Von der Programmseite aus gesehen, verfügt eine Applikation über eine main()-Methode und ein Applet nicht. Applets erweitern stattdessen die Klasse javax.swing.JApplet oder java.applet.Applet. Doch auch hybride Software – die sowohl Applikation als auch Applet ist – ist nicht ausgeschlossen. Diese Sorte Programm erweitert einfach die Klasse (J)Applet und implementiert die main()-Funktion.


Hinweis Hinweis Um JApplet als Swing-Komponente nutzen zu können, reicht die Java-Laufzeitumgebung 1.1 von Microsoft nicht aus. Ist Suns Version von Java installiert, ersetzt es die JVM von Microsoft, und Swing-Applets lassen sich ausführen.


Ein Applet unterliegt hohen Sicherheitsbestimmungen – eine auf dem Client-Rechner liegende Datei kann zum Beispiel nicht gelöscht werden, und schon der lesende Zugriff ist unzulässig. Vom Sicherheitsstandpunkt aus betrachtet, kontrolliert der SecurityManager die Handlungen der Software.


Galileo Computing - Zum Seitenanfang

20.1.2 Das erste Hallo-Applet Zur nächsten ÜberschriftZur vorigen Überschrift

Ein Programm wird leicht zu einem Applet, wenn es die Klasse Applet erweitert. Als Einstieg soll ein kleines Beispiel-Applet dienen.

Listing 20.1 HelloWorldApplet.java

import java.applet.Applet; 
import java.awt.Graphics; 
 
public class HelloWorldApplet extends Applet 
{ 
  /* @Override */ public void paint( Graphics g ) 
  { 
    g.drawString( "Hallo Welt!", 50, 25 ); 
  } 
}

Die beiden ersten import-Anweisungen binden die notwendigen Informationen über Applets und über Zeichenfunktionen ein. Das HelloWorldApplet erweitert die Klasse Applet, denn so wird ein Applet erzeugt. Eine main()-Funktion kommt nicht vor, und es muss eine Funktion paint() überladen werden, die den Bildschirmaufbau übernimmt. [Das gilt nicht für JApplet. Dort ist das Überschreiben von paint() oder paintComponent() unüblich, da im Allgemeinen eine eigene sich zeichnende Komponente auf das JApplet gesetzt wird. ] Der Webbrowser oder Applet-Viewer ruft diese Funktion auf.

Damit der Viewer weiß, was zu machen ist, gibt der HTML-Code einen Hinweis auf die Klasse, die in die Seite eingebettet wird. Dies wird über ein spezielles Tag erreicht.

Listing 20.2 index.html

<html><body> 
<applet code="HelloWorldApplet.class" width="200" height="100"></applet> 
</body></html>

Neben dem Namen der Klasse übermittelt das Applet-Tag der virtuellen Maschine auch die Maße des Fensters, in dem das Applet zeichnen kann.


Hinweis Hinweis Sun hat in der Version 1.4 geringfügig das Format für die Bytecode-Dateien geändert. Viele Browser und ihre virtuellen Maschinen kommen damit nicht zurecht. Um den Compiler aus dem Java SDK 1.4 (und folgenden Versionen) anzuweisen, das ältere Format zu erzeugen, muss der Schalter -target 1.1 angegeben werden.


Ab Java 1.1 lassen sich auch gepackte Dateien im Jar-Format übermitteln. Die Angabe der Klasse in der Code-Anweisung sollte keine Leerzeichen beinhalten, da dies dem Communicator und dem Applet-Viewer Probleme bereitet. Die Endung .class ist nicht in jedem Browser erforderlich, wird aber empfohlen.


Galileo Computing - Zum Seitenanfang

20.1.3 Die Zyklen eines Applets Zur nächsten ÜberschriftZur vorigen Überschrift

Beim Start eines Applets werden unterschiedliche Methoden vom Browser automatisch aufgerufen. Es beginnt mit dem Aufruf der Methode init(). Dort sollten Initialisierungen erfolgen. init() wird nur einmal aufgerufen, wenn die Seite vom Browser geladen wird. Nach der Initialisierung folgt ein Wechsel der Methoden start() und stop() immer dann, wenn ein Applet im Browser sichtbar ist oder von der Seite verschwindet, etwa wenn der Anwender über die Schieberegler einen anderen Bereich auswählt, in dem das Applet nicht liegt. Beim Verlassen der Seite wird abschließend destroy() aufgerufen. Dort können Ressourcen freigegeben werden.


Galileo Computing - Zum Seitenanfang

20.1.4 Parameter an das Applet übergeben Zur nächsten ÜberschriftZur vorigen Überschrift

Dem Applet können Parameter im Applet-Tag übergeben werden. Dazu wird im <applet>-Element ein <param>-Element eingebettet. Im Folgenden zeichnet ein Applet einen grünen oder roten Kasten, in Abhängigkeit davon, ob eine URL korrekt aufgebaut ist.

Listing 20.3 appletCheckUrl.html

<html><body> 
<a href="http://tutego.com/index.html">Java-Seminare</a> 
<applet code="CheckUrlApplet.class" width="10" height="10"> 
 <param name="url" value="http://tutego.com/index.html"> 
</applet> 
<p> 
<a href="tutego.com/index.html2">Java-Seminare Falsch</a> 
<applet code="CheckUrlApplet.class" width="10" height="10"> 
 <param name="url" value="tutego.com/index.html2"> 
</applet> 
</body></html>

Das Applet nimmt den Parameter an und prüft den gültigen Aufbau der URL über eine MalformedURLException.

Listing 20.4 CheckUrlApplet.java

import java.applet.Applet; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.net.MalformedURLException; 
import java.net.URL; 
 
public class CheckUrlApplet extends Applet 
{ 
  private boolean urlOk = false; 
 
  @Override 
  public void init() 
  { 
    try { 
      urlOk = new URL( getParameter("url" ) ) != null; 
    } catch ( MalformedURLException e ) { /* urlOk is false */ } 
  } 
  @Override 
  public void paint( Graphics g ) 
  { 
    g.setColor( urlOk ? Color.GREEN : Color.RED ); 
    g.fillRect( 0, 0, 10, 10 ); 
  } 
}

Interessant wäre natürlich, wenn das Applet gleich die URL auf Erreichbarkeit prüfen würde. Relativ einfach ergeben sich dann folgende Zeilen:

try { 
  urlOk = ((HttpURLConnection)new URL( getParameter("url" ) ). 
          openConnection()).getResponseCode() == HttpURLConnection.HTTP_OK; 
} catch ( IOException e ) { /* urlOk is false */ }

Doch bei der Prüfung von üblichen Links kommt es zu einem Fehler! Aus Sicherheitsgründen kann ein Applet nicht auf Rechner zugreifen, die ungleich dem sind, von dem das Applet geladen wurde. Ohne explizite Sicherheitserweiterungen kann so ein allgemeines Prüft-Link-Applet nicht geschrieben werden.


Galileo Computing - Zum Seitenanfang

20.1.5 Wie das Applet den Browser-Inhalt ändern kann Zur nächsten ÜberschriftZur vorigen Überschrift

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://tutego.com/") );

Oder, falls ein spezieller Frame mit Namen angesprochen ist:

getAppletContext().showDocument( new URL("http://tutego.org"), "Framename" );

class java.applet.Applet 
extends Panel

  • AppletContext getAppletContext() Liefert den Kontext des Applets. Dieser Kontext erlaubt es dem Applet herauszufinden, in welcher Umgebung, also auf welcher Webseite es sich bewegt.

interface java.applet.AppletContext

  • void showDocument( URL url ) Ersetzt den Inhalt auf der aktuellen Seite durch eine neue Seite von der angegebenen URL.
  • void showDocument( URL url, String target ) Ersetzt den Inhalt auf der aktuellen Seite durch eine neue Seite von der angegebenen 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 einen Frame gelegt, der diesen Namen trägt.

Galileo Computing - Zum Seitenanfang

20.1.6 Den Ursprung des Applets erfragen Zur nächsten ÜberschriftZur vorigen Überschrift

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.


class java.applet.Applet 
extends Panel

  • URL getCodeBase() Liefert die Basis-URL des Applets.
  • URL getDocumentBase() Liefert die URL der Webseite, die das Applet enthält.

Auf dem URL-Objekt 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 Beispiel Applets können problemlos von Webseiten geklaut werden. Um dem einen Riegel vorzuschieben, können wir verlangen, dass die Zeichenkette von getDocumentBase() .getHost() immer die Webseite unseres Servers repräsentiert.

String web = getDocumentBase().getHost(); 
if ( ! "www.tutego.com".equals(web) ) 
{ 
  // hier meckern, dass was nicht stimmt. 
}

Wir könnten die Überprüfung auch über ein InetAddress-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.

Beispiel Beispiel Baue eine URL-Verbindung zu einer Grafikdatei auf. Wir benutzen 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, "image.gif" ); 
  ... 
} 
catch ( MalformedURLException e ) { 
  ... 
}


Galileo Computing - Zum Seitenanfang

20.1.7 Datenaustausch zwischen Applets Zur nächsten ÜberschriftZur vorigen Überschrift

Sind mehrere Applets auf einer Webseite untergebracht, gibt es Fälle, in denen die Applets Daten austauschen wollen. Zwei Lösungen sind populär:

  • 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, und hier traten in der Vergangenheit bei einigen Browsern Probleme auf.

Eleganter ist da schon die Möglichkeit über die Schnittstelle AppletContext, die es ermöglicht, einen Verweis auf das Applet über den Namen zu bekommen.


class java.applet.Applet 
extends Panel

  • AppletContext getAppletContext() Bestimmt die Umgebung eines Applets.

Applets über den AppletContext erfragen

Mit dem AppletContext gibt es zwei Möglichkeiten, an das Applet zu gelangen:

  • Das Applet über den einen Namen ansprechen.
  • Eine Aufzählung aller Applets zu erfragen.

Um einen Namen zu vergeben, wird das name Attribut im <applet>-Tag genutzt, etwa:

<applet code="Applet.class" name="applet" width="10" height="10">

Eine Verbindung der Methode getAppletContext() aus Applet und getApplet() aus AppletContext führt zu folgender Zeile:

Applet anotherApplet = applet.getAppletContext().getApplet( "applet" );

Die zweite Variante war, sich mit getApplets() eine Enumeration aller Applets einer Seite zu 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 ) 
  //  ... 
}

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<Applet> getApplets() Findet alle Applets, die durch AppletContext angegeben sind.

Praktische Kommunikation

Das Applet können wir 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, was etwa so aussieht: top.frames[1].document.applet["applet"].method().

Das folgende Beispiel zeigt zwei Applets Applet1 und Applet2 auf einer Webseite. Zunächst der HTML-Code:

Listing 20.5 TwoAppletsCommunication.html

<html><body> 
<applet code="Applet1.class" name="applet1" height="200" width="200"> 
</applet> 
<applet code="Applet2.class" name="applet2" height="200" width="400"> 
</applet> 
</body></html>

Es folgen die Implementierungen für die beiden Applets:

Listing 20.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 20.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 Beobachtermustern aus Kapitel 7 auch elegante Benachrichtigungen realisieren.


Galileo Computing - Zum Seitenanfang

20.1.8 Was ein Applet alles darf topZur vorigen Überschrift

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 gründliche Kenntnis der Java-Quelltexte voraus, beispielsweise der Fehler mit der Host-Adresse: Wenn ein Benutzer ein Applet von »tutego.com« liest, darf dieses Applet nur mit diesem Host eine Verbindung aufbauen und mit keinem anderen. Doch leider gab es in den Quelltexten von Java einen 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 »tutego.com« wie »www.ganz-boese.com«.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück



Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de