1. Lezione 9: Web Service in
Java
Corso di Programmazione in Rete
Laurea Magistrale in Ing. Informatica
Università degli Studi di Salerno
1
2. Outline
✦ I tool necessari
✦ Realizzazione del server
✦ Realizzazione del client
2
3. I tool necessari
✦ Per realizzare WS in Java occorre:
• librerie per i protocolli usati (es. SOAP)
• tool per la generazione di codice Java a partire da
WSDL
✦ Esistono diversi ambienti per la
realizzazione di WS in Java
• Apache Axis/Axis2
• JBoss WS (RedHat)
• Glassfish Metro (Sun)
3
4. I tool necessari
✦ I diversi ambienti non sono
(completamente) compatibili tra loro a
livello di codice sorgente
✦ I server e i client sono però interoperabili
(anche con client/server scritti in altri
linguaggi)
4
5. Glassfish Metro
✦ Componente dell’application server
Glassfish di Sun
✦ Utilizzabile anche con altri application
server (es. Tomcat)
✦ Implementa l’API Java API for XML Web
Services (JAX-WS), proposta da Sun
come standard per i WS in Java
5
6. Glassfish Metro
✦ Download:
• https://metro.dev.java.net/
✦ Installazione:
• dopo aver scaricato il file .jar, l’ambiente viene
scompattato con il comando:
‣ java -jar metro-1_5.jar
• per l’installazione su Tomcat è necessario il tool
Ant; dopo aver scompattato l’ambiente occorre
usare il comando:
‣ ant -Dtomcat.home=<TOMCAT_DIR> -f metro-on-
tomcat.xml install
6
7. Realizzazione del server
✦ Approccio Java-first
• si parte dalla realizzazione di una classe Java che
implementa il web service
✦ Approccio WSDL-first
• si parte dalla creazione di un file WSDL che
descrive il web service
7
8. Realizzazione del server
✦ Java-first
• più semplice
• richiede che chi definisce la specifica del servizio
conosca Java
✦ WSDL-first
• consente la definizione del servizio a un
progettista che non sia anche uno sviluppatore
• il WSDL può essere ottenuto da una descrizione di
livello più alto (es. UML)
• richiede tool per la creazione del WSDL
✦ seguiremo l’approccio Java-first
8
9. Definizione del servizio
✦ Usando l’API JAX-WS, la definizione del
servizio è semplicemente una classe con
alcune annotazioni
• le annotazioni sono un’estensione del linguaggio
Java introdotta nella vers. 1.5
• le annotazioni JAX-WS forniscono dei metadati
sulla classe e sui suoi metodi per precisare il
comportamento del web service
• l’unica annotazione obbligatoria è @WebService,
che indica che una classe implementa un WS
9
10. Definizione del servizio
✦ Esempio: la calcolatrice
package esempio.server;
import javax.jws.*;
@WebService
public class Calculator {
public double add(double a, double b) {
return a+b;
}
public double subtract(double a, double b) {
return a-b;
}
public double multiply(double a, double b) {
return a*b;
}
public double divide(double a, double b) {
return a/b;
}
}
10
11. Definizione del servizio
✦ Note
• le annotazioni JAX-WS sono nel package javax.jws
• è opportuno che la classe sia inserita in un
package; il nome del package viene usato per
definire il namespace del servizio
‣ il namespace è un URL usato da SOAP per evitare conflitti
di naming tra servizi realizzati da organizzazioni diverse
‣ il package viene trasformato in un namespace invertendo i
componenti del suo nome:
- esempio.server => http://server.esempio
‣ perciò in un contesto reale il package dovrebbe essere
univoco, ad esempio contenendo il nome DNS dell’azienda
- ad esempio: it.unisa.esempio.server
11
12. Deployment
✦ Una volta creata e compilata la classe,
occorre realizzare una web application da
installare sotto Tomcat per offrire il
servizio
✦ La struttura è quella classica, con
l’aggiunta di un file di configurazione
• WEB-INF/
‣ web.xml
‣ sun-jaxws.xml
‣ classes/ (qui vanno i file compilati)
‣ ...
12
13. Deployment
✦ Nel file web.xml occorre configurare una
servlet che gestisca i WS:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<description>Calculator</description>
<display-name>Calculator Web Service</display-name>
<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>Calculator</servlet-name>
<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Calculator</servlet-name>
<url-pattern>/calculator</url-pattern>
</servlet-mapping>
13 </web-app>
14. Deployment
✦ Nel file sun-jaxws.xml occorre specificare
le classi che implementano i WS:
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
version='2.0'>
<endpoint
name="Calculator"
implementation="esempio.server.Calculator"
url-pattern="/calculator"/>
</endpoints>
✦ Nota: l’url-pattern è relativo alla url
dell’applicazione web
14
15. Deployment
✦ La cartella di deployment va come al
solito inserita nella cartella webapps di
tomcat
✦ Per verificare se il deployment ha avuto
successo, possiamo accedere al WSDL
generato automaticamente
aggiungendo ?wsdl all’URL del web
service:
• Ad esempio, se la web application è stata
denominata metrocalc, l’url del WSDL è:
‣ http://localhost:8080/metrocalc/calculator?wsdl
15
16. Realizzazione del client
✦ Il punto di partenza è il WSDL
✦ Occorre generare uno stub per
interfacciare il client al WSDL
✦ L’ambiente Metro mette a disposizione il
comando wsimport per generare lo stub:
• wsimport -keep -p package url-wsdl
‣ l’opzione -keep indica di conservare i sorgenti
‣ l’opzione -p consente di specificare il package in cui
inserire le classi generate
16
17. Realizzazione del client
✦ Esempio:
• wsimport -keep -p esempio.stub ”http://localhost:
8080/metrocalc/calculator?wsdl”
• crea una serie di file nel package esempio.stub,
che possono essere importati sotto Eclipse
17
18. Realizzazione del client
✦ Tra le classi create da wsimport, ce ne
sono due di interesse dello sviluppatore:
• una classe che rappresenta il web service nel suo
insieme
• una classe che rappresenta un “end point”, ovvero
un singolo punto di accesso al web service (un
web service può avere più endpoints)
• il nome di queste classi dipende dal WSDL, quindi
occorre esaminare i file prodotti da wsimport per
capire come sono state denominate
‣ nel nostro caso, CalculatorService e Calculator
18
19. Realizzazione del client
✦ Usando le classi del service e
dell’endpoint si può usare il web service
come un normale oggetto:
package esempio.client;
import esempio.stub.*;
public class Client {
public static void main(String args[]) {
Calculator calc=new
CalculatorService().getPort(Calculator.class);
System.out.println("9 per 9 fa "+calc.multiply(9,9));
}
}
19