Datenbanksysteme: Eine Einführung

Programmbeispiele

UniVerwaltung - Beispiel Web-Service

Auf dieser Seite wird gezeigt, wie ein einfacher Web Service und ein dazu passender Client implementiert werden können. Als Beispiel wird ein Service entworfen, der auf dem bekannten relationalen Universitäts-Datenbankschema aufbaut. Der Dienst ermöglicht die Abfrage des Lehrumfangs von Professoren. Unter Lehrumfang ist die Summe der Semesterwochenstunden (SWS) der gehaltenen Vorlesungen zu verstehen. Hierzu delegiert der Web Service den Aufruf an eine Klasse, die eine JDBC-Verbindung zu einer Datenbank aufbaut und auf dieser die eigentliche Abfrage durchführt. In SQL lässt sich die Abfrage für einen Professor mit Namen 'ProfName' wie folgt formulieren:

SELECT SUM(v.SWS) AS LehrUmfang
FROM Vorlesungen v, Professoren p
WHERE v.gelesenVon = p.PersNr
AND p.Name ='ProfName'

Die Funktionalität und der Aufbau eines Web Services wird in einem zugehörigen WSDL-Dokument festgelegt. Da dies die Schnittstelle ist, die Anwender oder andere Programme verwenden, um auf den Dienst zuzugreifen, soll im Folgenden gezeigt werden, wie ein Web Service aus der Vorlage eines solchen WSDL-Dokuments semi-automatisch erstellt werden kann.

Der vorgestellte Service heißt UniVerwaltung und ist für Testzwecke unter der folgenden URL errreichbar


Das WSDL-Dokument, welches die Schnittstellen des Dienstes spezifiziert, ist abrufbar unter


Dateien

Neben einer aktuellen Java-Version wird benötigt:

Tomcat

