Die Konzepte, die im Folgenden beschrieben werden, sind teilweise umfangreich und erstrecken sich über eine Vielzahl von Gebieten der Informatik, bspw. Datenbanken, Verteilte Systeme, multimediale Datenverarbeitung und Netzwerke. An dieser Stelle soll daher zunächst der dem Buch zugrunde liegende „rote Faden" erläutert werden, anhand dessen sich der Leser orientieren kann. Zielkreis Zum Zielkreis des Buches zählen wir alle Interessierten, die zum einen die Sprache Java, aber auch die hiermit verwandten Technologien kennenlernen wollen. Es versteht sich von selbst, dass man im eingeschränkten Rahmen eines derartigen Buches nicht jede verwendete Technik bis ins letzte Detail beschreiben kann. Der erfahrene Programmierer, der von Zeit zu Zeit ein selten auftretendes technisches Detail nachschlagen will, und der das Buch als Referenzwerk verwenden möchte, gehört daher eher weniger zu dem Zielkreis, den wir Autoren mit diesem Werk ansprechen wollen. Es ist unser besonderes Anliegen, die Funktionsweisen der einzelnen der in diesem Buch vorgestellten Themen detailliert zu erklären und darüber hinaus, das Zusammenspiel dieser Komponenten zu beleuchten. Von daher ist unser erklärter Zielkreis in all denen zu sehen, die Einblicke in das hinter Java stehende Konzept gewinnen wollen. Wir richten uns damit speziell auch an Studenten, die durch dieses Buch die Java-Technologie erlernen wollen. Besonderheit des Buches Die bisher über Java verfügbare Literatur behandelt entweder einzelne Themen, wie die Sprache Java selbst oder das Zusammenspiel mit Datenbanken und CORBA oder ist als Referenzwerk der Programmierung geschrieben. Mit diesem Buch möchten wir einen Rahmen aufspannen, der die derzeit verfügbaren wichtigen Einzelaspekte der Java-Technologie beinhaltet. Diese sollen weder zu oberflächlich oder nur konzeptionell erläutert werden, noch in einer derartigen epischen Breite, dass der Zusammenhang mit den anderen Teilen des Buches in Vergessenheit gerät. Wir werden daher an vielen Stellen der folgenden Kapitel auf die Zusammenhänge bzw. auf interne Wechselwirkungen der Komponenten dediziert aufmerksam machen. Einen großen Nachteil vieler am Markt etablierter Werke sehen wir insbesondere darin, dass eine Vielzahl von Beispielen verwendet wird, um Programmierkonstrukte anschaulich zu erklären. Dies erfolgt zwar oftmals in guter Absicht; die jeweiligen Autoren stellen allerdings selten einen Zusammenhang zwischen den Beispielen her. In vielen Büchern findet man daher zwar zu jeder grafischen Realisierung einer Benutzerschnittstelle ein anschauliches Beispiel, es wird aber oftmals versäumt, die verschiedenen Layout-Möglichkeiten anhand desselben Beispiels darzustellen. Dies hat aber den großen Nachteil, dass der Leser keine Vergleiche anstellen kann und so im Grunde genommen die tatsächlichen Unterschiede nicht erfasst. Eine wesentliche Besonderheit dieses Buches liegt daher darin, dass ein einziges Beispiel konsistent in allen Kapiteln verwendet wird. Offensichtlich ist es keine triviale Aufgabe, eine Anwendung zu finden, die auf derart unterschiedlichen Konzepten wie Java, Datenbanken, grafischer Gestaltung und CORBA einsetzbar ist. In diesem Buch soll für diese Aufgabe das Spiel „Schiffe versenken" realisiert werden. Anhand dieser Anwendung können sowohl verschiedene Layout-Strategien erklärt werden, als auch eine Anbindung an Datenbanken erreicht werden, in denen die Spielergebnisse abgelegt werden. Auch die Verwendung von JavaBeans, Swing und Servlets lässt sich hier gut einordnen. Sicherlich mögen einige Realisierungen, wie bspw. die CORBA-Anwendung, etwas konstruiert erscheinen. Durch die explizite Verwendung einer einzigen Anwendung ist jedoch das Zusammenspiel der Komponenten und die Vergleichbarkeit verschiedener alternativ einsetzbarer Konzepte am besten zu zeigen. Der grundsätzliche Aufbau dieses Buches ist daher an diesem zentralen Beispiel orientiert. Aufbau des Buches Es liegt auf der Hand, dass ein in der Programmierung von Java unerfahrener Anwender nicht in der Lage ist, die Sprache zu erlernen, ohne die notwendige Theorie zu beherrschen. Die folgenden Kapitel sind daher derart strukturiert, dass zunächst theoretische Grundlagen vermittelt werden, die anschließend anhand eines Bausteins des Spiels „Schiffe versenken" trainiert werden. Die im Folgenden erläuterten Bausteine lassen sich aus Abb. 1-13 entnehmen. Zentrale Idee der Konzeption ist es, ein Programmpaket zu verwenden, bei dem von Kapitel zu Kapitel einzelne Komponenten ausgetauscht werden, um die Funktion der im jeweiligen Kapitel beschriebenen Theorie zu verdeutlichen. Abb. 1.13: Anwendungskomponenten des Buches Nach einer einführenden Betrachtung objektorientierter Programmierkonzepte bzw. der Darstellung von Aspekten des Software-Engineering und der Software-Wiederverwendbarkeit in Kapitel 2 wird in Kapitel 3 zunächst die grundlegende Funktionsweise der Sprache Java erläutert, einschließlich der Betrachtung von Ausnahmeroutinen und der Einbindung von native Code in Java-Programme. Die hierzu notwendige Verwendung von Konstanten, Variablen und Programmkonstrukten wird daher anhand des „Schiffe-versenken"-Servers erklärt, gegen den eine beliebige Anzahl von Spielern simultan spielen können. In Kapitel 4 werden die Aspekte der grafischen Programmierung in Java behandelt, hierbei vor allem die Gestaltung des Layouts einer Benutzeroberfläche, der Einbezug multimedialer Elemente wie Ton und Video bzw. Java-2D und die Verwendung und Verarbeitung von Events, sowie die JAR-Technologie. Hierbei liegt eine besondere Betonung auf der Vergleichbarkeit der verschiedenen Layout-Strategien, die zur Entwicklung der Oberfläche der Clients verwendet werden kann. Die wichtigen Aspekte der Sicherheitsfunktionalität, der Netzwerkfunktionen von Java und des Streamings werden anhand einer Client-Server-Implementierung in Kapitel 5 erläutert. Das Konzept der Internationalisierung von Java-Anwendungen ist Thema von Kapitel 6. Im darauf folgenden Anwendungsteil wird in Kapitel 7 die Entwicklung einer ersten Version des Spiels „Schiffe versenken" vorgestellt, also der als Java-Application implementierte Server und die als Java-Applets realisierten Clients. Die Anwendung aus Kapitel 7 wird im Folgenden als Basis für Programm-Modifikationen verwendet. Anschließend wird in Kapitel 8 Java-Swing erläutert, mit dessen Hilfe Benutzeroberflächen auf eine elegante Art und Weise gestaltet werden können. Nach einer Betrachtung der Möglichkeiten von Swing wird die Benutzeroberfläche der Clients derart verändert, dass das in Kapitel 8 „von Hand" entwickelte Design nun mittels Swing realisiert wird. Das restliche Programmpaket bleibt hierbei vollkommen unverändert. Kapitel 9 beschäftigt sich mit der detaillierten Darstellung des JavaBeans-Konzepts, mittels dessen Programme als Komponenten realisiert werden können. In diesem Kapitel werden zunächst die Eigenschaften der Beans vorgestellt. Hierzu gehört das Beans-Konzept sowie die Entwicklung von Beans in der BeanBox. Anschließend wird die Verarbeitung von Beans mittels deren Eigenschaften und mittels Events näher betrachtet. Weitere Themen von Kapitel 9 sind der Eigenschaften-Editor, der sog. Property-Editor und die Persistenz von Beans, worunter das konsistente Speichern und Laden von Beans verstanden wird. Im praktischen Teil dieses Kapitels wird die Client-Komponente des Spiels derart modifiziert, dass sie nicht länger als Java-Applet, sondern als Bean funktioniert. Auch hierbei bleiben die restlichen Programmpakete unverändert. Mit dem Ende von Kapitel 9 ist die eigentliche Darstellung der Kernbereiche von Java abgeschlossen, wenn man darunter die Entwicklung von Programmen versteht, die als Client oder als Server fungieren und zu deren Realisierung verschiedene Konzepte eingesetzt werden können. Die nun folgenden Kapitel 10, Kapitel 11, Kapitel 12 und Kapitel 13 behandeln mit Datenbanken, der Remote Method Invocation (RMI), CORBA und Servlets weitergehende Konzepte. In Kapitel 10 wird erklärt, wie mittels Java auf Datenbanken zugegriffen werden kann. Nach einer einführenden Betrachtung der grundlegenden Funktionsweise werden hier Funktionen wie das Erzeugen und Löschen von Tabellen, deren Abfrage und Modifikation sowie die Navigation auf Ergebnissen und der Stapelbetrieb behandelt. Das Spielmodell wird im anschließenden praktischen Teil derart erweitert, dass Spielstände in einer Datenbank gesichert werden können. In Kapitel 11 wird die Remote Method Invocation (RMI) in Java behandelt, eine Technik, mit der Funktionen auf entfernten Rechnern ausgeführt werden können. Zur Thematik dieses Teils des Buches zählt neben der eigentlichen RMI-Technik auch die sog. Objektserialisierung. Im praktischen Teil dieses Kapitels wird die Verwendbarkeit von RMI für die Kommunikationsprozesse zwischen Client und Server von „Schiffe versenken" näher betrachtet, indem Methodenaufrufe über RMI implementiert werden. Diese Methoden sind Teil eines Moduls zur Aktualisierung der Datenbankeinträge (Spielstände) auf dem Server. Kapitel 12 behandelt die Anbindung von Java an CORBA. CORBA ist eine Architektur, mittels derer verteilte Objekte für den Anwender transparent verwaltet werden können. Hierzu wird die Java Interface Description Language (Java-IDL) detailliert betrachtet, die anschließend mit RMI verglichen wird. Im Anwendungsbeispiel wird das mittels RMI implementierte Programm derart modifiziert, dass nun anstelle von RMI CORBA zum Einsatz kommt. Kapitel 13 widmet sich der Darstellung von Servlets, also Programmen, die im Gegensatz zu Applets auf dem Server ausgeführt werden. Hierbei wird neben dem Grundkonzept der Servlets auf die Unterschiede zur Common-Gateway-Interface-Technik (CGI) eingegangen, die heute zur Verarbeitung von Formulareingaben im World Wide Web eine weite Verbreitung gefunden hat. Im Anwendungsbeispiel wird anschließend eine Komponente entwickelt, die die Aktualisierung der Spielstände einer Datenbank vornimmt. Dies ist ein typisches Einsatzgebiet von Servlets. In diesem Kapitel wird auch das Zusammenspiel mit Komponenten verteilter Systeme erkennbar, da Servlets über RMI kommunizieren können. In Kapitel 14 wird ein zweites Anwendungsbeispiel vorgestellt, das die Beispiele zu Datenbanken, RMI und Servlets kombiniert. Im praktischen Einsatz wird so demonstriert, wie Spielstände, die in einer Datenbank auf dem Server gehalten werden, vom Client aktualisiert werden können. Die eigentliche Datenbankmodifikation wird hierbei über Servlets gesteuert.