Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 5. Auflage |
<< | < | > | >> | API | Kapitel 40 - Applets II |
Das Konzept der URLs ist eines der wichtigsten im ganzen Web. Ein URL (Uniform Resource Locator) ist ein universelles Hilfsmittel zur Darstellung von Internet-Adressen. Hinter jedem Link, der sich auf einem HTML-Dokument verbirgt, steht ein URL, der beim Aufrufen des Links angesprungen wird.
Der Aufbau von URLs ist in seiner Vielfältigkeit recht komplex und ermöglicht es, sehr unterschiedliche Typen von Adressen zu verwalten. Ein URL-Link kann beispielsweise verwendet werden, um eine andere Webseite aufzurufen, eine Datei zu laden oder elektronische Post an einen anderen Anwender zu senden. Wir wollen hier nur auf die URLs eingehen, die man zur Darstellung von Webseiten-Adressen verwendet. Eine exakte Beschreibung des URL-Konzepts befindet sich in RFC 1630 (allgemeine Hinweise zu den RFCs finden sich in Abschnitt 46.1.5).
Ein Uniform Resource Locator besteht aus mehreren Teilen. Als erstes wird ein Dienst (auch Protokoll genannt) angegeben, der beschreibt, auf welche Art von Service die Adresse verweist. Typische Dienste sind html für Webseiten, ftp für einen File-Download oder mailto, um eine Mail zu versenden.
Bei einer HTML-Adresse besteht der URL aus drei weiteren Teilen:
Gültige URLs sind also http://java.sun.com/javase/faqs.jsp oder auch http://www.yahoo.com. Die meisten Browser und Server sind in der Lage, fehlende Bestandteile eines URLs weitgehend zu ergänzen. Fehlt beispielsweise die Dateierweiterung, wird .html angehängt. Bezeichnet der URL lediglich ein Verzeichnis, wird ein Standard-Dateiname wie beispielsweise index.html oder default.htm angehängt.
Java implementiert das Konzept eines Uniform Resource Locators durch eine eigene Klasse URL, die sich im Paket java.net befindet. Diese dient dazu, die Syntax von URLs zu kapseln und die einzelnen Bestandteile voneinander zu trennen. Die Klasse URL besitzt vier Konstruktoren, die es ermöglichen, eine Adresse auf verschiedene Art zusammenzubauen. Wir werden hier nur die Variante verwenden, die einen String als Argument akzeptiert:
public URL(String url) throws MalformedURLException |
java.net.URL |
Bei der Anwendung dieses Konstruktors muss ein syntaktisch einwandfreier URL als String übergeben werden. Enthält der String einen Syntaxfehler, löst der Konstruktor eine Ausnahme des Typs MalformedURLException aus.
An dieser Stelle wird natürlich noch nicht überprüft, ob die angegebene Adresse wirklich existiert. Dazu wäre eine funktionsfähige Netzwerkverbindung nötig, und es würde ein in der Regel nicht akzeptabler Aufwand bei der Konstruktion von URL-Objekten entstehen. Die im Konstruktor durchgeführten Überprüfungen sind lediglich syntaktischer Natur, um sicherzustellen, dass ein URL ein gültiges Adressenformat hat. Nachdem ein gültiges URL-Objekt erzeugt wurde, kann es zur Adressenübergabe verwendet werden.
Weitere Hinweise zur Anwendung der Klasse URL finden sich in Abschnitt 46.4. |
|
Ein anderes Konzept, das bei der Programmierung von Links eine Rolle spielt, ist das des Applet-Kontexts. Hierunter versteht Java das Programm, das das aktuelle Applet ausführt. Dies ist in der Regel der Browser, der das Applet geladen hat; während der Entwicklung und Testphase des Programms kann es natürlich auch der Appletviewer sein.
Mit Hilfe der Methode getAppletContext kann ein Objekt des Typs AppletContext beschafft werden:
public AppletContext getAppletContext() |
java.applet.Applet |
In der Klasse AppletContext gibt es eine Reihe von Methoden, die dem Applet Funktionalitäten des Browsers zur Verfügung stellen:
Wir wollen auf die ersten beiden Methoden nicht weiter eingehen, sondern uns hier lediglich mit showDocument beschäftigen.
Die Methode showDocument kann dazu verwendet werden, eine andere Webseite zu laden. Dies führt dazu, dass das aktive Applet angehalten wird und die Kontrolle über die Webseite verliert. Befindet sich auf der neuen Webseite ein anderes Applet, so wird dieses geladen bzw. - falls es bereits geladen war - reaktiviert.
Die Methode showDocument steht in zwei unterschiedlichen Varianten zur Verfügung:
public void showDocument(URL url) public void showDocument(URL url, String name) |
java.applet.AppletContext |
In seiner einfachsten Form erwartet showDocument lediglich einen einzigen Parameter, nämlich die Adresse der Zielseite. Hier muss ein gültiges URL-Objekt angegeben werden, also eine komplette Adresse mit Dienst, Host-Name, Verzeichnis und Datei. In der zweiten Variante kann zusätzlich ein target angegeben werden, also das Sprungziel innerhalb der ausgewählten Datei. Hier können die Standard-HTML-Targets _self, _parent, _top und _blank sowie alle benutzerdefinierten Sprungmarken verwendet werden.
Soll statt einer absoluten eine relative Adresse angegeben werden , also beispielsweise eine andere Webseite aus demselben Verzeichnis oder aus einem seiner Unterverzeichnisse, muss das URL-Objekt mit einem erweiterten Konstruktor instanziiert werden. Zusätzlich zur Angabe des relativen URL-Strings ist als erstes Argument ein Kontext-URL anzugeben, der das Basisverzeichnis für das zweite Argument vorgibt. Mit Hilfe der Methoden getCodeBase und getDocumentBase der Klasse Applet kann beispielsweise das Stammverzeichnis des Applets bzw. der HTML-Seite ermittelt werden. Als zweites Argument muss dann lediglich der Dateiname relativ zu diesem Verzeichnis angegeben werden. |
|
Das folgende Applet demonstriert die Anwendung von showDocument. Es erstellt eine Reihe von Buttons und zeigt sie auf dem Bildschirm an. Wird einer der Buttons gedrückt, verzweigt das Programm auf die durch den Button spezifizierte Seite. Während der Initialisierung sucht das Applet nach Parametern mit den Namen button1, button2 usw. Jeder dieser Parameter sollte den Namen des Buttons und die Zieladresse enthalten. Die beiden Teile müssen durch ein Komma getrennt sein. Eine Besonderheit besteht darin, dass auch Adressen angegeben werden können, die mit = anfangen. In diesem Fall wird das = entfernt und der interne URL nicht absolut, sondern unter Verwendung des erweiterten Konstruktors relativ zur aktuellen Webseite angelegt.
Um die Buttons sowohl auf dem Bildschirm anzeigen zu können als auch den zugehörigen URL zu speichern, wurde eine neue Klasse URLButton definiert. URLButton erweitert die Klasse Button um die Fähigkeit, einen URL mitzuspeichern und bei Bedarf abzufragen.
001 /* URLLaden.java */ 002 003 import java.applet.*; 004 import java.awt.*; 005 import java.awt.event.*; 006 import java.util.*; 007 import java.net.*; 008 009 class URLButton 010 extends Button 011 { 012 private URL url; 013 014 public URLButton(String label, URL url) 015 { 016 super(label); 017 this.url = url; 018 } 019 020 public URL getURL() 021 { 022 return url; 023 } 024 } 025 026 public class URLLaden 027 extends Applet 028 implements ActionListener 029 { 030 Vector buttons; 031 032 public void init() 033 { 034 super.init(); 035 setLayout(new FlowLayout()); 036 addNotify(); 037 buttons = new Vector(); 038 for (int i=1; ; ++i) { 039 String s = getParameter("button"+i); 040 if (s == null) { 041 break; 042 } 043 try { 044 StringTokenizer st = new StringTokenizer(s,","); 045 String label = st.nextToken(); 046 String urlstring = st.nextToken(); 047 URL url; 048 if (urlstring.charAt(0) == '=') { 049 urlstring = urlstring.substring(1); 050 url = new URL(getDocumentBase(),urlstring); 051 } else { 052 url = new URL(urlstring); 053 } 054 URLButton button = new URLButton(label,url); 055 button.addActionListener(this); 056 add(button); 057 buttons.addElement(button); 058 } catch (NoSuchElementException e) { 059 System.out.println("Button"+i+": "+e.toString()); 060 break; 061 } catch (MalformedURLException e) { 062 System.out.println("Button"+i+": "+e.toString()); 063 break; 064 } 065 } 066 } 067 068 public void actionPerformed(ActionEvent event) 069 { 070 URLButton source = (URLButton)event.getSource(); 071 Enumeration en = buttons.elements(); 072 while (en.hasMoreElements()) { 073 URLButton button = (URLButton)en.nextElement(); 074 if (button == source) { 075 System.out.println( 076 "showDocument("+button.getURL().toString()+")" 077 ); 078 getAppletContext().showDocument(button.getURL()); 079 } 080 } 081 } 082 } |
URLLaden.java |
Um die wichtigsten Fälle zu demonstrieren, wurde das Applet mit der folgenden HTML-Datei gestartet:
001 <html> 002 <head> 003 <title>URLLaden</title> 004 </head> 005 <body> 006 <h1>URLLaden</h1> 007 <applet code=URLLaden.class width=400 height=200> 008 <param 009 name="button1" 010 value="JAVA-Home,http://java.sun.com/"> 011 <param 012 name="button2" 013 value="Guido-Home,http://www.gkrueger.com"> 014 <param 015 name="button3" 016 value="Schranke,=Schranke.html"> 017 <param 018 name="button4" 019 value="Jana30,=images/jana30.gif"> 020 Hier steht das Applet URLLaden.class 021 </applet> 022 </body> 023 </html> |
URLLaden.html |
Hier werden vier verschiedene Buttons definiert:
|
|
Die Ausgabe des Programms im Netscape Navigator sieht folgendermaßen aus:
Abbildung 40.1: Darstellung von URLLaden im Netscape Navigator
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 5. Auflage, Addison Wesley, Version 5.0.2 |
<< | < | > | >> | API | © 1998, 2007 Guido Krüger & Thomas Stark, http://www.javabuch.de |