WebService mit Java 6 Proof of Concept / Mini_HowTo



Ähnliche Dokumente
WebService in Java SE und EE

Wiederholung: Beginn

Verteilte Systeme: Übung 4

Java Web Services Metadata JSR-181

Themen. Web Service - Clients. Kommunikation zw. Web Services

Auszug aus JAX-WS Folien

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Java: Vererbung. Teil 3: super()

Übung: Verwendung von Java-Threads

Anleitung über den Umgang mit Schildern

Adminer: Installationsanleitung

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Web-Sevices : WSDL Entwicklung von Web-Anwendungen

Einführung in die Java- Programmierung

Info-Veranstaltung zur Erstellung von Zertifikaten

Tutorial -

Der lokale und verteilte Fall

Anleitung zur Webservice Entwicklung unter Eclipse

WSDL. Web Services Description Language. André Vorbach. André Vorbach

Wie halte ich Ordnung auf meiner Festplatte?

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Version smarter mobile(zu finden unter Einstellungen, Siehe Bild) : Gerät/Typ(z.B. Panasonic Toughbook, Ipad Air, Handy Samsung S1):

.NET Code schützen. Projekt.NET. Version 1.0

AutoCAD Dienstprogramm zur Lizenzübertragung

IMAP Backup. Das Programm zum Sichern, Synchronisieren, Rücksichern und ansehen von gesicherten Mails. Hersteller: malu-soft

Flashfragen in ILIAS Test & Assessment. Helmut Schottmüller

Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

E Mail Versand mit der Schild NRW Formularverwaltung

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Programmieren in Java

Einführung in die Informatik Tools

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Anleitungen zum KMG- -Konto

Verarbeitung der Eingangsmeldungen in einem Callcenter

Vertiefte Grundlagen Graphentheorie

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Fotogalerie mit PWGallery in Joomla (3.4.0) erstellen

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Wie man die SLNP-Schnittstelle für ILL2 in ALEPH testet (SLNP2)

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Speicher in der Cloud

Informatik 1 Tutorial

Externe Abfrage von für Benutzer der HSA über Mozilla-Thunderbird

Objektorientierte Programmierung

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

Dokumentation IBIS Monitor

teamsync Kurzanleitung

Pfötchenhoffung e.v. Tier Manager

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

OP-LOG

1. Der Router ist nicht erreichbar Lösungsansatz: IP Adresse des Routers überprüfen ( entweder irgendwo auf dem Gerät aufgeklebt oder im Handbuch )

Viele Bilder auf der FA-Homepage

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

Erstellen einer digitalen Signatur für Adobe-Formulare

Titel. App-V 5 Single Server Anleitung zur Installation

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Inkrementelles Backup

4 Aufzählungen und Listen erstellen

Monatstreff für Menschen ab 50 Temporäre Dateien / Browserverlauf löschen / Cookies

Erstellen einer GoTalk-Auflage

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Vorgehensweise bei Lastschriftverfahren

Programme im Griff Was bringt Ihnen dieses Kapitel?

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

Informationen zum neuen Studmail häufige Fragen

How to install freesshd

Asynchrone Webservices mit Axis 1.x in Java

Hinweise zur Datensicherung für die - Prüfmittelverwaltung - Inhalt

ASA Schnittstelle zu Endian Firewall Hotspot aktivieren. Konfiguration ASA jhotel

LANiS Mailversender ( Version 1.2 September 2006)

Thunderbird herunterladen, Installieren und einrichten Version (portable)

Einführung in die Programmierung

WLAN Konfiguration. Michael Bukreus Seite 1

euro-bis Import von Bestellungen aus Buch- und Aboauskunft Stand

Informations- und Kommunikationsinstitut der Landeshauptstadt Saarbrücken. Upload- / Download-Arbeitsbereich

Einführung in TexMaker

Zustandsgebundene Webservices

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel für Mac. amac-buch Verlag

Gemeinsamer Bibliotheksverbund: Übertragung von Datenexporten für den Verbundkatalog Öffentlicher Bibliotheken

