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

Inhaltsverzeichnis
Vorwort
1 Neues in Java 7
2 Threads und nebenläufige Programmierung
3 Datenstrukturen und Algorithmen
4 Raum und Zeit
5 Dateien, Verzeichnisse und Dateizugriffe
6 Datenströme
7 Die eXtensible Markup Language (XML)
8 Dateiformate
9 Grafische Oberflächen mit Swing
10 Grafikprogrammierung
11 Netzwerkprogrammierung
12 Verteilte Programmierung mit RMI
13 RESTful und SOAP Web-Services
14 JavaServer Pages und Servlets
15 Applets
16 Datenbankmanagement mit JDBC
17 Technologien für die Infrastruktur
18 Reflection und Annotationen
19 Dynamische Übersetzung und Skriptsprachen
20 Logging und Monitoring
21 Java Native Interface (JNI)
22 Sicherheitskonzepte
23 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- openbook, ca. 21,3 MB
Buch bestellen
Ihre Meinung?

Spacer
Java 7 - Mehr als eine Insel von Christian Ullenboom
Das Handbuch zu den Java SE-Bibliotheken
Buch: Java 7 - Mehr als eine Insel

Java 7 - Mehr als eine Insel
Galileo Computing
1433 S., 2012, geb.
49,90 Euro, ISBN 978-3-8362-1507-7
Pfeil 15 Applets
Pfeil 15.1 Applets in der Wiege von Java
Pfeil 15.1.1 Applets heute
Pfeil 15.1.2 (J)Applet und Applikationen
Pfeil 15.1.3 Das erste Hallo-Applet
Pfeil 15.2 Die Applet-API
Pfeil 15.2.1 Die Zyklen eines Applets
Pfeil 15.2.2 Parameter an das Applet übergeben
Pfeil 15.2.3 Wie das Applet den Browser-Inhalt ändern kann *
Pfeil 15.2.4 Den Ursprung des Applets erfragen
Pfeil 15.2.5 Datenaustausch zwischen Applets *
Pfeil 15.2.6 Was ein Applet alles darf *
Pfeil 15.2.7 Ist Java im Browser aktiviert? *
Pfeil 15.2.8 Applet unter Firefox (Netscape) oder Microsoft Internet Explorer? *
Pfeil 15.3 Webstart
Pfeil 15.4 Zum Weiterlesen

Galileo Computing - Zum Seitenanfang

15.2 Die Applet-APIZur nächsten Überschrift


Galileo Computing - Zum Seitenanfang

15.2.1 Die Zyklen eines AppletsZur 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

15.2.2 Parameter an das Applet übergebenZur 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.

Abbildung

Abbildung 15.3: Unsere Beispielanwendung appletCheckUrl.html

Listing 15.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 15.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 nur auf den Rechner zugreifen, von dem es geladen wurde, nicht auf andere. Ohne explizite Sicherheitserweiterungen kann so ein allgemeines Applet zum Prüfen eines Links nicht geschrieben werden.


Galileo Computing - Zum Seitenanfang

15.2.3 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 Web-Seite, 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 einem Frame abgelegt, dessen Name zusätzlich festgelegt 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 Top-Level-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

15.2.4 Den Ursprung des Applets erfragenZur 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 der Methode getCodeBase().getHost() an den Hostnamen und auch an die Daten des Servers.

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 Hostnamen des URL-Objekts. Handelt es sich um das »file«-Protokoll, so ist der Rückgabewert ein leerer String.
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

15.2.5 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 einen Namen ansprechen
  • eine Aufzählung aller Applets erfragen

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

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

Eine Verbindung der Methoden 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

// 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 dem 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 15.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 15.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 15.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 auch elegante Benachrichtigungen realisieren.


Galileo Computing - Zum Seitenanfang

15.2.6 Was ein Applet alles darf *Zur nächsten ÜberschriftZur vorigen Überschrift

Ein Applet unterliegt bestimmten Sicherheitsbeschränkungen, die eine Java-Security-Einheit überprüft. In Kapitel 23, »Sicherheitskonzepte«, werden wir diese 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, sodass das Applet nur den Rechnernamen des Hosts vergleicht, nicht aber die IP-Adresse. Ein bösartiges 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.


Galileo Computing - Zum Seitenanfang

15.2.7 Ist Java im Browser aktiviert? *Zur nächsten ÜberschriftZur vorigen Überschrift

Wenn unser Browser Java-Applets ausführen soll, aber Java gar nicht aktiviert ist, dann lassen sich einige interaktive Benutzeraktionen nicht durchführen. Wir sollten daher zumindest eine Meldung anbieten, dass der Browser Java gerade nicht aktiviert hat. Dies kann beabsichtigt oder nicht beabsichtigt sein. Natürlich kommt Java dafür nicht infrage, aber eine Skript-Sprache mit einem ähnlichen Namen: JavaScript. Ab JavaScript-Version 1.1 bietet uns der Interpreter die Funktion javaEnabled() an, sodass wir eine Weiterschaltung vornehmen können:

if ( !navigator.javaEnabled() )
{
self.location.href = "nix_mit_java.html";
}

Für diese Lösung muss natürlich JavaScript aktiviert sein. Für einige Surfer ist selbst dies schon eine Sicherheitslücke, und wenn JavaScript deaktiviert ist, lässt sich hier nichts mehr machen. Falls JavaScript aktiviert ist, kommen wir dem Benutzer einen Schritt entgegen, sodass er nicht mehr manuell angeben muss, ob Java aktiv ist oder nicht. Von dieser Technik sollten wir auch Gebrauch machen, denn nicht immer hat der Benutzer bewusst Java abgeschaltet. Im Beispiel oben haben wir eine Seite angesteuert, wobei natürlich andere Anweisungen denkbar sind. Doch diese Form ist sinnvoll, denn wir können Benutzern eine Kurzbeschreibung darüber liefern, wie Java im Browser aktiviert wird. Zusammen mit der Browservariante ist eine browsergenaue Beschreibung einsetzbar.


Galileo Computing - Zum Seitenanfang

15.2.8 Applet unter Firefox (Netscape) oder Microsoft Internet Explorer? *Zur vorigen Überschrift

Kann der Browser ein Applet aus irgendwelchen Gründen nicht ausführen, so sind die Meldungen an den Benutzer meist mager. Oft beschränken sie sich auf eine Exception-Angabe in der Statuszeile. Dies mag keiner mehr sehen. Doch leider verschärfen inkompatible Browser die Situation. Was hier Abhilfe schafft, ist ein kleines Programm, das zunächst herausfindet, auf welchem Browser das Applet läuft. Dann können unter Umständen browser- und versionsabhängige Varianten ausgeführt werden.

Wir verwenden einen Trick, der auch beim Erkennen von Prozessortypen angewendet wird: Wir versuchen, Klassen zu laden oder Methoden aufzurufen, die es für den jeweils anderen Browser nicht gibt. Der Internet Explorer hat zum Beispiel eine private Klasse com.ms. applet.GenericAppletContext, und Mozilla hat eine Klasse netscape.applet.MozillaAppletContext. Löst die JVM beim Laden der Klasse eine Exception aus, wissen wir Bescheid, um welchen Browser es sich handelt.

Versuchen wir, über die selbst gebastelten Methoden isNetscape() und isMicrosoft() etwas über unsere Laufzeitumgebung herauszufinden.

Listing 15.8: BrowserDetector.java

import java.applet.Applet;

public class BrowserDetector extends Applet
{
public void init()
{
if ( isNetscape() )
System.out.println( "Netscape, Firefox, ... Browser." );

if ( isMicrosoft() )
System.out.println( "Microsoft Browser." );
}

public static boolean isNetscape()
{
try {
Class.forName( "netscape.applet.MozillaAppletContext" );
}
catch ( ClassNotFoundException e ) { return false; }
return true;
}
public static boolean isMicrosoft()
{
try {
Class.forName( "com.ms.applet.GenericAppletContext" );
}
catch ( ClassNotFoundException e ) { return false; }
return true;
}
}

Die Idee lässt sich natürlich auch anwenden, um Java-Versionen zu testen; es wird einfach eine Klasse erfragt, die bei einer neuen Java-Version hinzugekommen ist, bei Java 2 etwa Point2D.

Tipp

Da nicht immer sichergestellt sein kann, dass Java in einer vernünftigen Version (>= 1.2) auf dem Client-Rechner der Benutzer installiert ist, lässt sich ein Test-Applet vorschalten, das zunächst die Java-Version prüft. Anschließend kann dieses Eingangs-Applet über getAppletContext().showDocument() auf eine andere Seite mit einem Applet verweisen. Für unterschiedliche Browser und Java-Installationen können somit unterschiedliche Applets auf die Situation eingehen.



Ihr Kommentar

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







<< zurück
  Zum Katalog
Zum Katalog: Java 7 – Mehr als eine Insel
Java 7 – Mehr als eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Einstieg in Eclipse 3.7






 Einstieg in
 Eclipse 3.7


Zum Katalog: Android 3






 Android 3


Zum Katalog: NetBeans Platform 7






 NetBeans Platform 7


Zum Katalog: Java ist auch eine Insel






 Java ist
 auch eine Insel


Zum Katalog: Apps entwickeln für Android 4






 Apps entwickeln
 für Android 4


Zum Katalog: Java 7






 Java 7


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2012
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das 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