MokaByte 78 - 8bre 2003 
Web Services e J2EE
II parte
di
Massimiliano
Bigatti
Completiamo la creazione del pacchetto e la relativa installazione del servizio Web, che proveremo attraverso due diversi client. Il primo, un normale client JAX-RPC, di quelli già sviluppati nelle puntate precedenti; il secondo un vero e proprio client J2EE basato su JNDI.

Come si ricorderà dalla puntata precedente [1], il processo di creazione di un servizio Web in J2EE passa attraverso sei diverse fasi:

  • definizione;
  • implementazione;
  • produzione del pacchetto di installazione;
  • installazione del pacchetto in un server J2EE;
  • pubblicazione del servizio in un registro (opzionale);
  • risposta alle richieste dei client.

Nella scorsa puntata abbiamo affrontato le prime due fasi; in questa affronteremo la produzione del pacchetto e la sua installazione, tramite un tutorial guidato ed illustrato che riprende l'esempio di servizio (HelloService) presente negli esempi del tutorial di SUN per J2EE 1.4 [3], ed in particolare nel capitolo 17.

 

Preparazione degli strumenti
La fase di installazione (deploy) dell'applicazione e della pubblicazione sui registri di servizi Web sono tipicamente operazioni svolte con gli strumenti di supporto; in particolare si prevede che la pubblicazione non debba richiedere al programmatore l'utilizzo di JAXR per pubblicare il servizio, ma che sia una commodity fornita dall'application server utilizzato.
Per creare un pacchetto di installazione è necessario utilizzare lo strumento di deploy di SUN, il Deploytool; per operare, è necessario prima avviare il server J2EE tramite la funzione "Start Application Server". Attenzione però - per un fastidioso problema con la beta 2 dell'SDK (si parla della versione Windows NT), utilizzare gli strumenti forniti con impostazione internazionale diversa dall'inglese americano provoca diversi problemi relativi ad XML, sia a livello di Deploytool che di Application Server. Per ovviare all'inconveniente, è possibile provare due workaround, il primo meno invasivo, il secondo di più. Come primo tentativo è possibile impostare la Virtual Machine degli strumenti per operare con l'impostazione statunitense, senza modificare le impostazioni di Windows. A tal fine è necessario applicare le seguente modifiche, ad esempio (tratto da deploytool.bat):

set _USER_LANG=en
set _USER_REGION=US
%_JAVACMD% -Duser.language=%_USER_LANG% -Duser.region=%_USER_REGION% -Dcom.sun.aas.installRoot="%AS_INSTALL%" -Djava.endorsed.dirs=%AS_INSTALL%\share\lib\endorsed -Dcom.sun.aas.defaultUserName="%AS_ADMIN_USER%" -Dcom.sun.aas.defaultPassword="%AS_ADMIN_PASSWORD%" -cp %_CPATH% %_MAIN% %1 %2

Se questa modifica non dovesse funzionare, è possibile modificare le impostazioni internazionali di Windows e tutto dovrebbe operare correttamente.

 

Creazione del pacchetto
Avviato dunque Deploytool, è necessario dapprima creare l'applicazione enterprise che ospiterà il servizio.

  • Selezionare dunque File | New | Application EAR;
  • selezionare "browse" e posizionarsi in una directory libera;
  • nel campo File Name, digitare HelloService.ear.

Se avete scaricato il codice sorgente del tutorial J2EE, è possibile posizionare l'EAR nella sottodirectory /j2eetutorial14/examples/ejb/helloservice/ (Figura 1).



Figura 1
- Organizzazione delle directory del codice del tutorial J2EE 1.4

  • Selezionare dunque "New Application" e selezionare OK.

A questo punto è possibile creare l'enterprise bean utilizzando il wizard relativo di Deploytool. Selezionare File | New | Enterprise; viene presentato un wizard composto da una serie di pagine. La prima è semplicemente descrittiva delle funzionalità dello strumento. Selezionare Next.

 