Sichere Anleitung Zertifikate / Schlüssel für Kunden der Sparkasse Germersheim-Kandel. Sichere . der

GEONET Anleitung für Web-Autoren

Anleitung, WebRecherche

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Dokumentation zur Versendung der Statistik Daten

Zusammenführen mehrerer Dokumente zu einem PDF In drei Abschnitten erstellen Sie ein Dokument aus mehreren Einzeldokumenten:

Visual Basic Express Debugging

Bei der Anlage von Pauschalen ist folgendes zu beachten!!!!!!!!

Kommunikations-Parameter

Installation von Druckern auf dem ZOVAS-Notebook. 1. Der Drucker ist direkt mit dem Notebook verbunden

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Algorithmen und Datenstrukturen

Virtual Private Network

MdtTax Programm. Programm Dokumentation. Datenbank Schnittstelle. Das Hauptmenü. Die Bedienung des Programms geht über das Hauptmenü.

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Transkript:

WebService mit Java 6 Proof of Concept / Mini_HowTo Die Bereitstellung von WebServices mit Java ist natuerlich schon laenger moeglich, z.b. mittels JAX-WS, XFire oder Apache Soap bzw. Axis. Das Spannende ist nun (fuer mich zumindest), dass JAX-WS (SUN-Standard) in Java 6 in den Bordmitteln enthalten ist (javax.jws.* bzw javax.jws.soap.*). Es hat das komplette Java Web Services Developer Pack (JWSDPD) in Java 6 Einzug gehalten. Die Nutzung von SOAP ist Standard. (Es existieren natuerlich auch APIs fuer weitere Programmiersprachen.) Es wird ein WebService mit zwei Methoden auf (dem Standard-) Port 8080 in Java implementiert. Nach Veroeffentlichung des WebService wird mittels des in Java 6 enthaltenen Tools "wsimport" (hier: JAX-WS RI 2.0_02-b08-fcs) die WSDL/XML des WebService abgefragt. Dabei werden die Stubs fuer den Client automatisch erzeugt. Der Client greift dann auf den WebService zu und nutzt jede der Methoden mindestens einmal. Die Ausarbeitung ist HowTo-alike angelegt, da es sich um ein Vorgehen in mehreren Schritten handelt. Es kann auch problemlos (so hoffe ich) nachvollzogen werden. Das erste Hurra/Aha-Erlebnis ist nach Minuten garantiert. Als "IDE" benutze/empfehle ich Notepad, es klappt aber auch mit Notepad++, Kate, BBEdit, TextMate, vi, Nano oder joe. Eine Kommandozeile/MS-Dos Eingabeaufforderung ist auch notwendig (eigentlich zwei davon wenn der Server mal laeuft und die ersten DosBox belegt). Serverseitig gibt es zwei Dateien: - WSJavaSixProofOfConcept.java Der eigentliche WebService samt zugehoeriger Methoden und notwendiger Annotationen - WsServer.java Der Server, der den WebService instantiiert und den Server als solches stellt Clientseitig wird es drei Dateien geben: Von diesen drei Dateien wird aber nur der eigentliche Client "selbst" geschrieben (WsClient.java). Die anderen beiden Klassen sind die notwendigen und von "wsimport" automatisch generierten Stubs (hier: WSJavaSixProofOfConceptService.java und DegiorgiWs.java). Seite 1 / 9

