Corso di Ingegneria del Web A A. 2016 2017 Domenico Rosaci Realizzare WS con ECLIPSE e AXIS 2 su TOMCAT Esercitazione N°1 Sommario • Vedremo come realizzare Web Services usando l’IDE Eclipse per J2EE, integrando al suo interno l’ambiente di sviluppo per WS AXIS2 e l’ambiente di runtime TOMCAT come Web Application Server. D. Rosaci Ingegneria del Web 2 TOMCAT • Apache Tomcat è un’implementazione open source delle tecnologie Java Servlet, JavaServer Pages, Java Expression Language e Java WebSocket technologies. • Fornisce un ambiente di runtime per Web server e Web applications D. Rosaci WS 3 Versione 8.5 • Per questa esercitazione scaricheremo dal sito tomcat.apache.org la binary distribution 8.5.6, sotto forma di installer per windows. • Abbiamo scelto questa versione perché non presenta particolari incompatibilità con l’IDE Eclipse D. Rosaci WS 4 TOMCAT Installer D. Rosaci WS 5 AXIS2 • Apache Axis2 è un Web Services / SOAP / WSDL engine, successore dell’ambiente AXIS. Esistono due implementazioni di Apache Axis2 Web services engine: Apache Axis2/Java and Apache Axis2/C • Noi utilizzeremo Axis2/Java, nella versione 1.6.4 di inizio 2016, sempre perché non presnta incompatibilità con ECLIPSE D. Rosaci WS 6 AXIS2 1.6.4 D. Rosaci WS 7 Scaricare la war distribution D. Rosaci WS 8 Installare AXIS su TOMCAT • Il file axis2.war contenuto nello zip va semplicemente estratto all’interno della cartella webapps di TOMCAT D. Rosaci WS 9 Scaricare ECLIPSE NEON D. Rosaci WS 10 Integrare i Runtime Environments nell’IDE D. Rosaci WS 11 Aggiungere TOMCAT 8.5 D. Rosaci WS 12 Specificare la cartella di installazione di TOMCAT D. Rosaci WS 13 Aggiungere AXIS2, specificando la cartella che contiene il file axis2.war D. Rosaci WS 14 Creare un nuovo Dynamic Web Project D. Rosaci WS 15 Dare un nome al progetto, scegliere la versione 2.5 per Dynamic Web Module e modificare la Configuration D. Rosaci WS 16 Scegliere AXIS2 nei Project Facets D. Rosaci WS 17 Aggiungere una classe al progetto WebService1 Selezionare File->New->Other D. Rosaci WS 18 Dare un nome alla classe (stesso nome del Progetto) D. Rosaci WS 19 Scrivere il codice della classe D. Rosaci WS 20 Creare il WS dalla classe D. Rosaci WS 21 Configurare il WS Attenzione: cambiare Apache Axis in Axis2 D. Rosaci WS 22 Service Deployment Configuration D. Rosaci WS 23 Web Service Java Bean Configuration D. Rosaci WS 24 Avviare il Server D. Rosaci WS 25 Problema frequente • Se per caso avevate già avviato Tomcat prima di lanciare Eclipse, si genererà un errore dovuto al fatto che le porte del server (generalmente la 8080, la 8005 e la 8009 rispettivament per l’ascolto HTTP, per lo startup e per lo shutdown) sono già occupate. • Occorrerà che chiudiate il programma di «monitor» di Tomcat (facendo exit, non basta lo stop del server) e dovrete cambiare le porte del server in ECLIPSE • Dovrete editare in Eclipse il file server.xml e cambiare i numeri delle porte (es. 8080 in 8081) D. Rosaci SOAP 26 Cambiare le porte in ECLIPSE D. Rosaci WS 27 WebService1 avviato D. Rosaci WS 28 Se tutto è andato a buon fine... Cliccare qui per visualizzare il WSDL del servizio D. Rosaci WS 29 WSDL generato – Tipi di dato <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns="http://domenicorosaci.it" xmlns:ws aw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"xmlns: http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap12=" http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns1="http://org.apache.axis2/xsd"xmlns:soap="http://schemas .xmlsoap.org/wsdl/soap/" targetNamespace="http://domenicorosaci.it"> <wsdl:documentation>Please Type your service description here</wsdl:documentation> <wsdl:types> <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://domeni corosaci.it"> <xs:element name="somma"> <xs:complexType> <xs:sequence> <xs:element name="a" type="xs:int"/> <xs:element name="b" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="sommaResponse"> <xs:complexType> <xs:sequence> <xs:element name="return" type="xs:int"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> </wsdl:types> D. Rosaci WS 30 WSDL generato – Primo binding <wsdl:binding name="WebService1Soap11Binding" type="ns:WebService1PortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="somma"> <soap:operation soapAction="urn:somma" style="document"/> <wsdl:input> <soap:body use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> D. Rosaci WS 31 WSDL generato – Secondo binding <wsdl:binding name="WebService1Soap12Binding" type="ns:WebService1PortType"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <wsdl:operation name="somma"> <soap12:operation soapAction="urn:somma" style="document"/> <wsdl:input> <soap12:body use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> D. Rosaci WS 32 WSDL generato – Terzo binding <wsdl:binding name="WebService1HttpBinding" type="ns:WebService1PortType"> <http:binding verb="POST"/> <wsdl:operation name="somma"> <http:operation location="somma"/> <wsdl:input> <mime:content type="application/xml" part="parameters"/> </wsdl:input> <wsdl:output> <mime:content type="application/xml" part="parameters"/> </wsdl:output> </wsdl:operation> </wsdl:binding> D. Rosaci WS 33 WSDL generato – Service <wsdl:service name="WebService1"> <wsdl:port name="WebService1HttpSoap11Endpoint" binding="ns:WebService1Soap11Binding"> <soap:address location="http://localhost:8081/WebService1/services/WebService1.WebService1HttpSoap11En dpoint/"/> </wsdl:port> <wsdl:port name="WebService1HttpSoap12Endpoint" binding="ns:WebService1Soap12Binding"> <soap12:address location="http://localhost:8081/WebService1/services/WebService1.WebService1HttpSoap12 Endpoint/"/> </wsdl:port> <wsdl:port name="WebService1HttpEndpoint" binding="ns:WebService1HttpBinding"> <http:address location="http://localhost:8081/WebService1/services/WebService1.WebService1HttpEndpoint/"/ > </wsdl:port> </wsdl:service> </wsdl:definitions> D. Rosaci WS 34 WSDL generato - 2 <wsdl:message name="sommaRequest"> <wsdl:part name="parameters" element="ns:somma"/> </wsdl:message> <wsdl:message name="sommaResponse"> <wsdl:part name="parameters" element="ns:sommaResponse"/> </wsdl:message> <wsdl:portType name="WebService1PortType"> <wsdl:operation name="somma"> <wsdl:input message="ns:sommaRequest" wsaw:Action="urn:somma"/> <wsdl:output message="ns:sommaResponse" wsaw:Action="urn:sommaResponse"/> </wsdl:operation> </wsdl:portType> D. Rosaci WS 35 Creare un archivio Axis • Per evitare di dovere usare Eclipse ogni volta che vogliamo lanciare il servizio, possiamo creare un archivio axis (file .aar) e renderlo disponibile sul Web server. • A questo scopo, andiamo nella cartella WebService1 in c:\users\username (dove username è il vostro account su Windows), da riga di comando D. Rosaci WS 36 Generare il file .aar D. Rosaci WS 37 Bloccare il Web Server su ECLIPSE D. Rosaci WS 38 Copiare il file WebService1.aar nella cartella services di Axis2 D. Rosaci WS 39 Vedere il servizio sotto Axis2 • Avviamo Tomcat dal programma monitor. Dovremmo vedere il servizio WebService1 tra i servizi di Axis2 (attenzione: la porta sarà la 8080) D. Rosaci WS 40 Generare un client per WebService1 Scegliere File->New->Other D. Rosaci WS 41 Configurazione del Client URI del WSDL D. Rosaci WS 42 Generazione dello Stub e del Callback Handler • • • • Due nuove classi generate: WebService1Stub.java WebService1CallbackHandler.java. Ora generiamo una classe per testare il client D. Rosaci WS 43 Una classe per testare il client Eseguire come normale Java Application. Ecco il risultato D. Rosaci WS 44