Rheinwerk Computing <openbook>
Rheinwerk Computing - Programming the Net


JavaScript von Christian Wenz
Browserübergreifende Lösungen
JavaScript - Zum Katalog
gp Kapitel 20 Java
  gp 20.1 Allgemeines
  gp 20.2 Java und das WWW
  gp 20.3 Java ohne Applet
  gp 20.4 Fragen & Aufgaben

Kapitel 20 Java

Hab ich doch, Freunde, immer mit Recht den Caffé gehasst.
– Johann Wolfgang von Goethe

Wenn Sie sich so weit durch das Buch durchgekämpft haben, werden Sie festgestellt haben, dass man mit JavaScript tolle Effekte realisieren kann. Wozu braucht man überhaupt noch Java? Nun, die Antwort fällt recht lang aus, angefangen bei der Möglichkeit des Dateizugriffs über Datenbankoperationen bis hin zu den grafischen Darstellungsmöglichkeiten. Java hat also durchaus seine Existenzberechtigung im World Wide Web. Aus diesem Grund findet Java auch in diesem Buch Erwähnung. Man kann nämlich mit JavaScript die Java-Programme in einem HTML-Dokument in gewisser Hinsicht ansteuern. So können sich Java und JavaScript gut ergänzen.


Rheinwerk Computing

20.1 Allgemeines  downtop

Eines gleich vorweg: Dieses Buch soll keine Java-Einführung sein, es geht hier lediglich um JavaScript. Um dieses Kapitel voll verständlich zu machen, benötigt man einige Zeilen Java-Code, das lässt sich nicht vermeiden. Es wurde aber versucht, diesen Teil so kurz und so einfach wie möglich zu halten. Da sich die Syntax von Java und JavaScript zum Teil ziemlich ähnelt, können Sie auch ohne Java-Erfahrung – aber mit inzwischen tiefschürfenden JavaScript-Kenntnissen – die vorgestellten Beispiele nachvollziehen. Auch wenn Sie vielleicht nicht jeden einzelnen Befehl verstehen, sollte wenigstens die prinzipielle Vorgehensweise klar werden. Um ein paar einführende Worte kommt man eben nicht herum.


Rheinwerk Computing

20.1.1 Wie funktioniert Java?  downtop

Java ist eine plattformunabhängige Programmiersprache, deren Syntax sich an die Programmiersprache C++ anlehnt. Java-Programme werden in einen so genannten Byte-Code kompiliert. Die meisten Internet-Browser haben eine Java Virtual Machine (Java VM oder auch JVM), welche diesen Bytecode auf der jeweiligen Plattform interpretiert und die Befehle ausführt. Der besondere Vorteil besteht darin, dass der Byte-Code auf jeder Plattform identisch ist. Daher rührt die Bezeichnung »plattformunabhängige Sprache«. Einzig und allein die Virtual Machines unterscheiden sich. Das Konzept von Java heißt auch »written once, runs everywhere« – einmal programmiert, funktioniert es überall. Insbesondere müssen Sie sich nicht um die Portierung Ihres Codes auf die verschiedensten Plattformen kümmern, das haben die Hersteller der Virtual Machine schon erledigt.

Der Nachteil von Java liegt auf der Hand: Da das Programm nicht betriebssystemspezifisch kompiliert worden ist, muss der Byte-Code von der VM interpretiert werden, und das dauert recht lange. Aus diesem Grund sind kompilierte Programme immer noch etwas schneller. Der Vorsprung schwindet allerdings, da die Entwicklung der Virtual Machines fortschreitet, und so genannte JIT-Compiler (Just-In-Time-)Compiler in der Lage sind, Java-Code nicht anfangs am Stück zu interpretieren, sondern immer dann, wenn das entsprechende Programmsegment zur Ausführung kommt. Die wahren technischen Zusammenhänge sind weitaus komplizierter, aber Sie wollen sicherlich so schnell wie möglich zum Thema JavaScript zurückkommen, also weiter im Text.

Kompilierte Java-Programme haben die Endung .class. Ein für den nicht-kommerziellen Einsatz kostenloser Compiler ist auf der Website des Java-Erfinders Sun unter http://java.sun.com zu finden – halten Sie nach dem Java Development Kit, kurz JDK, Ausschau.

