Java - von Rias A. Sherzad am Sonntag, Januar 27, 2008 23:45 - 7 Kommentare
WebService in Java
Mit Erscheinen des JDK 6 ist die Implementation von WebServices noch einfacher geworden, da die benötigten Libraries aus dem Java Web Services Developer Pack (JWSDP) Einzug in das JDK 6 Release gefunden haben. Alternativ lässt sich beispielsweise immer noch Apache Axis verwenden, aber für das folgende, einfache, Beispiel nutzen wir die Standardlibraries. Implementiert werden soll eine einfache Anwendung, die die Summe zweier übergebenen Werte zurückgibt und diese Funktionalität als WebService bereitstellt.
Vorweg sei Ihnen zum besseren Verständnis der Thematik das absolut lesenswerte Standardwerk von Ingo Melzer, Service-orientierte Architekturen mit Web Services: Konzepte – Standards – Praxis, ans Herz gelegt. Es geht nicht nur auf WebServices und die damit zusammenhängenden Technologien, sondern auch auf die Service-orientierten Architekturen ein und sollte in keinem IT-Bücherschrank fehlen.
Was ist ein WebService?
Vereinfacht ausgedrückt stellt ein Anbieter über einen WebService einen Dienst bereit, der von externen Anwendungen angesprochen werden kann. Über den Verzeichnisdienst UDDI oder auch ebXML können solche Dienste öffentlich gemacht werden und über die Web Services Description Language (WSDL), einer XML-Spezifikation, wird angebundenen Anwendungen bekannt gegeben, welche Funktionen der Dienst genau bereitstellt. Die Kommunikation findet über das Simple Object Access Protocol (SOAP), einem XML-basierten Protokoll, statt.
Der Vorteil dieser Gesamtkombination ist, daß die Dienste, als auch die sie benutzenden Anwendungen, in grundverschiedenen Programmiersprachen und Plattformen implementiert sein können. Ein Dienst kann beispielsweise in .NET implementiert sein, seine Schnittstellen als WebService per UDDI und WSDL öffentlich machen und über SOAP mit einem PHP oder Java-Client kommunizieren und Aufrufe seiner Funktionen ermöglichen.
Implementation der WebService Klasse
Prinzipiell lässt sich jede Klasse als WebService exportieren. Alles was wir dafür tun müssen ist, die in Java 5 eingeführten Java Annotations dazu zu verwenden, unsere Klassen als WebService zu deklarieren. Die folgende normale Java-Klasse:
- package de.theserverside.webservice.service;
- public class Calculator {
- public long addValues(int val1, int val2) {
- return val1 + val2;
- }
- }
… wird, versehen mit WebService-spezifischen Java Annotations, zu folgender Klasse:
- package de.theserverside.webservice.service;
- import javax.jws.WebService;
- import javax.jws.soap.SOAPBinding;
- import javax.jws.soap.SOAPBinding.Style;
- @WebService
- @SOAPBinding(style=Style.RPC)
- public class Calculator {
- public long addValues(int val1, int val2) {
- return val1 + val2;
- }
- }
Über die Angabe @SOAPBinding(style=Style.RPC)
geben wir an, daß diese Klasse per SOAP-Protokoll gebunden werden soll und die Kommunikation prozedurorientiert (RPC = Remote Procedure Call) stattfindet. Das zeigt an, daß Aufrufe Parameter enthalten und Werte zurückgegeben werden. Die Angabe Style.DOCUMENT
hieße, daß Aufrufe Dokumente enthielten.
Implementation des WebService Servers
Diese Klasse möchten wir jetzt als WebService veröffentlichen und implementieren dazu einen Server, der sie nach außen veröffentlicht. Die Publizierung findet dabei über den integrierten HTTP-Server statt:
- package de.theserverside.webservice.server;
- import javax.xml.ws.Endpoint;
- import de.theserverside.webservice.service.Calculator;
- public class CalculatorServer {
- public static void main (String args[]) {
- Calculator server = new Calculator();
- Endpoint endpoint =
- Endpoint.publish("http://localhost:8080/calculator", server);
- }
- }
Starten Sie diese Klasse aus der Entwicklungsumgebung heraus und prüfen Sie den Erfolg der Operation, indem Sie im Webbrowser die folgende URL aufrufen:
- http://localhost:8080/calculator?wsdl
Sie sollten etwa folgende Ausgabe erhalten:
- <!--?xml version="1.0" encoding="UTF-8"?-->
- <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. -->
- <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.1 in JDK 6. -->
- <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.webservice.theserverside.de/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetnamespace="http://service.webservice.theserverside.de/" name="CalculatorService">
- <types></types>
- <message name="addValues">
- <part name="arg0" type="xsd:int"></part>
- <part name="arg1" type="xsd:int"></part>
- </message>
- <message name="addValuesResponse">
- <part name="return" type="xsd:long"></part>
- </message>
- <porttype name="Calculator">
- <operation name="addValues" parameterorder="arg0 arg1">
- <input message="tns:addValues">
- <output message="tns:addValuesResponse"></output>
- </operation>
- </porttype>
- [...]
Implementation des WebService Clients
Bisher haben Sie die wichtigsten Informationen bekommen, um einen WebService-Dienst zu entwickeln. Für den programmatischen Zugriff auf diesen Dienst möchten wir jetzt aus der publizierten WSDL-Datei die benötigten Service-Klassen generieren, die wir für unseren Client benötigen. Rufen Sie dazu, im Source-Verzeichnis eines zweiten Java-Projekts, auf der Shell den folgenden Befehl auf:
- wsimport -keep http://localhost:8080/calculator?wsdl
Über den -keep
-Parameter werden die generierten Java-Klasse behalten und nicht nach dem Kompilieren gelöscht. Wenn der Befehl fehlerlos durchgelaufen ist finden Sie folgende vier generierten, bzw. kompilierten, Dateien vor:
- Calculator.java
- Calculator.class
- CalculatorService.java
- CalculatorService.class
Jetzt, da wir das Interface und die dazugehörige Service-Klasse generiert haben, können wir uns an die Implementation des Clients machen. Auch diese gestaltet sich recht einfach, wie das folgende Codestück zeigt:
- package de.theserverside.webservice.client;
- import de.theserverside.webservice.service.Calculator;
- import de.theserverside.webservice.service.CalculatorService;
- public class CalculatorClient {
- public static void main(String args[]) {
- CalculatorService service = new CalculatorService();
- Calculator calculator = service.getCalculatorPort();
- System.out.println("Summe: " + calculator.addValues(17, 13));
- }
- }
Der aus der WSDL generierte CalculatorService
übernimmt die Kommunikation zum Server. Ein Handle auf unseren Calculator
erhalten wir über den Aufruf von getCalculatorPort()
, welches wir anschließend für Zugriffe auf unsere Klasse nutzen.
Starten Sie diese Klasse und Sie erhalten die folgende Ausgabe:
- Summe: 30
Sourcecode zum Artikel
Die beiden Java-Projekte, den Client und den Server, können Sie hier herunterladen:
WebService in Java – Client
WebServices in Java – Server
Weiterführende Literatur
Weitere Informationen zur Implementation von WebServices in Java, hier mit dem Framework AXIS2, finden Sie in dem Buch Java Web Services mit Apache Axis2 von Thilo Frotscher, Marc Teufel und Dapeng Wang, die auch für diverse Artikel im Java Magazin verantwortlich zeichnen. Im Zusammenhang mit Service-orientierten Architekturen (SOA) werden WebServices im von Lesern sehr gut bewerteten Service-orientierte Architekturen mit Web Services: Konzepte – Standards – Praxis beschrieben.
7 Kommentare
WebService erstellen - Forum Fachinformatiker.de
[…] Ich denke dein Problem sollte es erstmal nicht weitere komplizierte Methoden einzubinden sondern erstmal dein Hauptproblem zu l?sen. Denn du greifst bis jetzt immer nur via SoapUI auf deinen Webservice zu. Das ist aber nicht Ziel der Veranstaltung sondern ein Client soll drauf zugreifen. Du solltest dir jetzt f?r dein einfaches Beispiel einen Client erstellen der dann den Zugriff ausf?hrt und dir dein Ergebnis liefert. Da ich immer noch nicht weiss was f?r eine Webservice Runtime du da einsetzt hier mal ein Link zu einer recht einfachen Beschreibung. WebService in Java […]
[…] in java. Ich habe dieses Tutorial durchgearbeitet, was ?brigens sehr gut geschrieben ist: http://theserverside.de/webservice-in-java/ Das ganze funktioniert auch soweit es im Tutorial beschrieben ist. Nur m?chte ich jetzt den […]
[…] JAVA und SOAP Hi, ich hab ein kleines Problem. Ich habe mit Hilfe dieser sch?nen und einfachen Seite einen kleinen Webservice geschrieben mit dem ein Applet kommunizieren kann (Echo-Server). Gibt es […]
[…] auch zu “>Weblinks zu zu W3C: SOAP Specifications (englisch)XML protocol activity (englisch)Beispiel für einen WebService mit Java/SOAP Schritt-für-Schritt-Anleitung für die Implementation eines WebServices in Java mit SOAP (Stand: […]
Nachrichten an Java-Programm senden - Delphi-PRAXiS
[…] den passenden SOAP Request zu Fuss erstellen. Ein deutschsprachiges Beispiel ist hier zu finden: http://theserverside.de/webservice-in-java/ Michael […]
Webservice (Server Java, Client Android) - Android-Hilfe.de
[…] Android) naMediaAd.includeAd("MEDIUM_RECTANGLE"); Hallo, ich habe folgendes probiert: WebService in Java Wenn ich exakt das gleiche Projekt in Java erstelle und den Client ebenso in Java erstelle […]
Kommentieren
Weitere Empfehlungen:
Java - Jul 19, 2011 20:30 - 0 Kommentare
Eine (wirklich gute) Einführung in Maven
Mehr Artikel der Kategorie Softwarearchitekturen
- Decorator Pattern in Java
- Cloud Computing mit Google App Engine und Java
- JMS mit Oracle Advanced Queueing
- Buchempfehlung: Service-orientierte Architekturen mit Web Services. Konzepte – Standards – Praxis
- Einführung in SOA – Serviceorientierte Architekturen
Datenbanken, Internet Technologien - Nov 19, 2009 9:24 - 0 Kommentare
Oracle WebServices im praktischen Einsatz
More In Datenbanken
- JMS mit Oracle Advanced Queueing
- Eine kurze Einführung in db4o
- Native Kompilierung von PL/SQL-Routinen in Oracle 10g
[…] WebService starten! Morgen! Danke erst mal f?r die zahlreichen antworten! Also auf der Seite http://theserverside.de/webservice-in-java/ steht "… Bisher haben Sie die wichtigsten Informationen bekommen, um einen […]