Verzeichnisstruktur: Die Verzeichnis Struktur ist wichtig, da der Einfachheit wegen auf eine Paketangabe (import package.some.more.detail) verzichtet wurde. Stattdessen enthaelt WSJavaSixProofOfConcept.java in der Annotation @WebService(...) neben der Angabe des Namens des WebService ebenso die Angabe eines (target)namespace. - / ("root" Verzeichnis) - /WSJavaSixProofOfConcept.java - WsServer.java - /src/ Hier liegt lediglich der (selbstgeschriebene) Client - /src/wsclient.java - /src/foo/ Hier werden die von wsimport erzeugten Client-Stubs liegen (automatisch erzeugt). Je nach Paketangabe bzw. targetnamespace ist diese Struktur natuerlich anders. - /src/foo/ WSJavaSixProofOfConceptService.java (automatisch erzeugt) - /src/foo/ DegiorgiWs.java (automatisch erzeugt) Server: - WSJavaSixProofOfConcept.java Der WebService wird ueber die Annotation @WebService(..) definiert. In diesem Falle erfolgt noch die Vergabe eines Namens und die Benennung eines targetnamespaces. Letzteres kann entfallen wenn mit packages gearbeitet wird. Hier also: @WebService(name= degiorgi_ws, targetnamespace= foo ) Der Webservice soll ueber zwei Methoden verfuegen. Eine mit (benanntem/mittels der Annotation @WebParam(name="yourname")) Parameter sayhelloworld(name), die lediglich das uebliche HelloWorld Spiel mit einem uebergebenen Namen spielt. Die zweite Methode ist parameterlos und gibt per Zufallsgenerator einen String zurueck der in einer von 29 verfuegbaren Sprachen "PROST" bedeutet. Die Methoden muessen mit der Annotation @WebMethod versehen sein, damit sie erreichbar/veroeffentlich werden. Hier ist eine (Um-)Benennung der Methoden mittels @WebMethod(operationName="some_name") moeglich und auch angewandt. Der Konstruktor der Klasse befuellt lediglich das String Array intprosts mit den "PROST"s. Seite 2 / 9

- WsServer.java Diese Klasse enthaelt lediglich eine statische main-methode, die die eigentliche WebService Klasse instantiiert und via javax.xml.ws.endpoint als Endpunkt zur Verfuegung stellt / publish() ed. So ist der WebService via Browser verfuegbar, bis der Endpoint.stop() gestoppt wird. Einschub Annotationen -Start- Liste der in/durch javax.jws nutzbaren Annotationen: - @WebService Jede WebService Klasse benoetigt diese Annotation - @SOAPBinding "Setzt den Stil der Nachrichten auf Dokument oder RPC" hier: @SOAPBinding(style = SOAPBinding.Style.RPC) / Bindung via SOAP Protokoll, prozedurorientiert - @WebMethod siehe oben - @WebParam Dient zur Beschreibung des (ggf.) Parameters - @WebResult Beschreibt Rueckgabe(wert) einer WebService Methode - @OneWay Kennzeichnung fuer einen asynchronen Methodenaufruf - @HandlerChain Kann genutzt werden um Reihe(n) externer Handler festzulegen - "viele" weitere unter javax.xml.ws, javax.xml.bind und javax.annotation, z.b. BindingType, RequestWrapper, ResponseWrapper, WebEndpoint, XmlRootElement, Resource,... fuer mehr siehe https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html Einschub Annotationen -Ende- Kompilierung des Servers: /:> javac WsServer.java Kompilierung des Servers. Dies sollte eine automatische Mit-/Vorkompilierung der WebService Klasse mitbringen. Sollte es zu Problemen kommen eben haendisch vorher ein... /:> javac WSJavaSixProofOfConcept.java (Kompilierung der WebService Klasse)...absetzen. Seite 3 / 9

Start des Servers: :/> java WsServer Server up-and-running. Zum Test der Funktionalitaet einen Webbrowser oeffnen. Je nachdem ob im WsServer.java der Endpoint angepasst wurde ist nun WSDL (XML) Beschreibung des WebService erreichbar. "Standard" ist (Zeile 8 / WsServer.java): Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services", new WSJavaSixProofOfConcept()); Somit ist der Abruf des WSDL moeglich unter: http://localhost:8080/services?wsdl Man erhaelt hier die vollstaendige Beschreibungsdatei. Fuer eine "von aussen" erreichbare Bereitstellung muss statt "localhost" beispielsweise die IP-Adresse angegeben werden unter der der Rechner im Netz erreichbar ist. Also etwa: Endpoint endpoint = Endpoint.publish( "http://192.168.0.23:8080/services", new WSJavaSixProofOfConcept()); Dann kann auch von anderen Rechnern auf den WebService zugegriffen werden. (tested @ homelan) Erzeugung der Client-Stubs: Auch hier gibt es wieder mehrere Moeglichkeiten, natuerlich bishin zur haendischen Erstellung. Jedoch rate selbst ich dringend von der "Handarbeits-Variante" ab und empfehle das Java 6 beiliegende "wsimport". Die Kommandozeile fuer die automatische Generierung lautet: :/> wsimport -d src -keep http://localhost:8080/services?wsdl Nach dem Aufruf wurden automatische zwei Klassen in /src/foo erzeugt und auch schon kompiliert: - /src/foo/degiorgiws.java Interface/Stub fuer den WebService. Die Methoden liegen sozusagen als Prototypen/Signaturen vor - /src/foo/wsjavasixproofofconceptservice.java Service Klasse fuer den Clienten um an den Endpoint/Port des Service "heranzukommen" Seite 4 / 9

