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:
// 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:
- 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.
In obigem Beispiel muss eine Option für die Kommunikation
mit dem Server gesetzt werden:
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.