Programmieren in Java: Einführung


Kapitel 2: Java-Programme


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


2.1 Allgemeines

Programmtypen

Mit Java können verschiedene Arten von Programmen entwickelt werden. Grundsätzlich wird zwischen Applets und Applications unterschieden. Zwischen Applets und Applications ist Java Web Start angesiedelt, das aber technisch gesehen zu den Applications gerechnet werden kann. Java-Programme, die auf Webservern eingesetzt werden, heißen Servlets.

Applets sind Java-Programme, die in Webseiten eingebettet werden. Die meisten Beispiele in diesem Buch sind in Form von Applets entwickelt. Das hat den Vorteil, dass Sie per Mausklick das Beispiel-Programm sofort ausführen und ausprobieren können.

Applet ist ein Kunstwort aus Application und Snipplet. Es handelt sich also um eine Art Anwendungsschnippsel. Applets sind Anwendungen, die unter verschärften Sicherheitsbestimmungen laufen. Sie können von Applets aus zum Beispiel nicht auf die Festplatte zugreifen, um Dateien zu lesen oder zu schreiben. Sie können von Applets außerdem nicht beliebig Netzwerkverbindungen zu anderen Computern aufbauen, um über diese Daten zu senden oder zu empfangen. Diese Beschränkung der Fähigkeiten von Applets ist nötig, um Anwendern, die mit ihrem Browser im Internet surfen, keinen hohen Risiken auszusetzen. Würde sich kein Anwender darauf verlassen können, dass Java-Applets den Computer nicht in irgendeiner Form schädigen können, hätte sich Java in den 90er Jahren im Web nie durchgesetzt.

Applications sind vollwertige Java-Anwendungen, die uneingeschränkt alles das tun können, was auch in anderen Programmiersprachen wie C# oder C++ möglich ist. Applications müssen in irgendeiner Form vom Anwender installiert werden, bevor sie gestartet werden können.

Java Web Start versucht, die Vorteile beider Welten zu vereinen. So werden Anwendungen für Java Web Start ähnlich wie Applets aus dem Internet geladen. Anwendungen für Java Web Start haben ähnlich wie Applets eingeschränkte Rechte. Einmal heruntergeladen werden Anwendungen jedoch gecacht, also lokal gespeichert. Im Gegensatz zu Applets muss also nicht jedesmal zu einer Webseite gesurft werden, um das Applet zu starten, sondern Anwendungen für Java Web Start liegen lokal auf dem PC. Sie können auch völlig unabhängig vom Browser gestartet werden.

Wird eine Anwendung für Java Web Start heruntergeladen, und wurde diese Anwendung im Internet aktualisiert und liegt in einer neuen Version vor, so kann automatisch bei einem Start der lokalen Anwendung die neue Version aus dem Internet heruntergeladen werden. Der Vorteil gegenüber Applications ist also, dass Updates automatisch entdeckt und aufgespielt werden.

Bei Servlets handelt es sich um in Java entwickelte Anwendungen, die in Webserver eingebettet werden. So wie Applets innerhalb eines Browsers laufen, laufen Servlets in Webservern ab. Servlets werden eingesetzt, um im Internet interaktive Dienste zur Verfügung zu stellen. Wenn zum Beispiel Daten in ein Formular einer Webseite eingegeben werden und das Formular abgeschickt wird, können diese Daten von einem Java-Programm auf dem Webserver entgegengenommen und verarbeitet werden. Derartige Java-Programme werden Servlets genannt.

In diesem Kapitel werden Ihnen Applets, Applications, Anwendungen für Java Web Start und Servlets vorgestellt. Außerdem lernen Sie erste Grundlagen kennen, die für jede Java-Anwendung gelten - egal, ob es sich um ein Applet, eine Application, eine Anwendung für Java Web Start oder ein Servlet handelt.


2.2 Klassen-Definition

Alles ist Klasse

In Java basiert alles auf Klassen. Völlig egal, ob Sie ein Applet, eine Application, eine Anwendung für Java Web Start oder ein Servlet entwickeln, Sie haben es immer mit Klassen zu tun.