(Den Hinweis von Herrn Ullenboom / Java-Champion / Autor "Java- Insel" moechte ich nicht verschweigen. Es gibt wohl (noch) einige Probleme mit der automatischen Erstellung dieser Stub Klassen. Selbst mit google-services. Jedoch dieses Beispiel sollte einwandfrei funktionieren.) Kompilierung des Clients: :/> cd src :/src/> javac WsClient.java Start des Clients: :/src/> java WsClient Hallo Welt! Ich bin's... der/die/das _ein_vorname_!!! INT_PROST_1 INT_PROST_2 INT_PROST_3 INT_PROST_4 INT_PROST_5 In Zeile 10 des Clients wird der Parameter "_ein_vorname_" an den WebService uebergeben. System.out.printf("\n%s\n\n",port.bePoliteAndSayHello("_ein_Vorname_")); Reminder: Obwohl die Methode eigentlich sayhelloworld(...) heisst wurde der der "operationname" in der Annotation @WebMethod(operationName="be-polite-andsay-hello") der Klasse WSJavaSixProofOfConcept des Servers auf "be-polite-and-say-hello" gesetzt, was letztendlich in bepoliteandsayhello(..) resultiert. Man ist hier vollkommen frei in der Wahl des WebService-Methoden- Namens, der wie man sieht unabhaenhig vom eigentlichen Methoden-Namen gewaehlt werden kann. Das vom WebService return'te return "Hallo Welt! Ich bin's... der/die/das " + name + "!!!"; wird empfangen und per System.out.printf(..) letztendlich ausgegeben. Dann wird fuenf mal die (ebenfalls via @WebMethod(operationName="was_anderes") / eigentlich sayinternationalprost()) parameterlose Methode beinternationalandsalute() aufgerufen, die in zufaelligen Sprachen fuenf mal "zum Wohle!" wuenscht. Der Client beendet sich dann. Seite 5 / 9

Quellen: http://java.sun.com/javase/technologies/webservices.jsp http://www.tutego.com/blog/javainsel/ http://www.galileocomputing.de/openbook/javainsel7/javainsel_18_007.htm http://www.theserverside.de/webservice-in-java/ https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html http://www.sherzad.com/ Seite 6 / 9