Pagina EJB EAR
In questa pagina è necessario specificare il codice necessario ad implementare il componente. Procedere come segue:

  • selezionare il pulsante Create New JAR Module;
  • nel combo box sottostante selezionare HelloService;
  • nel campo JAR Display Name digitare HelloServiceJAR;
  • selezionare edit. Dalla dialog box che appare, è necessario individuare il percorso che

contiene i file compilati, che nel codice del tutorial sono sotto il percorso /j2eetutorial14/examples/ejb/helloservice/build/. Da qui è necessario importare i file mapping.xml, MyHelloService.wsdl e le classi presenti nella sottodirectory helloservice, come mostrato in figura 2.



Figura 2 - Selezionare gli opportuni file da
importare nel componente

 

Per confermare, selezionare Add e poi OK. Il risultato che si dovrebbe ottenere è mostrato in figura 3. Selezionare Next.


Figura 3 - La pagina EJB JAR completata con le informazioni necessarie

 

Pagina General
La pagina successiva consente di impostare i componenti EJB che si sta creando, specificandone le classi di interfaccia e di implementazione, oltre che il nome ed il tipo. Procedere come segue:

  • selezionare Session nel riquadro Bean Type;
  • selezionare il pulsante Stateless;
  • selezionare helloservice.HelloServiceBean nel combo box Enterprise Bean Class;
  • digitare HelloServiceEJB nel campo Enteprise Bean Class;

Il risultato è presente in figura 4. Selezionare Next.



Figura 4
- Impostazione delle opzioni del Bean

Pagina Configuration Options
In questa pagina non c'è molto da fare: il sistema per default sceglie di esporre il componente come servizio Web, selezionado Yes nella radio button Expose Bean as Web Service Endpoint. Selezionare Next

 

Pagina Choose Service
In questa pagina viene indicato a quale endpoint deve essere collegato il servizio; è possibile sia collegarsi ad un servizio esistente, oppure crearne uno nuovo. Si scelga questa seconda opzione e si compilino i campi come segue:

  • selezionare il file META-INF/wsdl/MyHelloService.wsdl nel combo box relativo al file WSDL;
  • selezionare il file mapping.xml dal combo box Mapping File;
  • assicurarsi che nei campi Service Name e Service Display Name sia presente il valori "MyHelloService".

La pagina dovrebbe apparire come in figura 5. Selezionare Next.


Figura 5
- La definizione del servizio Web

 

Pagina Endpoint
In questa pagina viene collegato l'endpoint al servizio che si sta definendo, tramite l'indicazione dei namespace e dell'URI relativo. Questa pagina va configurata come segue:

  • selezionare helloservice.HelloIF nella combo box Service Endpoint Interface;
  • compilare la sezione WSDL Port, digitando "urn:Foo" nel campo namespace e "HelloIFPort" nel campo Local Part;
  • impostare l'address URI nella sezione Deployment Settings a hello-ejb/hello.

La pagina dunque si configura come in figura 6. Successivamente selezionare Next.


Figura 6
- Configurazione dell'endpoint del servizio

 

Conclusione
L'ultima pagina del wizard presenta il descrittore del servizio, per una ispezione visiva del risultato prodotto (figura 7). Selezionare Finish.


Figura 7
- Il descrittore prodotto

 

 

Installazione dell'applicazione
A questo punto l'applicazione è completa: al suo interno è presente il descrittore dell'applicazione ed il codice ed i descrittori del bean e del servizio Web (figura 8); a questo punto è possibile eseguire il deploy. Selezionare l'applicazione e scegliere Tools | Deploy - lo strumento richiederà l'autenticazione dell'utente tramite utente e password che dovranno coincidere con quelli inseriti in fase di installazione dell'SDK (figura 9).


Figura 8
- L'applicazione è ora completa ed è possibile visualizzarne
i parametri all'interno di Deploytool


Figura 9 - Per accedere al server applicativa è necessaria l'autenticazione

L'installazione viene controllata tramite la finestra di console di Deploytool che riporta i messaggi prodotti dallo strumento nelle fasi di installazione (deploy) e partenza (Figura 10).


Figura 10
- La console di Deploytool

 

 