Eine Klasse ist ein Bauplan, die Beschreibung eines Objekts. In einer Klasse ist genau angegeben, was das Objekt, das die Klasse beschreibt, können soll. Die Beziehung zwischen Klasse und Objekt lässt sich vergleichen mit einem Grundriss, der ein Haus beschreibt. So wie der Grundriss alle wichtigen Details für ein Haus festlegt, legt die Klasse alles wichtige für ein Objekt fest. Und so wie kein Haus ohne Grundriss gebaut werden kann, können Sie auch in Java nicht ohne Klassen programmieren. Im nächsten Kapitel wird Ihnen der Unterschied zwischen Klassen und Objekten genau erläutert.

Jede Java-Anwendung besteht aus mindestens einer Klasse. Wenn Sie in Java programmieren, ist es Ihr Job, Klassen zu erstellen. Sie gehen dabei grundsätzlich wie folgt vor.

class MyClass 
{ 
} 

Eine Klasse wird in Java immer mit dem Schlüsselwort class definiert. Hinter dem Schlüsselwort muss ein Name für die Klasse angegeben werden. Der Name kann beliebig lauten. Die Klassendefinition folgt hinter dem Namen und steht zwischen geschweiften Klammern.

Wenn Sie Ihren Java-Quellcode speichern, müssen Sie - das ist zwingend festgeschrieben - die Datei genau so nennen wie die Klasse. Wenn die Klasse MyClass heißt, dann muss die Datei MyClass.java heißen. Außerdem dürfen Sie in einer Datei immer nur eine Klasse definieren. Möchten Sie eine zweite Klasse erstellen, müssen Sie sie in einer zweiten Datei speichern.

public class MyClass 
{ 
} 

Jede Klasse erhält ein Zugriffsattribut. Zugriffsattribute legen fest, ob und wie andere Klassen auf die eigene Klasse zugreifen können. Normalerweise wird für Klassendefinitionen das Zugriffsattribut public gesetzt. Geben Sie kein Zugriffsattribut vor class an, wird standardmäßig package verwendet. Welche Zugriffsattribte es gibt und welchen Sinn Zugriffsattribute haben, erfahren Sie im Kapitel 5, Zugriffsattribute.

Welche Einstellungen im Zusammenhang mit Klassen noch vorgenommen werden können, wird Ihnen im Kapitel 6, Klassen gezeigt.


2.3 Klassenhierarchien und Pakete

Vererbung von Fähigkeiten und thematische Gliederung

Sie wissen bereits, dass Java nicht nur eine Programmiersprache ist, sondern dass zu Java standardmäßig eine Klassenhierarchie gehört. Eine Klassenhierarchie ist eine Ansammlung an Klassen, die in Beziehung zueinander stehen. Wie sehen Beziehungen zwischen Klassen aus?

Klassenhierarchien sind so aufgebaut, dass es jeweils Eltern- und Kindklassen gibt. Eine Elternklasse hat hierbei eine oder mehrere Kindklassen. Die Kindklassen ihrerseits haben auch wieder eine oder mehrere Kindklassen. Auf diese Weise entsteht eine Verästelung, und jede Klasse hängt von einer anderen Klasse ab. Der Fachbegriff der Objektorientierung lautet Vererbung. Eine Elternklasse gibt ihre Fähigkeiten an ihre Kindklasse weiter. Die Kindklasse erhält also die Fähigkeiten von ihrer Elternklasse und kann zusätzlich weitere Fähigkeiten definieren. Die durch Vererbung erhaltenen Fähigkeiten der Elternklasse und die eigenen Fähigkeiten können durch Vererbung an eine weitere Kindklasse weitergegeben werden.

Die Elternklasse, mit der in Java die Klassenhierarchie startet und die die oberste Elternklasse für alle anderen Klassen darstellt, ist Object. Nachdem die Klassenhierarchie in Java aus relativ vielen Klassen besteht, die alle in irgendeiner Weise miteinander verwandt sind, hat Sun die Klassen in unterschiedliche Pakete eingeteilt - oder Packages, wie sie in englischsprachiger Literatur genannt werden. So besteht zum Beispiel Java 6 aus gut 200 Paketen, und jedem dieser Pakete sind Klassen zugeordnet. Diese Zuordnung findet hierbei thematisch statt. Wenn ein Entwickler also beispielsweise eine Klasse sucht, mit der er Daten über das Internet senden kann, braucht er nicht die gesamte Klassenhierarchie durchsuchen, sondern wirft einen Blick ins Paket net. Denn in diesem Paket liegen alle Klassen, die Funktionen im Zusammenhang mit Netzwerken anbieten.