Anhang: WSJavaSixProofOfConcept.java import javax.jws.*; import javax.jws.soap.soapbinding; @WebService(name="degiorgi_ws", targetnamespace = "foo") @SOAPBinding(style = SOAPBinding.Style.RPC) public class WSJavaSixProofOfConcept String[] intprosts = new String[29]; public WSJavaSixProofOfConcept() intprosts[0] = new String("Iechyd da (Welsh)"); intprosts[1] = new String("Chia (Vietnamese)"); intprosts[2] = new String("Cheers (English)"); intprosts[3] = new String("Sagliginiza (Turkish)"); intprosts[4] = new String("Choc-tee (Thai)"); intprosts[5] = new String("Arriba, abajo, al centro, para adentro (Spanish)"); intprosts[6] = new String("Salud (Spanish)"); intprosts[7] = new String("Zivio Ziveli (Serb)"); intprosts[8] = new String("Slainte (Scottish)"); intprosts[9] = new String("Na zdorovje (Russian)"); intprosts[10] = new String("A sia saide (Portuguese)"); intprosts[11] = new String("Ye zdrówko (Polish)"); intprosts[12] = new String("Sanitas bona (Latin)"); intprosts[13] = new String("Kong gang ul wi ha yo (Korean)"); intprosts[14] = new String("Kampai (Japanese)"); intprosts[15] = new String("Salute (Italian)"); intprosts[16] = new String("Prost (German)"); intprosts[17] = new String("L'chaim (Hebrew)"); intprosts[18] = new String("Mazel tov (Yiddish)"); intprosts[19] = new String("Okole maluna (Hawaiian)"); intprosts[20] = new String("Stin ijiasas/jamas (Greek)"); intprosts[21] = new String("À votre santé (French)"); intprosts[22] = new String("Je via sano (Esperanto)"); intprosts[23] = new String("Fee sihetak (Egyptian)"); intprosts[24] = new String("Proost (Dutch)"); intprosts[25] = new String("Gan bei (Mandarin)"); intprosts[26] = new String("Quapp'lah (Klingon)"); intprosts[27] = new String("Schol (Flemish)"); intprosts[28] = new String("pozdravljau s dnem rojdenija (Russian)"); @WebMethod(operationName="be-polite-and-say-hello") public String sayhelloworld( @WebParam(name="yourname") String name ) return "Hallo Welt! Ich bin's... der/die/das " + name + "!!!"; @WebMethod(operationName="be-international-and-salute") public String sayinternationalprost() return intprosts[(int)(math.random() * 29)]; Seite 7 / 9

WsServer.java import javax.swing.joptionpane; import javax.xml.ws.endpoint; public class WsServer public static void main( String[] args ) Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services", new WSJavaSixProofOfConcept()); JOptionPane.showMessageDialog( null, "Kill Server!" ); endpoint.stop(); WsClient.java import foo.degiorgiws; import foo.wsjavasixproofofconceptservice; public class WsClient public static void main( String[] args ) DegiorgiWs port = new WSJavaSixProofOfConceptService().getDegiorgiWsPort(); System.out.printf("\n%s\n\n",port.bePoliteAndSayHello("_ein_Vorname_")); exemplarisch "services.xml" - die wsdl-datei aus der (automatisch) die Client- Stubs generiert werden <?xml version="1.0" encoding="utf-8"?><definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="foo" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetnamespace="foo" name="wsjavasixproofofconceptservice"> <types></types> <message name="be-polite-and-say-hello"> <part name="yourname" type="xsd:string"></part> </message> <message name="be-polite-and-say-helloresponse"> <part name="return" type="xsd:string"></part> </message> <message name="be-international-and-salute"></message> <message name="be-international-and-saluteresponse"> <part name="return" type="xsd:string"></part> </message> <porttype name="degiorgi_ws"> <operation name="be-polite-and-say-hello" parameterorder="yourname"> <input message="tns:be-polite-and-say-hello"></input> <output message="tns:be-polite-and-say-helloresponse"></output> </operation> Seite 8 / 9

<operation name="be-international-and-salute" parameterorder=""> <input message="tns:be-international-and-salute"></input> <output message="tns:be-international-and-saluteresponse"></output> </operation> </porttype> <binding name="degiorgi_wsportbinding" type="tns:degiorgi_ws"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"></soap:binding> <operation name="be-polite-and-say-hello"> <soap:operation soapaction=""></soap:operation> <input> <soap:body use="literal" namespace="foo"></soap:body> </input> <output> <soap:body use="literal" namespace="foo"></soap:body> </output> </operation> <operation name="be-international-and-salute"> <soap:operation soapaction=""></soap:operation> <input> <soap:body use="literal" namespace="foo"></soap:body> </input> <output> <soap:body use="literal" namespace="foo"></soap:body> </output> </operation> </binding> <service name="wsjavasixproofofconceptservice"> <port name="degiorgi_wsport" binding="tns:degiorgi_wsportbinding"> <soap:address location="http://localhost:8080/services"></soap:address> </port> </service> </definitions> Seite 9 / 9