13.1.4 | URLConnection |
Das Beispiel aus dem vorherigem Abschnitt deckt noch lange nicht alle Möglichkeiten ab, die eine URL-Verbindung bietet. Um auf diese Möglichkeiten näher einzugehen, wird zuerst die bereits im Beispiel des letzten Abschnitts verwendete Methode showData() etwas modifiziert:public void showData(String data) { // Stream zum Einlesen der Daten von der URL BufferedReader URLinput; // Zum Schreiben der Daten an das CGI-Skript DataOutputStream URLoutput; // CGI-Skript URL cgiURL; // Entsprechende URLConnection zum CGI-Skript URLConnection cgiConnection; try { // Anlegen der URL cgiURL = new URL("http",getCodeBase().getHost(), "/cgi-bin/URLConnectionDemo.sh"); try { // URLConnection anlegen cgiConnection = cgiURL.openConnection(); // Daten an das CGI-Skript schicken cgiConnection.setDoOutput(true); URLoutput = new DataOutputStream(cgiConnection.getOutputStream()); URLoutput.writeBytes(data+"\n"); URLoutput.close(); // InputStream erzeugen URLinput = new BufferedReader( new InputStreamReader(cgiConnection.getInputStream())); // Löschen schon vorhandener Elemente in der List if (dataList.getItemCount() > 0) dataList.removeAll(); // Daten vom CGI-Skript lesen und in der List anzeigen String line = ""; while ((line = URLinput.readLine()) != null) { dataList.add(line); } URLinput.close(); } catch (IOException ex) { ex.printStackTrace(); } } catch(MalformedURLException e) { e.printStackTrace(); } }In diesem Beispiel ermittelt man den InputStream, durch den man die Daten der URL erhält, nicht durch die Methode openStream() der URL, sondern über die Zwischenstufe einer URLConnection:// URLConnection anlegen cgiConnection = cgiURL.openConnection(); // Daten an das CGI-Skript schicken cgiConnection.setDoOutput(true); URLoutput = new DataOutputStream(cgiConnection.getOutputStream()); URLoutput.writeBytes(data+"\n"); URLoutput.close(); // InputStream erzeugen URLinput = new BufferedReader( new InputStreamReader(cgiConnection.getInputStream()));Die Klasse URLConnection spielt eine große Rolle, wenn z. B. Daten an ein CGI-Skript übergeben werden müssen. Allgemein kann dies auf zwei Arten geschehen:Wie leicht zu sehen ist, benutzt obiges Beispiel letztere Methode:
- Die Daten können dem Dateinamen, mit dem der URL-Konstruktor aufgerufen wird, angehängt werden:
myURL = new URL("http", getCodeBase().getHost(), "/cgi-bin/CGIDemo.sh?Food");Die Daten werden dabei nach der GET-Methode verschickt: Das CGI-Skript holt sich die Daten aus der Umgebungsvariablen QUERY_STRING (get=holen). Die Menge der Daten, die übermittelt werden können, ist eingeschränkt, da die Länge von Zeichenfolgen in Umgebungsvariablen begrenzt ist.- Des Weiteren besitzt die Klasse URLConnection die Methode getOutputStream(). Ruft man diese auf, wird ein OutputStream erzeugt, der bei einem Unix-Server direkt mit der Standardeingabe des betreffenden CGI-Skripts verbunden ist. Hier wird die POST-Methode verwendet: Die Daten werden bei dieser Methode direkt als Inhalt im http-Protokoll übertragen.
// Daten an das CGI-Skript schicken cgiConnection.setDoOutput(true); URLoutput = new DataOutputStream(cgiConnection.getOutputStream()); URLoutput.writeBytes(data+"\n"); URLoutput.close();Bei der Benutzung einer URLConnection sind immer folgende Schritte durchzuführen:In obigem Beispiel muss eine Option für die Kommunikation mit dem Server gesetzt werden:
- Anlegen der URLConnection
Dies geschieht durch Aufruf der Methode openConnection(), die in der Klasse URL definiert ist. openConnection() liefert ein von URLConnection abgeleitetes Objekt zurück, das speziell für die Kommunikation mit dem Protokoll verwendet wird, mit dem das zugehörige URL-Objekt initialisiert wird.- Einstellen der Parameter
Nach der Initialisierung können verschiedene Parameter eingestellt werden, die für den Kommunikationsablauf von Bedeutung sind.- Aufbau der Verbindung
Der Verbindungsaufbau zum Server kann auf zwei Arten erfolgen. Zum einen ist es möglich, direkt die connect()-Methode der Klasse URLConnection aufzurufen. Die zweite Möglichkeit besteht darin, eine andere Methode aufzurufen, für deren Ausführung ein Verbindungsausführung erforderlich ist. In diesem Fall wird die Verbindung beim Aufruf automatisch aufbebaut (z. B. beim Zugriff auf Daten ohne vorherigen Aufruf von connect()).- Abrufen der Daten
Im letzten Schritt können die Daten abgerufen werden, die vom Server zurückgeliefert werden. Darunter fallen sowohl Daten über die Verbindung zum Server als auch das Dokument selbst.cgiConnection.setDoOutput(true);Mit setDoOutput(boolean) wird eingestellt, ob eine Ausgabe vom Client bei der Kommunikation mit dem Server erfolgt. Per Voreinstellung ist dieses Flag auf false gesetzt, d. h., es ist von Client-Seite keine Ausgabe zum Server möglich. Bei der Verwendung der POST-Methode müssen die Daten über einen OutputStream an den Server geschickt werden. Deshalb ist ein vorheriger Aufruf von setDoOutput() notwendig.
Neben der oben geschilderten Einstellung gibt es noch weitere Möglichkeiten, die Eigenschaften einer URLConnection zu verändern (z. B. kann festgelegt werden, ob bei der Verbindung Caches verwendet werden dürfen). Sie können im Einzelnen in der Referenz nachgeschlagen werden.
Nach dem Aufruf von setDoOutput(boolean) wird ein DataOutputStream erzeugt, dessen Ausgabe auf Server-Seite von einem CGI-Skript von der Standardeingabe gelesen werden kann. Der String, den showData() als Parameter besitzt, wird von diesem DataOutputStream ausgegeben. Je nach geschriebener Zeichenkette schickt das CGI-Skript unterschiedliche Daten zurück.
Sind die Daten alle vom DataOutputStream ausgegeben, wird dieser mit close() geschlossen.
Danach können die Daten auf Client-Seite analog zum Beispiel im letzten Abschnitt abgefragt werden. Der OutputStream muss aber vor dem Zugriff auf die Daten unbedingt geschlossen werden.
Das CGI-Skript auf Server-Seite muss die Fähigkeit besitzen, die ankommenden Daten zu lesen.
Das hier verwendete Shell-Skript sieht folgendermaßen aus:#!/bin/sh read data file=$data".data" echo "Content-Type: text/plain" echo cat $fileMit read data wird der übergebene Parameter von der Standardeingabe gelesen. Danach erfolgt die Ausgabe der Daten. Die Daten sind in einer Datei gespeichert, deren Name sich aus dem Parameter und einem angehängten .data zusammensetzt. Diese Datei wird mit cat $file ausgegeben.
In diesem Beispiel wird entweder eine Liste von Getränken oder von Speisen angefordert. Für jede Liste besitzt das Applet einen Button. Drückt man einen Button, wird die entsprechende Liste geladen und in einer List angezeigt.
Material zum Beispiel
Die Datendatei Food.data enthält in jeder Zeile einen Eintrag:
- Applet starten
- Quelltexte:
Fish Pork Chicken BeefDrinks.data ist entsprechend aufgebaut.