Die Pakete werden ihrerseits in eine Art Pakethierarchie gepackt. So gehörten alle Pakete in Java 1.0 und Java 1.1 zu einer Hierarchie namens java. Der Paketname wird dabei einfach über einen Punkt hinter java angehängt. Das Paket java.net liegt also in der Klassenhierarchie java und enthält Klassen, die im Zusammenhang mit Netzwerken hilfreiche Funktionen anbieten.

Mit Java 1.2 hat Sun eine zweite Hierarchie eingeführt, die javax heißt. So wurden in Java 1.2 zum Beispiel alle Swing-Klassen - also Klassen der zum damaligen Zeitpunkt neu eingeführten Bibliothek zur Entwicklung grafischer Benutzeroberflächen - in Pakete abgelegt, die sich alle in der Hierarchie javax befinden. Inzwischen befinden sich in der javax-Hierarchie tatsächlich mehr Pakete als in der älteren java-Hierarchie. Die Einteilung in zwei Hierarchien soll Sie aber nicht weiter verwundern - so hat sich die Klassenbibliothek in Java einfach entwickelt.

Die oberste Klasse in der Klassenhierarchie, Object, liegt im Paket java.lang. In diesem Paket liegen Klassen, die einfach die Programmiersprache Java an sich unterstützen. Das Paket heißt java.lang, weil lang für language steht - also die Java-Programmiersprache.

Nachdem Klassen Paketen zugeordnet sind, gibt man normalerweise den kompletten Paketnamen zusätzlich zum Klassennamen an. Die Klasse Object wird normalerweise als java.lang.Object angegeben. Es wird also der Klassenname hinter den Paketnamen gesetzt und beides wieder durch einen Punkt getrennt.

Während Paketnamen mit Kleinbuchstaben beginnen, fangen Klassennamen für gewöhnlich mit einem Großbuchstaben an. Die genaue Schreibweise müssen Sie in Java-Programmen beachten, da Java zwischen Groß- und Kleinschreibung unterscheidet.

Wer ein Applet entwickeln will, muss seine eigene Klasse in die Klassenhierarchie von Java einbinden. Es gibt eine Klasse in Java, deren einziger Sinn es ist, den Java-Entwickler beim Erstellen von Java-Applets zu unterstützen. Diese Klasse ist java.applet.Applet. Die Klasse Applet liegt also im Paket java.applet. Wenn Sie sich dieses Paket in der Dokumentation ansehen, stellen Sie fest, dass Applet die einzige Klasse in diesem Paket ist.

Wie binden wir nun unsere Klasse MyClass in die Klassenhierarchie ein? Wie verknüpfen wir unsere Klasse MyClass mit java.applet.Applet? Wir leiten unsere Klasse MyClass von java.applet.Applet ab. Das heißt, java.applet.Applet wird unsere Elternklasse, und MyClass die Kindklasse. Damit hängen wir unsere Klasse in die Klassenhierarchie von Java hinein.

public class MyClass extends java.applet.Applet 
{ 
} 

Für die Entwicklung eines Applets muss der Code erweitert werden. Hinter dem Klassennamen MyClass wird das Schlüsselwort extends angegeben und hinter diesem ein Klassenname. Dies ist der Weg, wie in Java eine Elternklasse ihre Fähigkeiten an eine Kindklasse weitergeben kann. MyClass ist nun die Kindklasse von der Elternklasse java.applet.Applet.

Wir hatten gesagt, dass Klassen Paketen zugeordnet sind und daher Klassen auch immer über ihr Paket adressiert werden, indem nicht nur der Klassenname, sondern auch der Paketname angegeben wird. Das bedeutet für den Entwickler jedoch eine Menge Tipparbeit, wenn wiederholt auf Klassen zugegriffen werden muss. So müsste jedesmal java.applet.Applet komplett angegeben werden, wenn diese Klasse genutzt werden soll.

Glücklicherweise gibt es eine Möglichkeit, sich die Tipparbeit ein wenig zu erleichtern.

import java.applet.Applet; 

public class MyClass extends Applet 
{ 
} 

In der ersten Zeile wird über das Schlüsselwort import die Klasse java.applet.Applet importiert. Das bedeutet, dass nachfolgend im Code auf diese Klasse nicht mehr über den kompletten Paketnamen zugegriffen werden muss, sondern die Angabe des Klassennamens ausreicht. Das ist der Grund, warum nun hinter extends die Klasse Applet ohne Paketnamen angegeben ist. Der Java-Compiler findet die Klasse Applet dank der import-Anweisung in der ersten Zeile automatisch im Paket java.applet.