Test del client
Sempre all'interno del tutorial di SUN è presente un semplice programma JAX-RPC client, basato su stub statici, per provare il servizio realizzato. Questo è un classico programma client JAX-RPC simile a quelli realizzati nelle precedenti puntate (si veda [2]) che riporto qui per comodità (listato 1).

Listato 1 - HelloClient.java
package staticstub;

import javax.xml.rpc.Stub;

public class HelloClient {

  private String endpointAddress;

  public static void main(String[] args) {

  System.out.println("Endpoint address = " + args[0]);
  try {
    Stub stub = createProxy();
    stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY,
                      args[0]);
    HelloIF hello = (HelloIF)stub;
    System.out.println(hello.sayHello("Duke!"));
  }
  
catch (Exception ex) {
    ex.printStackTrace();
  }
}

  private static Stub createProxy() {
    // Note: MyHelloService_Impl is implementation-specific.
    return (Stub)(new MyHelloService_Impl().getHelloIFPort());
  }
}

Si noti che gli stub vengono generati con il comando wscompile, con un comando simile al seguente:
wscompile.bat -gen:client -d build -classpath build config-wsdl.xml

Il file confi-wsdl.xml è così composto:
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl location="build/MyHelloService.wsdl"
packageName="helloservice"/>
</configuration>

Il risultato è mostrato in figura 11. Per provare il client con gli esempi presenti nel tutorial di SUN è necessario eseguire i seguenti comandi:
· asant build dalla directory j2eetutorial14/examples/jaxrpc/helloservice;
· asant build dalla directory j2eetutorial14/examples/jaxrpc/staticstub;

per eseguire il client utilizzare il comando asant run dalla directory j2eetutorial14/examples/jaxrpc/staticstub.

 

Client J2EE
Il supporto ai servizi Web della tecnologia J2EE non è però solo limitata al server: sebbene la piattaforma enterprise di Java offra una ottima e completa infrastruttura per realizzare componenti server, le specifiche 1.4 includono anche il supportod lato client, non solo tramite le API JAXR per l'accesso ai registry di Web Services, ma anche per fruire dei servizi all'interno di client J2EE.
L'accesso ad un componente EJB esportato come servizio non si discosta dallo standard previsto per la piattaforma per l'accesso ai normali Bean Enterprise, e si basa su un lookup JNDI. Per convenzione, tutti i servizi Web sono raccolti sotto il prefisso java:comp/env/service/.
Nel listato 2 è presente un client di prova.

Listato 2 - HelloClient.java
package appclient;

import javax.xml.rpc.Stub;
import javax.naming.*;

public class HelloClient {

  private String endpointAddress;

  public static void main(String[] args) {

    System.out.println("Endpoint address = " + args[0]);

    try {
      Context ic = new InitialContext();
      MyHelloService myHelloService = (MyHelloService)
      ic.lookup("java:comp/env/service/MyJAXRPCHello");
      appclient.HelloIF helloPort=myHelloService.getHelloIFPort();
      ((Stub)helloPort)._setProperty(
                         Stub.ENDPOINT_ADDRESS_PROPERTY,args[0]);

    System.out.println(helloPort.sayHello("Jake!"));
    System.exit(0);

    } catch (Exception ex) {
      ex.printStackTrace();
      System.exit(1);
    }
  } // main
}

Il programma può essere eseguito solo all'interno di un contesto J2EE, dunque è necessario eseguirne il deploy tramite Deplotool. Per prima cosa è necessario però compilare il codice, eventualmente sfruttando gli script forniti con gli esempi del tutorial e presenti sotto j2eetutorial14/examples/jaxrpc/appclient. Eseguire dunque il comando asant build.
Una volta eseguita la compilazione, si passi a Deploytool e si selezioni File | New | Application EAR. Tramite il pulsante Browse, posizionarsi sul percorso j2eetutorial14/examples/jaxrpc/appclient e digitare HelloServiceApp nel campo File Name. Fare clic su New Application e poi su OK (figura 12).


Figura 12
- La nuova applicazione nel relativo elenco