Java-Programme werden mit dem <APPLET>-Tag in die HTML-Seite eingebunden. Im Parameter CODE wird der vollständige Name der .class-Datei angegeben, in den Parametern WIDTH und HEIGHT werden – wie beim <IMG>-Tag auch – die Ausmaße des Applets auf dem Bildschirm angegeben. Wichtig ist wie immer das NAME-Attribut, Formular-Experten wissen, warum:

<APPLET CODE="applet.class" NAME="Applet" WIDTH=300 HEIGHT=200>
Ihr Browser unterstützt kein Java oder Sie haben es
ausgeschaltet</APPLET>
gp  Der Text zwischen <APPLET> und </APPLET> wird genau dann angezeigt, wenn der Browser des Benutzers kein Java unterstützt. (Dies ist beispielsweise bei älteren Versionen des Netscape Navigator für Windows 3.x oder bei Macintosh-Versionen für ältere Systeme der Fall.)

Rheinwerk Computing

20.1.2 Kurzeinführung in Java  downtop

In den folgenden Absätzen werde ich das Grundkonzept von Java grob erklären. Vor allem die Java-Kenner mögen über Auslassungen, Ungenauigkeiten und Vereinfachungen hinwegsehen. Das Thema dieses Buches ist und bleibt JavaScript, und Java wird nur so weit erläutert, wie es für das Verständnis dieses Kapitels nötig ist.

In Java sind alle Daten in Objekten organisiert, so ähnlich wie in JavaScript ja auch – so weit, so gut. Anstelle von Objekt nennt man eine Ansammlung von Methoden und Eigenschaften innerhalb von Java Klasse. Ein Grundgerüst einer Klasse sieht folgendermaßen aus:

class klassenname{
// irgendwelche Komandos
}

Jede Klasse kann Methoden und Eigenschaften enthalten. Die Besonderheit ist, dass der Typ des Rückgabewerts jeder Methode im Methodenkopf direkt angegeben wird, was ein großer Unterschied im Vergleich zu JavaScript ist, das sich im Hinblick auf Variablentypen sehr flexibel verhält. Beispiele für solche Typen sind int für Zahlenwerte, boolean für Wahrheitswerte – und void, wenn nichts zurückgegeben wird. Auch bei Parametern für die Methoden muss der Typ angegeben werden.

public class klassenname{
   private int quadrat(int i){
      return i*i;
   }
   public pythagoras(int kathete1, int kathete2){
      int summe = quadrat(kathete1) + quadrat(kathete2);
      return Math.sqrt(summe);
   }
}

Eine weitere Eigenheit von Java besteht darin, dass nicht alle Methoden und Eigenschaften von überall aus abgefragt werden können. Im obigen Beispiel kann die Funktion quadrat(), die mit dem Schlüsselwort private gekennzeichnet ist, nur innerhalb dieser Klasse aufgerufen werden, also nicht von anderen Klassen aus. Die Funktion pythagoras(), die übrigens die Länge der Hypotenuse in einem rechtwinkligen Dreieck berechnet und dabei quadrat() benutzt, ist durch das Schlüsselwort public gekennzeichnet. Dieses gibt an, dass diese Methode von überall aus aufgerufen werden darf – auch von JavaScript aus!

Die wohl größte Fehlerquelle am Anfang: Jeder Befehl muss mit einem Semikolon beendet werden! Da wünscht man sich manchmal das nicht so strenge JavaScript herbei.


Rheinwerk Computing

20.2 Java und das WWW  downtop

Um ein Java-Programm im Browser betrachten zu können, muss es sich um ein sogenanntes Applet handeln. Dadurch ändert sich der schematische Aufbau ein wenig. Die genauen Details sollen uns aber nicht interessieren. Auf der CD zu diesem Buch finden Sie das kompilierte Applet, und Sie können es auch direkt ausprobieren. Bei MyGalileo finden Sie es übrigens auch.


Rheinwerk Computing

20.2.1 Ein Beispiel-Applet  downtop

Das folgende Applet wird in diesem Kapitel als Beispiel verwendet. Es zeichnet zu Anfang einen roten Kreis, denn die Methode paint() wird beim Laden des Applets aufgerufen. Außerdem gibt es da noch eine Methode auswahl(), die anscheinend ein paar Variablen des Applets verändert und dann wieder paint() aufruft. Wenn Sie das ganze selbst ausprobieren wollen, müssen Sie den Java-Quelltext unter demselben Namen wie die Klasse abspeichern. Letztere heißt ball, also wird der Quelltext unter ball.java abgespeichert.

