package javacodebook.xml.transport.http.get;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
* Der XMLGetSender erweitert das HttpServlet und implementiert
* die doGet-Methode. Für jeden empfangenen Get-Request wird ein
* http-Parameter namens 'fileName' ausgelesen, der den absoluten
* Pfad zu einer XML-Datei beschreibt. Im weiteren Verlauf der
* doGet-Methode wird diese Datei gelesen und zum Client geschrieben.
*/
public class XMLGetSender
extends HttpServlet {
// Dadurch, dass die doGet-Methode überschrieben wird, unterstützt dass Servlet
// die http-get-Methode.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// Auslesen des Parameters 'fileName'.
String fileName = request.getParameter("fileName");
// Es wird ein Printwriter auf Basis eines Writer-Objektes von der HttpResponse
// instanziiert über den die Antwort zurück zum Client geschrieben wird.
PrintWriter pw = new PrintWriter(response.getWriter());
// Die Antwort ist vom Content-Type "text/xml"
response.setContentType("text/xml");
try {
// Es wird die entsprechende Datei im Dateisystem gesucht und ein BufferedReader-
// Objekt zum lesen der Datei erzeugt.
FileInputStream fis = new FileInputStream(fileName);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
System.out.println("Folgendes Dokument wird zum Client geschickt:\n");
String line = null;
// Nun wird der Inhalt der Datei zum Client und zur Kontrolle auch
// in die Standardausgabe geschrieben.
while ( (line = br.readLine()) != null) {
pw.println(line);
System.out.println(line);
}
}
// Falls bei der Verarbeitung ein Ausnahmefall auftritt, wird eine
// XML-Nachricht zum Client zurück geschrieben, wobei in
// diesem Beispiel der Fehlercode -1 für den Ausnahmefall steht.
// Innerhalb des message-Elements wird die Fehlermeldung eingefügt.
catch (Exception e) {
pw.println("" + e.toString() + "");
}
System.out.println("\nhttp-get-Request bearbeitet\n\n");
}
}
--- Neue Klasse ---
package javacodebook.xml.transport.http.get;
import java.net.*;
import java.io.*;
/**
* Die XMLGetter-Klasse benutzt ein URL-Objekt um XML-Dokumente von beliebigen Urls, die z.B.
* über die Kommandozeile übergebenen werden, abzurufen. Dabei wird die http-get-Methode verwendet.
*/
public class XMLGetter {
private static final String USAGE =
"\nBenutzerhinweis: javacodebook.xml.transport.http.get.XMLGetter " +
" [ ...]\n\nwobei \n\n\n" +
"die URL ist, von der die XML-Dokumente geholt werden sollen und\n\n [ ...]\n" +
"ein oder mehrere durch Leerzeichen getrennte Namen von XML-Dateien sind, die \n" +
"per get von der URL geholt werden sollen";
/**
* An die main-Methode müssen die Parameter und eine durch Leerzeichen getrennte Folge von
* Dateinamen [ ...] übergeben werden. Es wird ein Objekt vom Typ XMLGetter instanziiert.
* Der erste Parameter wird als URL ausgelesen. Für jeden weiteren Paramter wird versucht, eine entsprechende
* Datei von der zuvor ausgelesenen URL zu holen.
*/
public static void main(String args[]) {
if (args.length < 2) {
System.out.println(getUsage());
System.exit(1);
}
else {
String urlString = args[0];
XMLGetter xMLGetter = new XMLGetter();
for (int i = 1; i < args.length; i++) {
String fileName = args[i];
try {
String xml = xMLGetter.getXMLFromURL(fileName, urlString);
}
catch (Exception e) {
System.out.println("Probleme bei der Ausführung: " + e);
}
}
}
}
private String getXMLFromURL(String fileName, String urlString) throws
Exception {
String documentReceived = "";
try {
// Instanziierung eines URL-Objektes nach RFC 2396: Uniform Resource Identifiers (URI): 'Generic Syntax'
// nachgebessert durch RFC 2732: 'Format for Literal IPv6 Addresses in URLs'.
// Der Datei-Name wird dabei als HTTP-Parameter namens 'fileName' übergeben.
URL url = new URL(urlString + "?fileName=" + fileName);
// Durch das Aufrufen, der openStream-Methode auf das URL-Objekt wird der
// HTTP-Request beim Server abgesetzt und ein InputStream erzeugt, der die
// Antwort kapselt.
InputStream is = url.openStream();
// Nun wird die Antwort ausgelesen
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ( (line = br.readLine()) != null) {
documentReceived = documentReceived + line;
}
// Auch hier muss der InputStreamReader und somit der InputStream wieder geschlossen werden, da es sonst
// zu Resourcenverschwendung kommt. Besonders auf Solaris-Systemen kann das fatale Folgen haben, da für jeden
// nicht geschlossenen InputStream ein File-Descriptor offen gehalten wird und die Zahl der erlaubten offenen
// File-Descriptoren oft relativ eingeschränkt ist.
isr.close();
// Nun kann das empfangene Dokument verarbeitet werden
System.out.println(
"\n\nFolgendes Dokument wurde vom Server empfangen:\n " +
documentReceived);
}
catch (Exception e) {
throw new Exception("Probleme beim aufrufen der URL '" + urlString +
"' mit: " + e);
}
return documentReceived;
}
public static String getUsage() {
return USAGE;
}
}