Wenn auf mehrere Klassen im Code zugegriffen werden muss, die alle im gleichen Paket liegen, ist es nicht nötig, jede Klasse einzeln mit einer import-Anweisung bekannt zu machen.

import java.applet.*; 

public class MyClass extends Applet 
{ 
} 

Wenn Sie anstelle eines Klassennamens ein Sternchen in einer import-Anweisung angeben, werden automatisch alle Klassen aus dem angegebenen Paket importiert und bekannt gemacht. Im obigen Beispiel wäre es nun möglich, ohne Angabe des Paketnamens auf sämtliche Klassen, die im Paket java.applet liegen, direkt über ihren Namen zuzugreifen.


2.4 Applets

Internet-Anwendungen

Ein Applet ist ein Java-Programm, das in Webseiten eingebettet wird. Es hat grundsätzlich folgenden Aufbau.

import java.applet.*; 

public class MyApplet extends Applet 
{ 
  public void init() 
  { 
  } 

  public void start() 
  { 
  } 

  public void stop() 
  { 
  } 

  public void destroy() 
  { 
  } 
} 

Ein Applet besteht aus einer Klasse, die der Klasse java.applet.Applet untergeordnet werden muss. Die Klasse java.applet.Applet muss also die Elternklasse sein - das ist für Java-Applets zwingend vorgeschrieben.

Zwischen die geschweiften Klammern Ihrer Klasse, im obigen Beispiel MyApplet genannt, können nun vier Funktionen eingefügt werden, die für Applets eine große Bedeutung haben. Die vier Funktionen heißen init(), start(), stop() und destroy(). Den genauen Aufbau von Funktionen lernen Sie im Kapitel 4, Funktionen kennen. Es reicht, wenn Sie sich momentan Funktionen einfach als eine Ansammlung von Befehlen vorstellen, die zu einer Gruppe zusammengestellt werden und über den Funktionsnamen aufgerufen werden können.

Im obigen Beispiel sind alle vier Funktionen leer. Sie erkennen das daran, dass zwischen den geschweiften Klammern der Funktionen keine Befehle angegeben sind. Ein Paar geschweifter Klammern einer Funktion nennt man übrigens einen Anweisungsblock.

Die vier Funktionen namens init(), start(), stop() und destroy() spielen für Java-Applets eine wichtige Rolle. Wenn nämlich der Browser eine Webseite lädt, in der ein Java-Applet eingebunden ist, ruft der Browser automatisch die vier Funktionen in ganz bestimmten Situationen auf, um das Applet zu informieren, dass etwas passiert ist.

Die Funktion init() wird automatisch vom Browser aufgerufen, wenn das Applet zum ersten Mal geladen wird. Die Funktion start() wird automatisch vom Browser aufgerufen, wenn das Applet gestartet werden soll. Die Funktion stop() wird automatisch vom Browser aufgerufen, wenn das Applet gestoppt werden soll. Die Funktion destroy() wird automatisch vom Browser aufgerufen, wenn das Applet aus dem Speicher gelöscht wird.

Sinn und Zweck der Funktionen ist folgender: Surft jemand auf Ihre Webseite, in der Sie Ihr Java-Applet eingebunden haben, ruft der Browser des Anwenders zuerst die Funktion init() auf. Ihr Applet hat nun die Möglichkeit, sich zu initialisieren und notwendige Vorkehrungen zu treffen, um ordentlich starten zu können. Ist init() beendet, ruft der Browser automatisch start() auf. Mit dieser Funktion startet Ihr Applet nun richtig, und die Anwendung beginnt zu laufen.

Der Anwender hat irgendwann genug von Ihrem Applet, surft weiter im Internet und wechselt auf eine andere Webseite. Das heißt, Ihr Applet verschwindet aus dem Browser-Fenster. Der Browser meldet dem Applet, dass es nicht mehr angezeigt und benötigt wird, und ruft automatisch die stop()-Funktion im Applet auf. So können Sie entsprechende Vorkehrungen in der stop()-Funktion treffen, dass das Applet tatsächlich stoppt.

