ERLEDIGT
NEIN
NEIN
ANTWORTEN
20
20
ZUGRIFFE
11903
11903
EMPFEHLEN
-
23.03.07 01:43 #1
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
hier mal ein kleines Beispiel für die Erstellung und Verwendung eines Webservices
unter Java 6:
Unser ICalculator interface:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14
package de.tutorials; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Use; @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) //@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = Use.ENCODED) interface ICalculator { @WebMethod int computeSumOf(int a, int b); }
Unsere Calculator Implementierung:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13
package de.tutorials; import javax.jws.WebService; /** * @author Tom */ @WebService(serviceName = "Calculator", portName = "Calculator", endpointInterface = "de.tutorials.ICalculator") public class Calculator implements ICalculator { public int computeSumOf(int a, int b) { return a + b; } }
Unser Exporter / Client:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/** * */ package de.tutorials; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Endpoint; import javax.xml.ws.Service; /** * @author Tom */ public class SimpleWebServiceExample { public static void main(String[] args) throws Exception { Endpoint endpoint = null; try { endpoint = Endpoint.publish("http://localhost:44444/Calculator", new Calculator()); System.out.println("Service Published!"); Service service = Service.create(new URL("http://localhost:44444/Calculator?wsdl"), new QName( "http://tutorials.de/", "Calculator")); ICalculator simpleService = service.getPort(ICalculator.class); System.out.println(simpleService.computeSumOf(11, 12)); } finally { //endpoint.stop(); } } }
Ausgabe:
Code :1 2
Service Published! 23
Die Annotationim ICalculator ist notwendig, da sonst als Default SOPABinding DocumentStyle verwendet wirdCode java:1
@SOAPBinding(style = SOAPBinding.Style.RPC)
und die Laufzeit dann nach den entsprechenden Operations / Request / Response Wrapper Klassen sucht...
Deshalb bekommt man dann diese Exception:
Resultiert in:Code java:1 2 3 4
... @WebService //@SOAPBinding(style = SOAPBinding.Style.RPC) interface ICalculator {
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Exception in thread "main" Server Runtime Error: class: de.tutorials.jaxws.ComputeSumOf could not be found at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:269) at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:87) at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:59) at javax.xml.ws.Endpoint.publish(Endpoint.java:156) at de.tutorials.SimpleWebServiceExample.main(SimpleWebServiceExample.java:19) Caused by: class: de.tutorials.jaxws.ComputeSumOf could not be found at com.sun.xml.internal.ws.modeler.RuntimeModeler.getClass(RuntimeModeler.java:271) at com.sun.xml.internal.ws.modeler.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:562) at com.sun.xml.internal.ws.modeler.RuntimeModeler.processMethod(RuntimeModeler.java:509) at com.sun.xml.internal.ws.modeler.RuntimeModeler.processClass(RuntimeModeler.java:355) at com.sun.xml.internal.ws.modeler.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:251) at com.sun.xml.internal.ws.server.RuntimeEndpointInfo.createSEIModel(RuntimeEndpointInfo.java:170) at com.sun.xml.internal.ws.server.RuntimeEndpointInfo.init(RuntimeEndpointInfo.java:317) at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:298) at com.sun.xml.internal.ws.transport.http.server.HttpEndpoint.publish(HttpEndpoint.java:263) ... 4 more
Unser WSDL:
Code xml:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
<definitions targetNamespace="http://tutorials.de/" name="Calculator"> <types/> − <message name="computeSumOf"> <part name="arg0" type="xsd:int"/> <part name="arg1" type="xsd:int"/> </message> − <message name="computeSumOfResponse"> <part name="return" type="xsd:int"/> </message> − <portType name="ICalculator"> − <operation name="computeSumOf" parameterOrder="arg0 arg1"> <input message="tns:computeSumOf"/> <output message="tns:computeSumOfResponse"/> </operation> </portType> − <binding name="CalculatorBinding" type="tns:ICalculator"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> − <operation name="computeSumOf"> <soap:operation soapAction=""/> − <input> <soap:body use="literal" namespace="http://tutorials.de/"/> </input> − <output> <soap:body use="literal" namespace="http://tutorials.de/"/> </output> </operation> </binding> − <service name="Calculator"> − <port name="Calculator" binding="tns:CalculatorBinding"> <soap:address location="http://localhost:44444/Calculator"/> </port> </service> </definitions>
Das Beispiel ist sogar so einfach, dass man sogar von einem C# Client aus den WebService ohne Probleme benutzen kann
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
-
21.05.07 15:49 #3
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
Nein... echt?das soll ja auch der sinn eines webservices sein
abstraktion des codes => dieser wird in XML beschrieben/gebettet
dadurch soll er sprachunabhängig, plattformunabhängig und typsicher sein
Das ist schon klar... wenn man den Contract First Ansatz wählt (man designed die Webservice Definition / die ausgetauschten Nachrichten in XML über WSDL) ist das mit der Interoperabilität in der Regel auch kein Problem. Da ich hier jedoch das WSDL (under the hood) on the fly generieren lasse ist das mit der Interoperabilität nicht so einfach, aber in diesem Fall (da hier nur primitive und Strings ausgetauscht werden) ist das kein Problem. Wenn ich jedoch versuche ein Datum (java.util.Date) auszutauschen wirds schon etwas früher knallen
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hallo,
bin gerade dabei mich in Client-Seite der Web Services unter JAVA einzuarbeiten und werde aus der Generierung des dynamischen Stubs nicht ganz schlau.
Ist es auf der Serverseite zwingend notwendig, die WebMethod innerhalb eines Interfaces zu deklarieren und worin liegt der Sinn eines dynamisch generierten Stubs wenn mein Client für den Aufruf der WebMethod das zugehörige Interface kennen muss ?
-
23.05.07 12:47 #5
- Registriert seit
- Jul 2005
- Beiträge
- 21
ich beschäftige mich ebenfalls mit dem thema webservice,
Momentan habe ich probleme meine Ausgabe dem Client zukommen zulassen. Bevor ich überhaupt noch weiter mache, könnte sich jmd meinen Code mal angucken, da ich nicht der überprofi in Java bin.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
#Klasse AngebotsAufrufe() package AngebotService; import java.io.*; import java.net.URI; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.awt.Desktop; public class AngebotsAufrufe extends CopyAngebot { String usr, pwd, host; String speicherort = null; String verzeichnis = null; String bemerkung = "test"; String datum = "test"; String uhrzeit = "test"; String response = null; String angebotsnr = null; Connection con = null; Statement smt = null; Reader datei = null; Desktop desk = Desktop.getDesktop(); public Desktop CreateAngebot(String pdffile) { angebotsnr = pdffile; usr = "dewea083"; pwd = ""; host = "jdbc:mysql://localhost:3306/Angebotsspeicher"; //Datenbank auf Server if(pdffile == null) { System.out.println("ERROR ANGEBOT CANNOT BE NULL!"); return null; } else { try { src = "/home/dewea083/Documents/1178526328411.pdf"; //mkordner = new File("/usr/share/tomcat/webapps/pdf/"+angebotsnr).mkdir(); //erstelle einen Ordner der die AngebotsNummer hat CopyAngebot daten = new CopyAngebot(); dest = "/srv/www/htdocs/pdf/"+pdffile+".pdf"; //gibt den Speicherort und den Dateinamen für das Angebot an daten.copyFile(src, dest); //Datei wird in das Verzeichnis kopiert verzeichnis = dest; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(host, usr, pwd); //formatiert den Verzeichnisnamen so, dass er in der Datenbank gespeichert werden kann smt = con.createStatement(); String sql2 = "INSERT INTO Angebotverzeichnis(AngebotsNr,Verzeichnis,Bemerkung,Datum,Uhrzeit)" + "VALUE(" +angebotsnr+ ",\"" +verzeichnis+ "\",\"" +bemerkung+"\",\"" +datum+ "\",\"" +uhrzeit+"\");"; smt.executeUpdate(sql2); //Daten vom Angebot werden in der DB gespeichert System.out.println("Angebot "+pdffile+".pdf"+" wurde erstellt"); response = "Neues PDF erstellt, jetzt bitte anzeigen"; con.close(); smt.close(); desk.browse(new URI("http://10.100.0.27/pdf/"+pdffile)); return desk; } catch(Exception ex) { System.out.println(ex); return null; } } } public String GetAngebot(String pangebot) { usr = "dewea083"; pwd = ""; host = "jdbc:mysql://localhost:3306/Angebotsspeicher"; //Datenbank auf Server if(pangebot == null) { System.out.println("ERROR ANGEBOT CANNOT BE NULL!"); return null; } else { try { System.out.println("Gesucht wird: "+pangebot); Class.forName("com.mysql.jdbc.Driver"); //JDBC Treiber laden con = DriverManager.getConnection(host, usr, pwd); //Verbindung aufbauen smt =con.createStatement(); String sql = "SELECT AngebotsNr From Angebotsspeicher.Angebotverzeichnis " + "WHERE AngebotsNr ="+pangebot; ResultSet rst = smt.executeQuery(sql); //SQL Anweisung ausführen System.out.println("Angebot wird gesucht"); //Es wird nach der Angebotsnummer gesucht while (rst.next()) { speicherort = rst.getString(1); //Gib mir das Verzeichnis wo die Datei liegt } con.close(); smt.close(); } catch(Exception ex) { System.out.println(ex); return null; } if (speicherort == null) { AngebotsAufrufe ca1 = new AngebotsAufrufe(); ca1.CreateAngebot(pangebot); response = "Angebot nicht vorhanden. Erstelle es jetzt"; } else { System.out.println("Angebot "+pangebot +" bereits vorhanden"); response = "Angebots vorhanden, ich zeige es dir jetzt an"; } return response; } } public void pdfanzeigen(String pdf) { try {desk.browse(new URI("http://10.100.0.27/pdf/"+pdf)); } catch(Exception ex) {} } } #Klasse AngebotsService package AngebotService; import java.awt.Desktop; public class AngebotsService { public String findeAngebot(String fangebot) { AngebotsAufrufe aa1 = new AngebotsAufrufe(); return aa1.GetAngebot(fangebot); } public Desktop erstelleAngebot(String eangebot) { AngebotsAufrufe aa2 = new AngebotsAufrufe(); return aa2.CreateAngebot(eangebot); } }
Der Service soll später mal dem User eine PDF zurück geben, bzw. wenn diese noch nicht existiert soll er sie generieren und im Anschluss dem Benutzer schicken.
Ich hänge jedoch schon die gnaze zeit daran wie ich diese dem Benutzer senden kann
Wie man sieht habe ich es mit der awt.Destkop klasse versucht, jedoch t das nicht.
Ist also nur ein "TestCode"
-
wenn du einen webservice erstellst z.bsp. in C# sieht das ja so aus...
[Webservice...]
class Service : System.Web.Services.WebService {
[WebMethod]
public String HelloWorld() {...}
}
wo soll hier das interface sein? das ist eine ganz normale klasse, nachdem du deinen web service server nicht in JAVA hast, nehme ich an, du hast in .NET entwickelt, wenn du dir ein neues WebService projekt anlegst sieht das so in etwa aus (wie gesagt, seh ich des net als interface)
die informationen dieser klasse werden in ein xml format gepackt, und ein client kann sich diese holen
wenn du unter java auf den webservice zugreifst, wir ein objekt WebServiceXY erstellt, welches als art proxy dient
dieses proxy bietet dann die selben methoden, die auch der webservice bietet und somit kannst du dann die methoden des webservices nutzen
der proxy/stub ist die verbindung zwischen client und server, und wenn dieser die methoden des webservices nicht kennen würde, dann könntest du die nicht aufrufen
so ungefähr, aber des macht für mich schon sinn, dass er ein objekt anlegt, dass die methoden des webservices aufruft,
dadurch wirds einfacher und du musst dich nicht mehr um die verbindung kümmern
mfgGeändert von Proko (23.05.07 um 13:50 Uhr)
-
also, ansich ist der code okay glaube ich, aber ein PDF in awt.desktop packen?
bei den webservices wird ja der datentyp in der WSDL beschrieben, hast du dir da schon mal spezifikationen angeschaut?
so auf die schnelle habe ich mal gefunden:
Webservices : unterstützte datentypen:
boolean, byte, short, int, long, float, double, die Wrapper Klassen Boolean, Integer, Double....
Arrays, div. Listen, Bäume etc
String, Date, Calendar, bigDecimal, BigInteger
Holder klassen
bei eigenen komplexen Klassen werden nur properties (setter+getter) serialisiert
vlt. gibt es ja die möglichkeit ein PDF in ein file zu wrappen und das zu serialisieren und rumschicken
falls es geht wird das sehr unperformant sein, würde ich nicht mit einem webservice machen
mfgGeändert von Proko (23.05.07 um 14:03 Uhr)
-
Danke für die schnelle Antwort.
Mir ist schon klar, wie die Web Services im Prinzip funktionieren. Mein Problem liegt in den Zeilen
Service service = Service.create(new URL("http://localhost:44444/Calculator?wsdl"), new QName("http://tutorials.de/", "Calculator"));
ICalculator simpleService = service.getPort(ICalculator.class);
des obigen Beispiels. Die Generierung des Services mit Hilfe der WSDL URL sowie Servicename und Domain ist klar. Aber
ICalculator simpleService = service.getPort(ICalculator.class)
setzt doch die Kenntnis des Clients bezüglich des im Server beschriebenen Interfaces voraus, die WSDL-Beschreibung reicht da wohl nicht (die Methode aktzeptiert auch nur eine Interfacebeschreibung soweit ich weiss).
Wenn ich nun einen Webservice unter .NET implementiert habe, muss ich meinem Java Client ebenfalls dieses Interace bekannt machen ? (Oder ist der obige Code irgendwo nicht vollständig?)
mfg
-
24.05.07 10:11 #9
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
das Interface auf Clientseite zu haben ist sehr sinnvoll, da du so getyped mit dem WebService interagieren kannst. Außerdem kannst du dann auch die Remoting-Implementierung Transparent halten (vielleicht willst du irgendwann mal, dass du RMI statt Webservices verwendest..., wenn du dann die entsprechenden Service Interfaces verwendet hast brauchst du hier keinen Code zu verändern) Wenn du den oben definierten Webservice über .Net ansprichst wird dir auch ein entsprechendes Client interface generiert... hier liefere ich dieses der Einfachheit halber jedoch mit, um den Schritt auf Java Client Seite ein zusätzliches Interface generieren zu müssen einzusparen.)
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
Hallo, vielen Dank.
Dann muss ich nur noch herausfinden, wo das entsprechende Interface generiert wird. Ich habe die entsprechenden Web Services bereits mit statisch generierten Stubs zum laufen gebracht - war kein Problem, hier bekomme ich ja das Interface - aber bei den dynamisch generierten sehe ich das einfach nicht (finde auch keine adequaten Beispiele im Netz).
mfg
-
24.05.07 11:23 #11
- Registriert seit
- Jun 2002
- Ort
- Saarbrücken (Saarland)
- Beiträge
- 9.886
- Blog-Einträge
- 29
Hallo,
so kannst du dir aus einem WSDL Dokument einen Client generieren lassen (Beispiel unter Java 6):
Code :1 2 3 4
D:\tmp\ws>mkdir generated D:\tmp\ws>mkdir source D:\tmp\ws>wsimport -d generated -s source http://localhost:44444/Calculator?wsdl
Ergebnis in generated:
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
package de.tutorials; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; /** * This class was generated by the JAXWS SI. * JAX-WS RI 2.0_02-b08-fcs * Generated source version: 2.0 * */ @WebService(name = "ICalculator", targetNamespace = "http://tutorials.de/") @SOAPBinding(style = SOAPBinding.Style.RPC) public interface ICalculator { /** * * @param arg1 * @param arg0 * @return * returns int */ @WebMethod @WebResult(partName = "return") public int computeSumOf( @WebParam(name = "arg0", partName = "arg0") int arg0, @WebParam(name = "arg1", partName = "arg1") int arg1); }
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
package de.tutorials; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import javax.xml.ws.WebEndpoint; import javax.xml.ws.WebServiceClient; /** * This class was generated by the JAXWS SI. * JAX-WS RI 2.0_02-b08-fcs * Generated source version: 2.0 * */ @WebServiceClient(name = "Calculator", targetNamespace = "http://tutorials.de/", wsdlLocation = "http://localhost:44444/Calculator?wsdl") public class Calculator extends Service { private final static URL CALCULATOR_WSDL_LOCATION; static { URL url = null; try { url = new URL("http://localhost:44444/Calculator?wsdl"); } catch (MalformedURLException e) { e.printStackTrace(); } CALCULATOR_WSDL_LOCATION = url; } public Calculator(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } public Calculator() { super(CALCULATOR_WSDL_LOCATION, new QName("http://tutorials.de/", "Calculator")); } /** * * @return * returns ICalculator */ @WebEndpoint(name = "Calculator") public ICalculator getCalculator() { return (ICalculator)super.getPort(new QName("http://tutorials.de/", "Calculator"), ICalculator.class); } }
Gruß TomJava rocks!
How to become a good Java Programmer?
Does IT in Java and .Net
The only valid measurement of code quality: WTFs / minute
Blog
Xing
Twitter
-
24.05.07 11:41 #12
- Registriert seit
- Jul 2005
- Beiträge
- 21
Naja so umständlich muss es ja gar nicht werden. Meine Überlegung geht in die richtung:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
public void pdfOeffnen() { BufferedOutputStream out = null; BufferedInputStream in = null; try { URL myurl = new URL("http://10.100.0.27/pdf/1.pdf"); URLConnection conn = myurl.openConnection(); System.out.println(conn.getContentType()); in = new BufferedInputStream(conn.getInputStream()); out = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; // Simple read/write loop. while(-1 != (bytesRead = in.read(buff, 0, buff.length))) { out.write(buff, 0, bytesRead); } } catch(final MalformedURLException e) { System.out.println ( "MalformedURLException." ); } catch(final IOException e) { System.out.println ( "IOException." ); } finally { out.close(); in.close(); } }
So sollte es mir doch auch möglich sein, dem client das PDF anzeigen zu lassen oder?
-
Hallo,
ist es nicht möglich, dass du die Daten für das PDF in XML zum Client schickst und dort das PDF generierst? Dann hättest du nicht so viel Traffic.
MFG
zEriXEs ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)
-
24.05.07 11:53 #14
- Registriert seit
- Jul 2005
- Beiträge
- 21
nein, denn der User soll das pdf im Browser angezeigt werden. Auf der Client Seite soll lediglich die AngebotsNummer eingegeben werden. Die Verarbeitung soll komplett auf dem Server stattfinden
-
was wäre wenn du eine HTML seite erzeugst (die kann ja ein reines textdokument sein mit tags und text) mit dem inhalt den du herzeigen willst
und diesen StringBuffer dann dem client schicken, dieser braucht dann nur mehr den browser öffnen
des mit dem pdf hinundherschicken wird echt schwierig denke ich
mfg
Ähnliche Themen
-
Webservices JAX-WS unter Mac OS
Von xxsaikoxx im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 20.03.08, 12:41 -
[Mustang] Heap Analyse unter Java 6
Von Thomas Darimont im Forum Java Technology NewsAntworten: 0Letzter Beitrag: 15.04.06, 16:30 -
[Mustang] Liste der API Aenderungen in Java 6
Von Thomas Darimont im Forum Java Technology NewsAntworten: 0Letzter Beitrag: 24.03.06, 16:12 -
Java 6 Mustang & ein Blick hinter die Kulissen
Von Thomas Darimont im Forum Java Technology NewsAntworten: 0Letzter Beitrag: 24.01.06, 23:59 -
SplashScreen API in Java 6 (Mustang)
Von Thomas Darimont im Forum JavaAntworten: 1Letzter Beitrag: 05.10.05, 13:27






Zitieren

Login





