In den ersten Teilen dieses Kapitels wurden die Unterschiede zwischen Applets und Applications eher unter syntaktischen Gesichtspunkten verglichen. Ein Beispiel hierfür ist die main-Methode jeder Application, die in einem Applet nicht verwendet werden darf. Ziel dieses Teilkapitels ist erweiternd hierzu eine umfassende Betrachtung aller Unterschiede zwischen diesen beiden Anwendungsarten. Im Gegensatz zu Applications können Applets auf allen gebräuchlichen Internet-Browsern ablaufen, wenn sie Teil einer in HTML erstellten Webseite sind und wenn der jeweilige Browser Java unterstützt. Applets können weiterhin mit Hilfe des Appletviewers auch direkt aufgerufen werden, der Teil jeder Java-Distribution ist. Wird ein Applet derart aufgerufen, so werden seine class-Dateien über das Netz geladen. Anschließend wird das Applet auf der Maschine des Benutzers ausgeführt, wobei der Interpreter des Browsers und damit auch die Standard-Klassenbibliothek verwendet werden. Hierbei werden spezielle Sicherheitsroutinen durchlaufen, die in Kapitel 1.3 bereits ausführlich dargestellt wurden. In den meisten Browsern wird die strengste Sicherheitsstufe eingehalten, so dass ein Applet keine Dateien des Benutzers lesen oder verändern kann. Applets dürfen hier auch nicht mit anderen Internet-Rechnern Kontakt aufnehmen als mit demjenigen, von dem sie geladen wurden, und auch Programme des Benutzers dürfen nicht gestartet werden. Im Gegensatz hierzu können Teile dieser Regeln außer Kraft gesetzt werden, bspw. indem man Zugriffslisten von Verzeichnissen erzeugt, die der Appletviewer verwendet (siehe hierzu auch Kapitel 5.2). Ein Problem, das häufig bei der Ausführung von Applets auftritt, besteht darin, dass der jeweilige Browser die Java-Version, in der das Applet erstellt wurde, nicht versteht. Dies kann zum einen daran liegen, dass Browser-Hersteller längere Zeit benötigen, um ihre Software an die neueste Java-Version anzupassen, andererseits aber auch daran, dass Browser-Hersteller Java mit voller Absicht nicht vollständig unterstützen, um eigenen Techniken zur weiteren Verbreitung zu verhelfen (bspw. ActiveX der Firma Microsoft). Die Firma JavaSoft hat dieses Problem erkannt und entwickelte daher ein Plug-In, mit dessen Hilfe die jeweils neueste Java-Version in den meisten der heute weit verbreiteten Browser ausgeführt werden kann. Wird das Plug-In, dessen Aufgabe die Funktionserweiterung des Browsers ist, verwendet, so können auch Java-Applets ausgeführt werden, die in einer neueren Programmversion implementiert wurden. Mittlerweile steht unter der URL http://java.sun.com/products das Plug-In für Java 1.2 zur Verfügung. Soll kein Plug-In verwendet werden, so empfiehlt es sich, Java-Applets nach wie vor in älteren Java-Versionen zu entwickeln, da diese meist von allen Browsern unterstützt werden. Applications hingegen können immer in der Version entwickelt werden, in der das Java Development Kit verfügbar ist, da sie ausschließlich unter Verwendung des JDKs ablaufen. Programmierung von Applets Applets sind grundsätzlich Subklassen der Applet-Klasse, die wiederum Subklasse der Klasse java.applet ist. Aus diesem Grund ist die Syntax eines Applets immer public class Appletname extends java.applet.Applet { // Applet-Rumpf } Als Subklasse der als public deklarierten Klasse Applet ist auch die Klassendefinition jedes Applets public. Weitere Klassen, die im Rahmen eines Applets entwikkelt werden können (bspw. Hilfsmethoden oder -klassen), unterliegen dieser Einschränkung jedoch nicht. Die Klasse Applet stellt die notwendige Funktionalität zur Verfügung, die zur Ausführung in einem Browser notwendig ist, bspw. auch die Verarbeitung spezieller Ereignisse wie das Neuladen von Webseiten. Eine weitere Aufgabe der Klasse Applet ist das Erzeugen der grafischen Benutzeroberfläche und die Verarbeitung von Benutzereingaben. Beim Aufruf eines Applets lädt der Browser die class-Dateien des Applets und erzeugt automatisch eine Applet-Instanz bzw. ruft die Klassenmethoden auf, wenn bestimmte Ereignisse (sog. Events) eintreten. Werden mehrere gleiche Applets auf einer Webseite aufgerufen, so werden auch verschiedene Instanzen derselben Klassen erzeugt, auch wenn jeder Instanz der gleiche Code zugrunde liegt. Die verschiedenen Instanzen interagieren hierbei vollständig unabhängig voneinander. Eine Besonderheit von Applets ist, dass sie im Gegensatz zu Applications keine main-Methode verwenden. Anstelle dieser Methode existieren eine Reihe anderer Methoden, die aufgerufen werden, wenn bestimmte Ereignisse eintreten, und die von der applet-Klasse geerbt werden. Es ist zu beachten, dass diese Methoden meist leer sind, dass also lediglich deren Signatur mit einem leeren Rumpf definiert ist. Der Grund hierfür ist, dass die genaue Realisierung dieser Methoden durch den Programmierer bewusst offengehalten werden soll. Zur Implementierung müssen daher diese Methoden im jeweiligen Applet überschrieben werden. Die wichtigsten derartigen Methoden sind die Initialisierung des Applets, das Starten, Anhalten und Beenden von Applets und die paint-Methode. Initialisierung von Applets Bei der Initialisierung, die beim Laden eines Applets erfolgt, werden bspw. erforderliche Objekte generiert, Bilder geladen oder Parameter gesetzt. Hierzu ist die init-Methode folgendermaßen zu überschreiben: public void init() { // Initialisierungs-Code } Starten von Applets Das Starten eines Applets erfolgt jeweils dann, wenn ein Applet entweder initialisiert wurde oder wenn es angehalten wurde. Im Gegensatz zur Initialisierung, die immer nur einmalig durchgeführt werden kann, können Applets beliebig angehalten und dann wieder gestartet werden. Die Funktionalität der hierzu notwendigen start-Methode beinhaltet bspw. die Übergabe geeigneter Nachrichten an Hilfsklassen. Die start-Methode muss folgendermaßen überschrieben werden: public void start() { // Initialisierungs-Code } Anhalten von Applets Die Funktionalität der stop-Methode ist das genaue Gegenteil der start-Methode. Typischerweise laufen Threads, die durch das Applet gestartet wurden, weiter, auch wenn die Seite, auf der das Applet verankert ist, längst verlassen wurde. Um dies zu verhindern, kann die stop-Methode verwendet werden, die folgendermaßen zu überschreiben ist: public void stop() { // Initialisierungs-Code } Beenden von Applets Aufgabe der destroy-Methode ist es, Ressourcen, die durch ein Applet belegt wurden, zur Garbage Collection freizugeben. Hierzu gehören bspw. die Terminierung von Prozessen, die ein Applet erzeugt hat oder die Freigabe von Speicher, den Objekte eines Applets belegt haben. Die destroy-Methode ist folgendermaßen zu überschreiben: public void destroy() { // Initialisierungs-Code } Der Unterschied zwischen der destroy- und der bereits beschriebenen finalize-Methode ist, dass destroy nur für Applets angewendet werden kann, während finalize eine eher globale Bedeutung hat. Mittels finalize können beliebige Objekte verschiedenster Datentypen zur Freigabe markiert werden. Die paint-Methode Die paint-Methode wird zur Darstellung von Objekten (bspw. Schrift, Grafiken oder Bilder) eingesetzt. Zur Darstellung dieser Objekte ist die paint-Methode folgendermaßen zu überschreiben: public void paint(Graphics g) { // Initialisierungs-Code } Im Gegensatz zu den Methoden init(), start(), stop() und destroy() erwartet die paint-Methode als Parameter eine Instanz der Klasse Graphics. Dieses Objekt muss allerdings nicht vom Programmierer angelegt werden, da es vom Browser selbst generiert wird. Es ist allerdings zu beachten, dass die Klasse Graphics als Teil des Packages java.awt importiert werden muss. Dies erfolgt typischerweise, indem mit Hilfe des Asteriskus folgende import-Anweisung verwendet wird: import java.awt.*; Beispiel Das in Abb. 4-1 dargestellte Beispiel, das das in Abb. 3-1 vorgestellte Applet erweitert, illustriert die Verwendung der beschriebenen Methoden. Abb. 4.1: Beispiel-Applet Als Argument wird eine Instanz der Klasse Graphics übergeben, die die momentan gültigen Eigenschaften der Darstellungsfläche verwalten. Hierzu gehört auch der verwendete Schrifttyp (sog. Font). Zum Setzen eines Fonts wird eine Variable vom Typ Font erzeugt. Der Typ Font wird in der Klasse java.awt.Font definiert, die dazu zu importieren ist. Mittels der Methode drawString wird ein Text auf dem Bildschirm dargestellt. Neben dem anzuzeigenden Text werden hier zwei weitere Parameter übergeben, die den horizontalen und den vertikalen Abstand des Textes vom Bildschirmrand angeben (siehe Abb. 4-2). Hierbei gilt die linke obere Bildschirmecke als Koordinate (0,0). Abb. 4.2: Darstellung des Applets Beispiel3 Applets und Webseiten Nachdem ein Applet implementiert worden ist, kann es entweder direkt mit dem Appletviewer oder über eine HTML-Seite angezeigt werden. Die notwendige Syntax zur Erstellung einer derartigen Seite wird in diesem Unterkapitel erläutert. Alle Applets müssen mittels des <APPLET>-Tags in HTML-Seiten integriert werden. Dieses Tag wird von allen Browsern verstanden, die Java unterstützen. Ein einfaches Beispiel für die Anwendung dieses Tags wurde bereits in Abb. 3-2 dargestellt. Neben den dort verwendeten Parametern CODE (Name der Klassendatei des Applets), WIDTH (Darstellungsbreite des Applets) und HEIGHT (Darstellungshöhe des Applets) existieren eine Reihe weiterer Parameter, die im Folgenden vorgestellt werden. Diese sind weitestgehend mit denen des <IMG>-Tags identisch, das zur Einbettung von Bildern in Webseiten verwendet wird. Neben der Verwendung des <APPLET>-Tags steht in HTML auch noch das <OBJECT>-Tag zur Verfügung, mit dem neben Java-Applets auch noch weitere interaktive Komponenten in Webseiten eingefügt werden können, bspw. ActiveX-Programme. Im Gegensatz zum <APPLET>-Tag verwendet das <OBJECT>-Tag nicht den Parameter CODE, sondern CLASSID. Zusätzlich sollte hier spezifiziert werden, dass ein Java-Applet verwendet werden soll, indem vor dem Namen des Applets der Text eingefügt wird. Wird bspw. das Applet Beispiel3 eingebunden, so muss die folgende Syntax verwendet werden: <OBJECT CLASSID="java:Beispiel3.class" WIDTH=200 HEIGHT=200> </OBJECT> ALIGN-Parameter Der ALIGN-Parameter wird innerhalb der <APPLET>...</APPLET>-Anweisung verwendet, um die Position eines Applets in einer Webseite relativ zu anderen Komponenten der Seite angeben zu können. ALIGN wird folgendermaßen gesetzt: ALIGN=LEFT oder ALIGN=RIGHT stellt das Applet links oder rechts vom Text dar, der auf das Applet folgt. ALIGN=TOP stellt das Applet dort dar, wo das höchste Element der Zeile (bspw. Bild oder Text) beginnt. ALIGN=TEXTTOP stellt analog das Applet dort dar, wo das höchste Textelement beginnt. ALIGN=BOTTOM stellt das Applet auf Höhe der Zeilenunterkante dar. Diese Anweisung ist analog zur Zuweisung ALIGN=BASELINE. ALIGN=MIDDLE richtet die Höhe der Mitte des Applets auf die Mitte der Texthöhe aus. ALIGN=ABSMIDDLE richtet die Mitte der Höhe des Applets auf die Mitte der Höhe des höchsten Elements der Zeile aus. ALIGN=ABSBOTTOM richtet die Unterkante des Applets auf die Unterkante des am weitesten unten angeordneten Elements der Zeile aus. Soll ein Applet bspw. linksbündig positioniert werden, so ist folgende Anweisung nötig: <APPLET CODE="Beispiel3.class" WIDTH=200 HEIGHT=200 ALIGN=LEFT></APPLET> HSPACE und VSPACE Mittels HSPACE und VSPACE werden der horizontale und der vertikale Abstand des Applets in Pixeln vom umgebenden Text angegeben. Hierbei wird der Abstand stets zu beiden Seiten des Applets erzeugt, im Falle von HSPACE daher links und rechts vom Applet. Soll bspw. das Applet im Abstand von jeweils 50 Pixeln zum Text dargestellt werden, so ist die folgende Syntax zu verwenden: <APPLET CODE="Beispiel3.class" WIDTH=200 HEIGHT=200 ALIGN=LEFT HSPACE=50 VSPACE=50></APPLET> CODE und CODEBASE Mittels CODE und CODEBASE wird angegeben, wie die Hauptklassendatei heißt, bzw. wo sich diese und eventuelle weitere Klassendateien befinden. Wird ausschließlich der CODE-Parameter verwendet, so muss sich die .class-Datei im selben Verzeichnis befinden wie die HTML-Seite, aus der der Aufruf generiert wurde. Mittels des CODEBASE-Parameters kann ein anderes Verzeichnis, aber auch eine URL angegeben werden. Ein Beispiel für die Verwendung von CODE und CODEBASE ist: <APPLET CODE="Beispiel3.class" CODEBASE="http://www.kom.e-technik.tu-darmstadt.de/javak lassen" WIDTH=200 HEIGHT=200 ALIGN=LEFT></APPLET> ARCHIVE Mittels des Parameters ARCHIVE wird angegeben, dass ein Java-Archiv geladen werden soll, das mehrere Dateien in einer gruppiert. Die Verwendung von Java-Archiven wird in Kapitel 4.3 beschrieben. Das folgende Beispiel demonstriert die Verwendung von ARCHIVE, wobei hier angenommen sei, dass alle Beispiel-Applets in der Datei Beispiele.jar gruppiert seien: <APPLET CODE="Beispiel3.class" ARCHIVE="Beispiele.jar" WIDTH=200 HEIGHT=200 ALIGN=LEFT></APPLET> Parameterübergabe an Applets Im Zusammenhang mit Applications wurde bereits dargestellt, wie Parameter über die Kommandozeile an die main-Methode übergeben werden müssen. Da in Applets keine Kommandozeile zur Verfügung steht, ist ein anderer Übergabemechanismus notwendig, der aus zwei Teilen besteht. Offensichtlich muss ein spezieller HTML-Parameter verwendet werden, da Applets ja aus Webseiten gestartet werden können. Weiterhin muss im Applet eine Möglichkeit bestehen, auf die übergebenen Parameter zuzugreifen. Um in einer HTML-Seite Applet-Parameter zu setzen, muss der PARAM-Parameter innerhalb des <APPLET>-Tags verwendet werden. Dieser besteht aus zwei Teilen: Dem Namen (NAME) und dem Wert (VALUE). Soll bspw. die Font-Größe des Applets aus Abb. 4-1 auf der Ebene der Webseite einstellbar sein, so lautet die HTML-Syntax: <APPLET CODE="Beispiel1.class" height=100 width=200> <PARAM NAME=groesse VALUE="24"> </APPLET> Sollen mehrere Parameter übergeben werden, so ist für jeden Parameter eine eigene Zeile anzugeben, deren Syntax jeweils folgendermaßen aussieht: <PARAM NAME=variablenname VALUE="Wert"> Beim Start eines Applets erfolgt die Übergabe der in der Webseite spezifizierten Parameter an das Applet. Die Parameter können mit Hilfe der Methode getParameter() aus der Methode init() abgefragt werden. init() wird jeweils bei der Initialisierung eines Applets durchlaufen und muss geeignet vom Programmierer überschrieben werden. getParameter() erwartet als Argument jeweils einen String und wird im obigen Beispiel folgendermaßen eingesetzt: String groessenname = getParameter("groesse"), Das Argument der Methode getParameter() muss hierbei exakt mit dem Parameter der Webseite übereinstimmen. Dies schließt die Groß- bzw. Kleinschreibung der Buchstaben des Parameters mit ein. Es ist weiterhin zu beachten, dass die Methode das Resultat null zurückliefert, wenn kein Parameter übergeben wurde. Dies kann an späteren Stellen des Programms zu Fehlern führen, weshalb sich grundsätzlich die Verwendung einer Fehlerprüfung empfiehlt, z. B. String groessenname = getParameter("groesse"); if (groessenname == null) groessenname = "10"; Abb. 4.3: Font-Applet Weiterhin ist zu beachten, dass die Methode getParameter() immer eine Zeichenkette zurückliefert. Diese kann aber im obigen Beispiel nicht zur Einstellung der Font-Größe verwendet werden, da in diesem Fall nur Argumente des Typs int zulässig sind. Zur Umwandlung des Datentyps (siehe hierzu Kapitel 3.3) muss daher eine geeignete Methode verwendet werden. Die korrekte Parameterübergabe stellt sich dann wie folgt dar: String groessenname = getParameter("groesse"),int groesse; if (groessenname == null) groessenname = "10"; groesse = Integer.parseInt(groessenname); Der vollständige Code des derart modifizierten Applets ist in Abb. 4-3 angegeben, die hierzu notwendige HTML-Seite in Abb. 4-4. Abb. 4.4: Font-Applet eingebettet in eine HTML-Seite