Die Funktion stop() könnte auch in anderen Situationen automatisch aufgerufen werden. In Ihrem Applet läuft beispielsweise eine kleine Animation ab. Der Anwender guckt sich diese Animation an und verkleinert dann irgendwann sein Browser-Fenster, so dass es in der Windows-Taskleiste verschwindet. In diesem Moment ist Ihr Applet gar nicht mehr auf dem Bildschirm zu sehen. Der Browser ruft also die stop()-Funktion auf. Sie können nun die stop()-Funktion so definieren, dass die Animation nicht weiter ausgeführt wird - es sieht sie ja gerade sowieso keiner.

Klickt der Anwender auf den Browser, um ihn von der Taskleiste wieder auf den gesamten Bildschirm zu holen, ruft der Browser automatisch die start()-Funktion auf. Während die init()-Funktion nur ein einziges Mal für ein Applet aufgerufen wird, kann die start()- wie auch die stop()-Funktion mehrmals aufgerufen werden. Ihre start()-Funktion ist im Beispiel mit der Animation so definiert, dass sie die Animation wieder zum Leben erweckt, die vorher durch die stop()-Funktion angehalten wurde.

Der Anwender macht nun Feierabend und schließt seinen Browser. Bei diesem Vorgang wird der Browser komplett aus dem Speicher gelöscht und alle geladenen Applets natürlich auch. In diesem Fall ruft der Browser nochmal eine Funktion automatisch auf - nämlich destroy(). Diese Funktion kann verwendet werden, um Aufräumarbeiten zu erledigen. Sie stellt also das Gegenstück zu init() dar: Während init() beim Laden des Applets aufgerufen wird und die Initialisierung durchführt, wird destroy() beim Löschen des Applets aus dem Speicher aufgerufen und kann Aufräumarbeiten durchführen.

Soweit die Theorie. Die Praxis sieht so aus, dass man als Applet-Entwickler nie genau weiß, wann und wie oft die vier Funktionen aufgerufen werden. Man muß zum Beispiel damit rechnen, dass der Browser init() nicht nur einmal ausführt, sondern jedesmal, wenn der Browser zur entsprechenden Webseite mit dem Applet zurückkehrt - und wo eigentlich nur mehr start() aufgerufen werden sollte. In den allermeisten Fällen ist das jedoch glücklicherweise kein Problem.

Funktionen wie die eben vorgestellten heißen Event-Handler. Event-Handler sind Funktionen, die aufgerufen werden, wenn ein Event - also ein Ereignis - eintritt. Event-Handler fangen das Ereignis ab und reagieren auf das Ereignis. Wie diese Reaktion auf ein Ereignis aussieht, hängt davon ab, wie die Event-Handler - also die Funktionen - jeweils von Ihnen programmiert sind. So wie im obigen Beispiel würde bei Eintreten der Ereignisse gar nichts passieren, weil alle vier Funktionen leer sind und keine Anweisungen zwischen den geschweiften Klammern enthalten.

Nochmal zur Verdeutlichung: Wenn der Browser zum Beispiel die Funktion stop() im Applet aufruft, dann bedeutet das nicht, dass das Applet angehalten wird. Ein Aufruf von stop() bedeutet, dass das Applet sich nun selber anhalten kann, da es momentan sowieso nicht zu sehen ist, weil der Browser zum Beispiel die Webseite mit dem Applet gar nicht mehr anzeigt. Ob Sie das Applet bei einem Aufruf von stop() tatsächlich anhalten oder nicht, bestimmen Sie. Sie geben zwischen den geschweiften Klammern von stop() die Befehle an, die ausgeführt werden soll, wenn diese Funktion automatisch aufgerufen wird. Ob Sie aber das Applet in irgendeiner Form anhalten oder nicht, entscheiden Sie ganz alleine.

In Java gibt es eine ganze Reihe von Event-Handlern. Sie können also nicht nur Ereignisse im Zusammenhang mit dem Browser abfangen, sondern auch noch auf andere Ereignisse reagieren. Welche das sein werden, werden Sie noch im Laufe der Kapitel erfahren.

Beachten Sie, dass das obige Beispiel auf dem AWT basiert - der Klassenhierarchie zur Entwicklung grafischer Benutzeroberflächen, die seit der ersten Version Bestandteil der Java-Bibliothek ist. Die Swing-Klassenhierarchie, die mit Java 1.2 eingeführt wurde, bietet eine eigene Klasse javax.swing.JApplet an, bei der es sich übrigens um eine Kindklasse von java.applet.Applet handelt.


2.5 Applications

Vollwertige Anwendungen