A questo punto è possibile creare il nuovo JAR Client, tramite il wizard relativo, richiamabile tramite la voce File | New | Application Client JAR. Il wizard presenta come di consueto una prima pagina di presentazione. Selezionando Next viene presentata la JAR File Contents.

 

Pagina JAR File Contents
In questa pagina si costruirà il vero e proprio componente client, specificando le classi compilate che lo compongono. Procedere come segue:

  • nel riquadro AppClient Location selezionare Create New AppClient Module in Application;
  • nella combo-box sottostante selezionare HelloServiceApp;
  • nel riquadro AppClient Display Name digitare HelloClient;
  • selezionare il pulsante Edit ed aggiungere la directory build nel percorso /examples/jaxrpc/appclient, selezionando la suddetta directory e premendo il pulsante Add (Figura 12);
  • selezionare OK. La pagina assume la forma presente in figura 13.


Figura 12
- Aggiunta delle classi al modulo JAR


Figura 13
- I contenuti del JAR client

 

Pagina General
La pagina conclusiva del wizard consente di specificare la classe principale dell'applicazione. Selezionare dunque appclient.HelloClient nel combo box Main Class (figura 14) e premere Finish.


Figura 14
- Configurazione della classe principale.

A questo punto la nuova applicazione è creata ed elencata nella cartella Applications (figura 15).


Figura 15
- La nuova applicazione
HelloServiceApp

L'ultimo passaggio necessario al funzionamento del client è la configurazione del riferimento web JNDI, che avviene tramite la tab Web Service Refs nel componente HelloClient. Dalla finestra, selezionare Add e specificare:

  • service/MyJAXRPCHello nel campo Coded Name;
  • selezionare appclient.MyHelloService nel combo box Service Interface;
  • selezionare il file MyHelloService.wsdl nel combo box del file WSDL;
  • digitare urn:Foo nel campo namespace;
  • digitare MyHelloService nel campo Local Part;
  • selezionare mapping.xml nel combo box Mapping File;
  • selezionare OK (figura 16).



Figura 16
- Configurazione del Web Service Reference

A questo punto è possibile eseguire il deploy di quanto generato, per ottenere in risposta il JAR del client relativo. Per fare questo:

  • selezionare l'applicazione HelloServiceApp;
  • selezionare Tools | Deploy;
  • nella finestra che appare selezionare il checkbox Return Client JAR;
  • digitare utente e password;
  • selezionare OK (figura 17)


Figura 17
- Finestra di installazione

Se tutto è stato fatto correttamente, il sistema presenta un file di log libero da errori (figura 18).


Figura 18 - Installazione completata

 

Prova del client J2EE
Dopo tutti questi passaggi, dovremmo essere in grado di provare il client J2EE tramite il servizio di prova EJB installato in precedenza. Il servizio è già stato provato con un client JAX-RPC, dunque l'attenzione verrà concentrata sul client J2EE. Posizionarsi nella directory /j2eetutorial14/examples/jaxrpc/appclient/ e digitare:
appclient -client HelloServiceAppClient.jar http://localhost:1024/hello-ejb/hello

(si noti che l'URL è differente in quanto riportato nel tutorial, perché in questo caso stiamo provando il client con il servizio precedentemente realizzato e non con il servizio JAX-RPC utilizzato nel tutorial).

Il risultato del testo è presente in figura 19.


Figura 19
- Output del client J2EE

 

Conclusioni
Durante questo lungo tutorial si è visto quali sono i passaggi indispensabili per realizzare un servizio Web ed un client J2EE. Sebbene sia necessario l'uso estensivo di strumenti di amministrazione, l'approccio non è estremamente complesso, anche se si deve considerare che in queste semplici applicazioni di prova era presente un solo servizio, aspetto che facilita sicuramente la configurazione dei wizard.

 

Riferimenti
[1] Web Services e J2EE, parte I, Mokabyte settembre 2003
[2] Corso di Java Web Services, IIV parte: JAX-RPC, http://www.mokabyte.com/2003/06/jws-5.htm
[3] J2EE 1.4 Tutorial, http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it