Zum Testen des Beispiel-Web Services benötigt man einen Web Server. Hierfür empfehlen wir Apache Tomcat Version 4 oder 5 (http://jakarta.apache.org/tomcat). Der Installationspfad von Tomcat wird im Folgenden als <catalina_home> bezeichnet.

Ant

Um die Erstellung des Web Services und das Ausführen des Clients zu erleichtern, ist den Sourcen ein Apache Ant build-file (build.xml) beigefügt. Hierzu wird eine aktuelle Version von Ant benötigt. Zudem sollten die ausführbaren Skripten (im Verzeichnis <apache-ant.home>/bin, wenn <apache-ant.home> der Installationspfad von Ant ist) in die PATH-Umgebungsvariable mit aufgenommen werden, sowie die Bibliotheken (im Verzeichnis <apache-ant.home>/lib) zum CLASSPATH hinzugefügt werden.

Axis

Im Folgenden wird vorgestellt, wie aus einer WSDL-Beschreibung automatisch die Java-Klassen des Web Services generiert werden können (bzw. das "Gerüst" des Services). Dazu wird die Apache Axis Bibliothek benötigt, die auf der Seite http://ws.apache.org/axis heruntergeladen werden kann.

Der Axis-Web-Server muss in Tomcat eingebunden werden. Dazu muss das Verzeichnis <axis.home>/webapps/axis in das Tomcat-Verzeichnis kopiert werden (<catalina.home>/webapps). Siehe hierzu die Installationsdokumentation von Apache Axis selbst. Bevor mit dem Test des UniVerwaltung-Web Services begonnen wird, sollte die Installation von Axis erfolgreich getestet worden sein.

Apache Axis benötigt zur Ausführung einen XML Parser (Xerxes oder Crimson). Siehe hierzu den Users-Guide von Axis.

JDBC-Treiber

Der Zugriff auf die Datenbank erfolgt über JDBC. Der dafür notwendige Treiber ist Datenbankhersteller-abhängig, so dass wir ihn an dieser Stelle nicht genauer angeben können. SQL-Skripten zum Aufbau einer eigenen Beispiel-Datenbasis einer Universitätsverwaltung finden Sie hier. Der Treiber muss für die Ausführung im CLASSPATH aufgelistet sein. Kopieren Sie ihn dazu z.B. in das Tomcat-Verzeichnis <catalina.home>/common/lib. (Hinweis: endet der Treiber auf .zip, so sollten Sie ihn in eine .jar-Datei umbenennen. Andernfalls kann es vorkommen, dass der Treiber nicht geladen wird)

Installation des Beispiels

Zuerst muss das angegebene zip-Archiv heruntergeladen und entpackt werden.

Konfiguration der build-Datei

Als nächstes muss das Ant build.xml-File angepasst werden, d.h. Bibliothekspfade etc. müssen auf die lokale Installation angepasst werden.
Zu ändernde Properties:

  • catalina.home: Installationspfad von Tomcat.
  • axislib.home: Bibliothekspfad von Axis. D.h. in der Regel also ${catalina.home}/webapps/axis/WEB-INF/lib.
  • axis.services: Web Services Verzeichnis von Axis, meist ${catalina.home}/webapps/axis/WEB-INF/classes
  • endpoint.address: URL unter der der Web Service dann verfügbar ist. Evtl muss diese Property, abhängig von der Axis-Installation oder des Ports unter dem Services angesprochen werden können, geändert werden..
  • Call.ProfName: Dieses Property wird als Parameter beim Aufruf des Client mit übergeben. Es ist der Name des Professors, dessen Lehrumfang ermittelt werden soll.

Falls man sich an die Standardinstallation gehalten hat, so ist eigentlich nur der Pfad von Tomcat, d.h. catalina.home, anzupassen. Auf jeden Fall sollte man überprüfen, ob die Bibliotheken des <path>-Elements alle korrekt eingebunden sind.

Erzeugen der Java-Klassen

Dieses Beispiel soll zeigen, wie aus der Beschreibung eines Web Services mittels WSDL der eigentliche Dienst semi-automatisch erzeugt werden kann. Das Verhalten des Dienstes wird in der zugehörigen WSDL-Datei festgelegt. Ein WSDL-Dokument besteht aus einem abstrakten Abschnitt das prinzipiell types-, message- und portType- Definitionen umfasst. Abstrakt deshalb, weil die Definition unabhängig von Endpunktadressen (URLs) vorgenommen wird. Die geschieht in dem anschließenden konkreten Teil, der aus binding-, port- und service-Definitionen besteht. Unter anderem beinhaltet das WSDL-Dokument des Beispiel-Web Services:

  • Nachrichtendefinition: Das Format der Ein- und Ausgabedaten wird in dem message-Element beschrieben. Es werden zwei Nachriten definiert: GetLehrUmfangVonProfessorRequest, dessen part-Element der Professorenname vom Typ xsd:string ist, und GetLehrUmfangVonProfessorResponse mit einem part-Element LehrUmfang vom Typ xsd:integer.
  • Port-Typen: Ein Port kann mehrere Operationen zusammenfassen, wobei eine Operation (im Beispiel GetLehrUmfangVonProfessor) sich aus den zuvor definierten Nachrichten zusammensetzt.
  • binding: definiert das Nachrichtenformat und verwendete Protokoll für die Operation eines bestimmten port-Typs.
  • Service-Definition: Eine Service-Definition besteht aus mehreren zusammengehörigen Ports. Wobei ein Port für ein binding-Element eine Netzwerkadresse (sog. Endpunkt) festlegt.

Das vorgegebene WSDL-Dokument beschreibt insgesamt einen Dienst der das Abfragen des Lehrumfangs eines Professors ermöglicht. Der Dienst stellt den Port UniVerwaltungPortType und dieser die Operation getLehrUmfangVonProfessor bereit, der als Argument der Name des Professors übergeben wird. Der Rückgabewert ist die Summe der Vorlesungsstunden.

Apache Axis bietet die Möglichkeit aus der Beschreibung eines Dienstes mittels WSDL automatisch Java-Klassen zu erstellen, die das Gerüst des Services darstellen. Der Programmierer des Dienstes muss dann nur noch an einer Stelle die Funktionalität einfügen. Um die Java-Klassen zu erstellen ist folgender Aufruf notwendig:

ant wsdl2java

Folgende Dateien werden dadurch (im $src Ordner) erzeugt:


Einfügen der eigentlichen Programmlogik

Im Ordner /UniVerwaltung befindet sich zudem noch die Datei InquireDB.java. Die Klasse InquireDB enthält die eingentliche Programmlogik, d.h. sie dient zum Aufbau einer Verbindung zur Datenbank und zum stellen der Anfrage, wie groß der Lehrumfang für einen bestimmten Professor ist.

Notwendige Änderungen

  • Geben Sie in dieser Klasse die Verbindungsdaten für ihre eigene Test-Datenbank an
  • Ändern Sie ggf. die Package-Definition, sie sollte mit der der zuvor erstellten Java-Klassen übereinstimmen
  • In der Klasse UniVerwaltungSOAPBindingImpl müssen Sie dann nur noch return -3; ersetzen durch

    return InquireDB.getLehrUmfangVonProfessor( profName )

Installation des Web-Services

Kopieren Sie die Klasse $src/Client.java in das Verzeichnis, in welchem sich auch die automatisch generierten Service-Klassen befinden ( da diese Testklasse die zuvor erstellten Service-Klassen verwendet) und passen Sie die Package-Definition an. Anschließend können Sie das Testprogramm übersetzen und ausführen mit

ant run-client

Dabei wird als Parameter der Name des Professors, dessen Lehrumfang ermittelt werden soll, mit übergeben. Dieser Parameter lässt sich in build.xml über das Property Call.ProfName ändern.

Ein weiteres Client-Programm  (ClientUniVerwaltung.java) kann ohne zusätzliche Pakete übersetzt und ausgeführt werden. In dieser Klasse ist die SOAP-Kommunikation nachvollziehbar, die in dem zuvor vorgestellten Client-Programm verborgen ist.

Deinstallation des Web-Services

ant undeploy

Zusätzlich sind in build.xml noch die Properties

redeploy

(Deinstallieren und erneutes Installieren) und

clean

(Löscht den Inhalt des build-Ordners) enthalten.