Während Java-Applets nur dann funktionieren, wenn sie in Webseiten eingebettet werden, werden Applications unabhängig vom Browser verwendet. Applications sind ganz normale Anwendungsprogramme, die selbständig gestartet und beendet werden können. Selbstverständlich benötigen aber auch Applications eine Java-VM.

import java.lang.*; 

public class MyApplication 
{ 
  public static void main(String[] args) 
  { 
    System.out.print("Hallo, Welt!"); 
  } 
} 

Oben sehen Sie eine einfache Java-Anwendung, die lediglich Hallo, Welt! auf den Bildschirm ausgibt, wenn sie gestartet wird. Um das Programm auszuführen, müssen Sie den Quellcode in eine Textdatei schreiben und die Datei als MyApplication.java speichern. Übersetzen Sie den Code mit Hilfe eines Java-Compilers, der als Ergebnis die Datei MyApplication.class erstellt. Um diese Klasse, die das Programm darstellt, nun zu starten, müssen Sie sie im Zusammenhang mit einer virtuellen Maschine aufrufen. Die virtuelle Maschine aus dem JDK von Sun wird über ein Programm namens java gestartet. Um Ihre Application laufen zu lassen, geben Sie in der MS-DOS-Eingabeaufforderung folgendes ein: java MyApplication.

Wie Applets bestehen auch Applications aus mindestens einer Klasse, im obigen Beispiel MyApplication genannt. Im Gegensatz zu Applets ist es jedoch nicht notwendig, die Klasse in die Klassenhierarchie von Java einzuordnen und sie in eine Eltern-Kind-Beziehung zu einer anderen Klasse einzubinden. Die einzige Voraussetzung, die für Applications erfüllt sein muss, ist: Sie müssen eine Funktion namens main() definieren. Die Funktion main() muss so definiert sein, dass die Schlüsselwörter public und static angegeben sind. Sie müssen ausserdem in die runden Klammern von main() die Angabe String[] args stellen. Sinn und Zweck der Schlüsselwörter public und static und die Bedeutung der Angabe in den runden Klammern werden Ihnen im Laufe der Kapitel noch erklärt.

Wenn eine Application gestartet wird, wird automatisch die Funktion main() aufgerufen. Die Application wird dann beendet und geschlossen, wenn die Funktion main() endet und alle Befehle in dieser Funktion abgearbeitet wurden. Im Gegensatz zu Applets gibt es also keine Event-Handler, die die Application bei Eintreten verschiedener Ereignisse informieren, sondern nur die Funktion main().

Im obigen Beispiel wird in der Funktion main() auf eine Klasse java.lang.System zugegriffen. Innerhalb von main() erfolgt der direkte Zugriff auf diese Klasse nur über den Klassennamen System, da bereits sämtliche Klassen aus dem Paket java.lang über die import-Anweisung in der ersten Zeile bekannt gemacht wurden.

Die Klasse java.lang.System ermöglicht den Zugriff auf Standardfunktionen eines Computers. So bietet diese Klasse zum Beispiel ein Objekt namens out an, über das auf die sogenannte Standardausgabe zugegriffen wird. Die Standardausgabe ermöglicht es, recht einfach Daten auf den Bildschirm auszugeben. Dazu wird für das Objekt out die Funktion print() aufgerufen. Die Daten, die in Anführungszeichen zwischen den Klammern an print() übergeben werden, werden auf die Standardausgabe des Computers - also auf den Monitor - ausgegeben.

Selbstverständlich ist es möglich, anstatt Daten über die Standardausgabe auszugeben diese in komfortablen Fenster-Anwendungen dem Anwender zu präsentieren. Dazu greifen Sie auf AWT- oder Swing-Klassen zu. Sowohl AWT als auch Swing werden im Buch Programmieren in Java: Aufbau ausführlich vorgestellt.


2.6 Java Web Start

Das Beste von Applets und Applications

Java-Anwendungen, die für Java Web Start entwickelt werden, sind eigentlich ganz normale Applications, wie sie in diesem Kapitel bereits vorgestellt wurden. Java Web Start ist genaugenommen ein Verfahren für die Verteilung von Applications über Netzwerke. Es existiert seit Java 1.2 und versucht, Vorteile von Applets und Applications zu vereinen.