import java.applet.*;
import java.awt.*;
public class ball extends Applet{
   private int radius = 100;
   private Color farbe = Color.red;
   public void paint(Graphics g){
      g.setColor(Color.white);
      g.fillRect(0, 0, 449, 449);
      g.setColor(farbe);
      g.fillOval(225-radius, 225-radius, 2*radius-1, 2*radius-1);
   }
   public void auswahl(int neuer_radius, String farbcode){
      this.radius = neuer_radius;
         if (farbcode.equals("rot"))
            {this.farbe=Color.red;} else
         if (farbcode.equals("blau"))
            {this.farbe = Color.blue;} else
         if (farbcode.equals("gruen"))
            {this.farbe = Color.green;} else
               this.farbe = Color.black;
      paint(getGraphics());
   }
}

Rheinwerk Computing

20.2.2 HTML-Integration  downtop

Das Ziel dieses Beispiels soll es sein, mit JavaScript dieses Applet anzusteuern. Dazu soll folgendes HTML-Grundgerüst als Basis dienen. In einem Formular kann man den Radius des Kreises eingeben und via Radiobutton die Farbe des Kreises auswählen.

<HTML>
<HEAD>
<TITLE>Java und JavaScript</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function java(){
   alert("Bedaure, Ihr Browser ist zu alt")
}
//--></SCRIPT>
<SCRIPT LANGUAGE="JavaScript1.1"><!--
function java(f){
   if (navigator.javaEnabled()){
      var radius = parseInt(f.radius.value)
      if (isNaN(radius)||radius>200||radius<1)
         radius = 200
      var farbe = f.farbe[0].checked ? "rot" :
        (f.farbe[1].checked ? "blau" : "gruen")
      document.ball.auswahl(radius, farbe)
   } else
   alert("Bedaure, bei Ihrem Browser ist Java deaktiviert")
}
//--></SCRIPT>
</HEAD>
<BODY>
<H3>Java und JavaScript</H3>
<APPLET CODE="ball.class" NAME="ball" WIDTH=450 HEIGHT=450>
  Ihr Browser unterstützt kein Java!</APPLET>
<FORM>
Radius (von 1 bis 200): <INPUT TYPE="TEXT" NAME="radius" 
SIZE=3><BR>
Farbe:
 <INPUT TYPE="RADIO" NAME="farbe" VALUE="rot"> rot -
 <INPUT TYPE="RADIO" NAME="farbe" VALUE="blau"> blau -
 <INPUT TYPE="RADIO" NAME="farbe" VALUE="gruen"> grün<BR>
<INPUT TYPE="BUTTON" VALUE="Zeichnen" onClick="java(this.form)">
</FORM>
</BODY>
</HTML>
Abbildung 20.1  Java-Applets mit JavaScript steuern
Abbildung

Nüchtern analysiert, erledigt die Funktion java() Folgendes: Zuerst wird navigator.javaEnabled() abgefragt. Diese Methode gibt an, ob der Benutzer im Browser Java aktiviert hat. Ein Nebeneffekt dieser Abfrage ist, dass die Java Virtual Machine gestartet wird, sofern das noch nicht geschehen ist. Vor allem beim Netscape Navigator 4 dauert das eine Weile, bei der Vorgängerversion passierte der VM-Start noch beim Laden des Browsers. In diesem Fall fällt das aber nicht ins Gewicht, da aufgrund des Applets innerhalb der HTML-Seite die Virtual Machine ohnehin schon gestartet worden ist.

Als nächstes liest die Funktion java() die Formularwerte ein und wandelt die Eingabe im Radius-Eingabefeld in eine Zahl zwischen 1 und 200 um.

gp  Die Umwandlung der Zeichenkette in eine Zahl ist prinzipiell gar nicht nötig, das geschieht automatisch. Allerdings musste ja noch der Radius gegebenenfalls innerhalb des Intervalls von 1 bis 200 gebracht werden.

Die interessanteste Zeile der Funktion ist:

document.ball.auswahl(radius, farbe)

Mit document.ball wird auf das Applet in der HTML-Seite zugegriffen, denn dieses hat das NAME-Attribut ball. Mit document.ball.auswahl() greift man also auf die Methode auswahl() im Applet zu. Generell gilt, dass man mit JavaScript auf alle Methoden des Applets zugreifen kann, sofern sie als public deklariert worden sind. Den Rest erledigt in diesem Beispiel das Applet. Die entsprechenden Parameter werden verändert, und der Kreis wird neu gezeichnet.