Zu den Vorteilen von Applets gehört, dass der Anwender jeweils die aktuelle Version des Applets benutzt. Er muss ja jedesmal die entsprechende Webseite mit dem eingebundenen Applet aufrufen, und wenn das Applet zwischenzeitlich seit seinem letzten Besuch geändert und erweitert wurde, erhält er sofort die aktuelle Version des Applets und kann mit ihr arbeiten. Die Notwendigkeit, jedesmal eine Webseite aufrufen zu müssen, um ein Programm herunterzuladen, ist gleichzeitig auch ein Nachteil. Weil Applets in Sandboxen laufen und ihre Möglichkeiten stark eingeschränkt sind, besteht nicht die Gefahr, dass Applets zum Beispiel Dateien auf Ihrer Festplatte löschen. Applets dürfen standardmäßig nicht auf die Festplatte zugreifen. Dieser Vorteil, nämlich das gefahrlose Ausführen von Applets, gilt auch für Anwendungen unter Java Web Start.

Applications besitzen im Gegensatz zu Applets den Vorteil, dass sie einmal installiert ständig zur Verfügung stehen, ohne jedesmal im Netzwerk eine Webseite aufrufen zu müssen und das Programm erst herunterzuladen. Applications setzen aber voraus, dass der Anwender sie installieren muss, bevor er sie nutzen kann. Dahingegen ist ein Sprung auf eine Webseite, in der ein Applet eingebunden ist, viel bequemer, erfordert er doch keine Installation des Applets. Außerdem erhalten Sie bei Applets immer die aktuelle Version des Programms. Eine einmal installierte Application kann sich aber nicht selbstständig aktualisieren, wenn im Internet neue Versionen des Programms zur Verfügung stehen.

Java Web Start vereint die Vorteile von Applets und Applications. Mit Java Web Start entfällt die Installation von Anwendungen, und auch Updates auf neuere Versionen von Anwendungen werden vollautomatisch aufgespielt. Gleichzeitig können Anwendungen unabhängig vom Browser benutzt werden. Selbst eine Netzwerkverbindung ist nicht notwendig, um ein einmal benutztes Programm unter Java Web Start ein weiteres Mal zu verwenden. Ohne Netzwerkverbindung ist es Java Web Start aber selbstverständlich nicht möglich, im Internet nach neuen Versionen des Programms Ausschau zu halten.

Um Anwendungen unter Java Web Start zu nutzen, müssen sie grundsätzlich als Application entwickelt werden. Die Funktion, mit der eine Anwendung unter Java Web Start also zu laufen beginnt, ist main().

Darüberhinaus müssen eine Reihe von Voraussetzungen erfüllt sein, damit eine Application tatsächlich unter Java Web Start läuft. So darf die Application nicht versuchen, auf die Festplatte des Computers zuzugreifen oder Netzwerkverbindungen zu beliebigen anderen Computern aufzubauen. Sie muss sich also an die gleichen Einschränkungen halten wie Java-Applets. Außerdem müssen sämtliche Dateien einer Application für Java Web Start in sogenannten JAR-Archiven vorliegen. Sämtliche class-Dateien, Grafiken, Textdateien und sonstige Dateien, die die Application benötigt, werden hierbei zu einer einzigen Datei zusammengepackt, dem JAR-Archiv. Das JDK von Sun enthält ein Programm namens jar, mit dem sich Dateien zu JAR-Archiven zusammenstellen lassen.

Java Web Start funktioniert aus Anwendersicht wie folgt: Der Anwender surft zu einer Webseite, auf der ihm ein Link angeboten wird, der eine Java-Anwendung für Java Web Start starten soll. Wenn der Anwender im Browser den Link anklickt, wird eine sogenannte JNLP-Datei heruntergeladen. Die Abkürzung JNLP steht für Java Network Launching Protocol. Wenn der Anwender auf seinem System Java Web Start installiert hat, wird automatisch die zentrale Steuerungssoftware von Java Web Start gestartet, an die der Browser die heruntergeladene JNLP-Datei weiterleitet. Java Web Start nimmt die JNLP-Datei entgegen und liest sie. In dieser Datei ist unter anderem die genaue Adresse der Java-Application enthalten, die gestartet werden soll. Java Web Start untersucht nun, ob die Java-Application bereits installiert ist oder erst heruntergeladen werden muss. Wenn die Anwendung bereits installiert ist, wird sie sofort gestartet. Ansonsten kümmert sich Java Web Start um den Download der Anwendung, legt sie in Java Web Start ab und startet sie dann. Der Browser kann ab dem Zeitpunkt, an dem die JNLP-Datei an Java Web Start weitergereicht wird, geschlossen werden. Über die zentrale Steuerungssoftware von Java Web Start kann die heruntergeladene Anwendung später jederzeit gestartet werden, ohne den Browser aufzurufen. Sie finden sie unter Windows in der Systemsteuerung.