Der Netscape Navigator bietet des weiteren die Möglichkeit an, von Java-Programmen aus JavaScript-Objekte anzusprechen. Diese Möglichkeit bietet der Microsoft Internet Explorer nicht, und die Funktionalität kann man auch in der anderen Richtung bereitstellen (also von JavaScript aus geeignete Java-Methoden aufrufen).


Rheinwerk Computing

20.3 Java ohne Applet  downtop

Man braucht nicht unbedingt ein Applet, um Java-Methoden von JavaScript aus aufzurufen. Gewisse Grundobjekte von Java können auch direkt aufgerufen werden. Beispielsweise hat man so zu Zeiten des Netscape Navigator 3 versucht, die Höhe und Breite des Bildschirms zu bestimmen, weil es damals screen.width und screen.height noch nicht gab, wohl aber entsprechende Java-Methoden. Diese Vorgehensweise wird jedoch nur relativ selten verwendet; meistens benötigt man nicht nur ein mitgeliefertes Java-Objekt, sondern gleich eine (programmierte) Java-Funktion, und dann muss man ein Applet verwenden.

gp  Wenn Sie eine (programmierte) Java-Funktion verwenden wollen, beispielsweise eine Nullstellenberechnung oder andere mathematische Berechnungen (was mit den JavaScript-Datentypen nicht immer akkurate Ergebnisse liefert), so können Sie ein 1 x 1 Pixel großes Applet verwenden. Das Applet selbst soll keine Aktivität zeigen und fällt aufgrund seiner Größe nicht sonderlich auf, aber Sie können die öffentlichen Funktionen aufrufen und die Ergebnisse verwenden.

Rheinwerk Computing

20.3.1 Exemplarische Java-Objekte  downtop

Ein mögliches Beispiel ist die Java-Variante eines luxuriöseren Arrays, dort Vektor genannt. Die Klasse heißt Vector und wird von JavaScript aus (und übrigens auch von Java) mit java.util.Vector angesprochen.

Mit den folgenden Befehlen wird eine Instanz des Java-Typs Vector erzeugt. Diese Instanz besitzt als Methoden alle als public deklarierten Methoden des Java-Objekts:

if (navigator.javaEnabled())
   var v = new java.util.Vector()

Dieser Vektor hat im Gegensatz zu einfachen JavaScript-Arrays Funktionen zum einfachen Entfernen und Hinzufügen von Elementen. Zwar gibt es ab dem Netscape Navigator 3 und dem Internet Explorer 4 (also JavaScript 1.1) ein paar neue Möglichkeiten für JavaScript-Arrays, mit denen man diese neue Funktionalität ebenfalls erreichen kann, aber das ist nicht Thema dieses Kapitels.

Ein weiteres interessantes Java-Objekt ist Hashtable. Das ist auch ein Array, aber die Indizes sind nicht nummerisch, sondern können auch Zeichenketten sein. Man kann beispielsweise sehr einfach eine Abbildung von Monatsnamen auf Monatszahlen machen.

Im folgenden Beispiel sollen sowohl Vector als auch Hashtable verwendet werden, letztere jedoch nur in der Version bei MyGalileo. Stellen Sie sich vor, Sie befinden sich in Las Vegas an einem Blackjack-Tisch. Sie haben ein einzelnes Kartenspiel vor sich und müssen es mischen und an die Spieler verteilen. Außerdem soll bei jedem Spieler angegeben werden, wie viele Punkte er mit seinen Karten erreicht hat. Eine vollständige Implementierung des Spiels ist Ihnen überlassen, oder schauen Sie hin und wieder bei MyGalileo vorbei.


Rheinwerk Computing

20.3.2 Blackjack  downtop

Zur Vorbereitung in aller Kürze die wichtigsten Blackjack-Regeln:

gp  Das Kartenspiel enthält in den vier Farben (Herz, Karo, Pik, Kreuz) die Nummernkarten 2 bis 10 sowie die Bildkarten Bube, Dame, König und das As. Insgesamt erhält man so ein Spiel (Deck) aus 52 Karten.
gp  Das Ziel des Spiels ist es, so nahe wie möglich an 21 Punkte heranzukommen, vor allem näher als die Bank, ohne jedoch die 21 Punkte zu überschreiten (das hat den sofortigen Verlust zur Folge).
gp  Eine Nummernkarte zählt so viele Punkte, wie auf der Karte stehen. Eine Bildkarte zählt zehn Punkte. Ein As zählt 11 Punkte, außer, der Spieler würde mit seinen Karten über 21 Punkte kommen (»überbieten«), dann zählt es einen Punkt. Hat ein Spieler also ein As und eine 7, so hat er 18 Punkte. Zwei Asse zählen als 12 Punkte, denn würden beide Asse mit 11 Punkten zählen, hätte der Spieler 22 Punkte und damit überboten. Analog zählen drei Asse als 13 Punkte.
gp  Hat der Spieler ein As und eine Karte, die zehn Punkte wert ist (eine Bildkarte oder die Zehn), so hat er einen »Blackjack«.
gp  Am Anfang des Spiels bekommt jeder Spieler zwei Karten zugeteilt.
gp  Weitere Regeln, etwa, was die Bank zu tun hat und wie man mehr Karten bekommen kann, sind nicht Thema dieses Buchs.

Die Strategie für die Blackjack-Applikation ist die folgende:

gp  In einer Schleife wird ein Array mit allen möglichen Karten gefüllt.
gp  Die Karten werden gemischt, indem immer ein Element aus dem Array zufällig ausgewählt, einem Spieler zugeteilt und aus dem Array entfernt wird.
gp  Bei jedem Spieler wird die Punktzahl seiner beiden Karten bestimmt. Diese Punktzahl wurde zuvor für einen schnellen Zugriff in einer Hashtable abgespeichert.

Rheinwerk Computing

20.3.3 Karten initialisieren  downtop

Jede Karte wird wie im Kapitel »Arrays« als Zeichenkette gespeichert. Hierbei werden Farbe und Kartenbezeichnung durch ein Trennzeichen, beispielsweise einen Strichpunkt, voneinander getrennt. Die äußere Schleife geht von 1 bis 13 (die Karten von 2 bis 10, König, Bube, Dame, As). Die innere Schleife geht von eins bis vier und umfasst die vier Farben. Die einzelnen Werte werden in einem Java-Vector gespeichert (natürlich nur zu Übungszwecken, wie bereits gesagt geht das mit minimalem Mehraufwand auch mit reinen JavaScript-Mitteln). Die zugehörige, als public deklarierte Methode zum Einfügen eines Elements in ein Vector-Objekt heißt addElement(). Um noch ein wenig mehr Java zu verwenden, wird das zu übergebende String-Objekt auch als Java-Objekt generiert, obwohl man auch einfach die (JavaScript-)Zeichenkette hätte übergeben können.

function deck(){
   // Hilfsvariablen
   var kartenname = new Array()
   kartenname[0]="Zwei"; kartenname[1]="Drei"
   kartenname[2]="Vier"; kartenname[3]="Fünf"
   kartenname[4]="Sechs"; kartenname[5]="Sieben"
   kartenname[6]="Acht"; kartenname[7]="Neun"
   kartenname[8]="Zehn"; kartenname[9]="Bube"
   kartenname[10]="Dame"; kartenname[11]="König"
   kartenname[12]="As"
   var farben = new Array();
   farben[0] = "Herz"; farben[1] = "Karo"
   farben[2] = "Pik"; farben[3] = "Kreuz"
   //Array initialisieren; als Java-Vector!
   var cards = new java.util.Vector()
   for (var i=0; i<13; i++)
      for (var j=0; j<4; j++){
         temp = farben[j]+";"+kartenname[i]
         karte = new java.lang.string(temp)
         cards.addElement(karte)
      }
   return cards
}

Rheinwerk Computing

20.3.4 Karten mischen  downtop

Das Mischen gestaltet sich, wie bereits beschrieben, mit einem Vektor relativ einfach. Es wird (wie übrigens im Kapitel »Arrays« auch) ein beliebiges Element des Vector-Objekts bestimmt und aus dem Vektor herausgenommen. Parallel dazu wird ein neuer Vektor erzeugt, der die Elemente des »alten« Vektors enthält, nur in einer neuen, zufälligen Reihenfolge.

Um dies zu bewerkstelligen, werden die folgenden Java-Methoden des Vector-Objekts benötigt:

gp  size(): Liefert die Anzahl der Elemente im Vektor zurück.
gp  elementAt(i): Liefert das Element an der Position i im Vektor zurück. (Die Zählung beginnt – wie bei Arrays auch – bei 0.)
gp  removeElementAt(i): Löscht das Element der an Position i aus dem Vektor.
function mischen(alt){
   var neu = new java.util.Vector()
   for (var i=alt.size(); i>0; i--){
      var zufall = Math.floor(Math.random()*i)
      neu.addElement(alt.elementAt(zufall))
      alt.removeElementAt(zufall)
   }
   return neu
}

Die Kartenverteilung und die Punktberechnung wird an dieser Stelle nicht dargestellt. Schauen Sie doch mal bei MyGalileo vorbei! An dieser Stelle folgt lediglich eine Beispielseite, die ein Kartenblatt mischt und auf dem Bildschirm ausgibt. Hierzu wird die toString()-Methode eines Vector-Objekts verwendet, die die Elemente des Vektors als Zeichenkette ausgibt.

<HTML>
<HEAD>
<TITLE>Karten mischen</TITLE>
<SCRIPT LANGUAGE="JavaScript"><!--
function deck(){
   // Hilfsvariablen
   var kartenname = new Array()
   kartenname[0]="Zwei"; kartenname[1]="Drei"
   kartenname[2]="Vier"; kartenname[3]="Fünf"
   kartenname[4]="Sechs"; kartenname[5]="Sieben"
   kartenname[6]="Acht"; kartenname[7]="Neun"
   kartenname[8]="Zehn"; kartenname[9]="Bube"
   kartenname[10]="Dame"; kartenname[11]="König"
   kartenname[12]="As"
   var farben = new Array();
   farben[0] = "Herz"; farben[1] = "Karo"
   farben[2] = "Pik"; farben[3] = "Kreuz"
   //Array initialisieren; als Java-Vector!
   var cards = new java.util.Vector()
   for (var i=0; i<13; i++)
      for (var j=0; j<4; j++){
         temp = farben[j]+";"+kartenname[i]
         karte = new java.lang.String(temp)
         cards.addElement(karte)
      }
   return cards
}
function mischen(alt){
   var neu = new java.util.Vector()
   for (var i=alt.size(); i>0; i--){
      var zufall = Math.floor(Math.random()*i)
      neu.addElement(alt.elementAt(zufall))
      alt.removeElementAt(zufall)
   }
   return neu
}
function verteilen(){
   var c1 = deck()
   var c2 = mischen(c1)
   document.write(c2.toString())
}

//--></SCRIPT>
</HEAD>
<BODY>
<H3>Karten mischen</H3>
<SCRIPT LANGUAGE="JavaScript"><!--
   if (navigator.javaEnabled())
      verteilen()
//--></SCRIPT>
</BODY>
</HTML>
Abbildung 20.2  Das gemischte Kartenblatt
Abbildung


Rheinwerk Computing

20.4 Fragen & Aufgaben  toptop

1. Ist Java dasselbe wie JavaScript?
2. Warum gibt man Java trotz der Geschwindigkeitsnachteile in vielen Projekten den Vorzug?
3. Was ist der Unterschied zwischen public und private? Wieso kann es sinnvoll sein, nicht alles als public zu deklarieren?
4. Entwickeln Sie eine Methode, um ein beliebiges Java-Applet auf dem Webserver, dessen Name bekannt, aber auf der momentanen Seite nicht als Applet geladen ist, mit JavaScript-Mitteln aufzurufen. Auf welche Methoden dieses Applets können Sie dann zugreifen?





1    Das findet man heute kaum noch, da es dem Spieler einen Vorteil gegenüber der Bank bringt.

  

JavaScript

jQuery

Einstieg in JavaScript

Responsive Webdesign

Suchmaschi-
nen-Optimie-
rung




Copyright © Rheinwerk Verlag GmbH 2001 - 2002
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken und speichern. 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.
Die Veröffentlichung der Inhalte oder Teilen davon bedarf der ausdrücklichen schriftlichen Genehmigung der Rheinwerk Verlag GmbH. Falls Sie Interesse daran haben sollten, die Inhalte auf Ihrer Website oder einer CD anzubieten, melden Sie sich bitte bei: >> Zum Feedback-Formular


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, fon: 0228.42150.0, fax 0228.42150.77, service@rheinwerk-verlag.de