Um die Einschränkungen von Anwendungen unter Java Web Start ein wenig zu mildern, die ebenso wie Java-Applets in einer Sandbox ablaufen, gibt es speziell für Java Web Start ein Paket namens javax.jnlp. In javax.jnlp liegen etwa ein Dutzend Klassen, über die die rigiden Beschränkungen der Sandbox etwas abgemildert werden. So haben Sie beispielsweise immer noch keinen uneingeschränkten Zugriff auf die Festplatte. Sie können aber über die Klasse javax.jnlp.FileSaveService den Anwender fragen, ob Daten in einer bestimmten Datei auf der lokalen Festplatte gespeichert werden dürfen. Vertraut der Anwender Ihnen und Ihrer Anwendung, lässt er den Speichervorgang möglicherweise zu. Derartiges ist mit Java-Applets unmöglich.

Seit Java 1.4 wird Java Web Start standardmäßig ausgeliefert. Das bedeutet in der Praxis, dass Java Web Start überall dort verfügbar ist, wo Java bereits eingesetzt wird. So können Sie ohne weiteres Demo-Anwendungen für Java Web Start ausprobieren.

Für die Entwicklung von Anwendungen für Java Web Start bot Sun ein kostenloses JNLP Developer's Pack zum Download an, das sämtliche Informationen und Hilfsprogramme enthielt, um Anwendungen für Java Web Start zu entwickeln und diese im Internet Anwendern zur Verfügung zu stellen. Seit Java 1.5 wird das JNLP Developer's Pack nicht mehr als eigenständiger Download angeboten, sondern wird standardmäßig mit dem JDK installiert. So finden Sie die Datei jnlp.jar im Unterordner sample\jnlp\servlet des JDK-Installationsverzeichnisses.


2.7 Servlets

Java-Programme auf dem Webserver

Servlets werden eingesetzt, um Programme in Java zu entwickeln, die interaktive Dienste im Internet zur Verfügung stellen. Wurde Java zu Beginn im Web eingesetzt, um Client-Anwendungen auf Basis von Applets zu entwickeln, ist Java heute im Web vor allem im Serverbereich im Einsatz. Java hat dort im Gegensatz zu anderen Technologien wie beispielsweise CGI den Vorteil, ressourcenschonender zu arbeiten. Obwohl Servlets in Java programmiert nach wie vor nur mit Unterstützung einer virtuellen Maschine laufen, ermöglicht das Konzept, das hinter Servlets steckt, eine ressourcenfreundlichere Arbeitsweise als es bei CGI-Anwendungen der Fall ist. Da Servlets außerdem auf dem Webserver arbeiten, setzen sie keine beim Anwender installierte Java-Version voraus. Der Entwickler muss lediglich sicherstellen, dass auf dem Webserver, auf dem Servlets eingesetzt werden, die von ihm benötigte Java-Version zur Verfügung steht. Die Java-Version des Anwenders, der mit seinem Browser Webseiten vom Webserver abruft, spielt keine Rolle. Er muss noch nicht einmal Java installiert haben, da Servlets ausschließlich auf dem Server laufen.

Um Servlets entwickeln zu können, benötigen Sie ein Paket namens javax.servlet, in dem zahlreiche für die Entwicklung von Servlets notwendige Klassen liegen. Die Java Servlet Technologie steht auf Suns Website zum Download zur Verfügung. Anstatt das Paket einzeln herunterzuladen, können Sie auch die Enterprise Edition des JDK verwenden, in dem sich das Paket befindet. Weil die Enterprise Edition eine Plattform ist, um unter anderem Serveranwendungen zu entwickeln, bietet es sich an, diese Edition zu verwenden anstatt das Paket javax.servlet einzeln herunterzuladen und mit der Standard Edition des JDKs einzusetzen.

Die Entwicklung von Servlets erfordert tiefergehende Kenntnisse im Zusammenhang mit Webservern, dem Protokoll HTTP und der Funktionsweise, wie Browser und Webserver zusammenspielen. Im Rahmen dieses Buchs wird die Entwicklung von Servlets nicht behandelt.