Documentazione Contatti      
Documentazione > Tutorial > Client Web Service per un Traduttore Multilingue
Hide
Best Practices
EJB
Frameworks
Howto
J2EE
J2ME and Wireless
J2SE
JSP e Servlet
Java Application Server
Java IDE/Tools
Java Media
Java Security
Java Sys Admin
Java e XML
Java e SQL
OpenSource Java
Patterns
Repository
Tesi
UML
Web Services
Slide
White Paper di jws.it
project management
Eventi
Groovy



Google Noop


Chi controlla il passato controlla il futuro..
..Chi controlla il presente controlla il passato. George Orwell


Notazione UML - prima parte



  Visualizza Commenti (1) Aggiungi Commento    
 
Client Web Service per un Traduttore Multilingue
By Nino Guarnacci
7 novembre 2004

  Client Web Service per un Traduttore Multilingue
Program Step 1
Program Step 2
Program Step 3
Program Step 4
Program Step 5
Program Step 6
Program Riflessione
Program Documentazione

Se ancora non siete convinti delle potenzialità dei web service, questo esempio che vedremo tra breve vi permetterà di realizzare un traduttore multilingue da utilizzare nel vostro sito o da implementare standalone come applicazione di utilità.

Non stupitevi della facilità con cui realizzeremo questo client perché la vera difficoltà non sta nello scrivere il codice per collegarsi ad un web service, ma nel carpire la vera utilità che questi rappresentano.

Quindi pronti a partire con la realizzazione del vostro client web service, vi faccio notare che questa volta andremo a scrivere del codice che utilizzerà direttamente le classi soap.
I passi da seguire sono:

  1. Scaricare la libreria soap all'indirizzo http://ws.apache.org/soap/
  2. Creare la struttura della nostra web application
  3. Realizzare un bridge soap che ci metta in contatto con il ws di Babel
  4. Realizzare un nostro custom tag da inserire nella pagina jsp che ci farà da front end per il nostro traduttore
  5. Compilare il nostro web.xml , un tld per la mappatura del custom tag e realizzare una semplice JSP
  6. Compilare e Jarare il tutto e deplorare la nostra applicazione sotto tomcat o altro servlet engine o application server.



Step 1 top
Collegatevi all'indirizzo http://ws.apache.org/soap/ e scaricate l'ultima versione released del progetto soap-apache, compattatela ed ispezionatene i contenuti.Altrimenti prendete qui il soap.jar


Step 2 top
Create una cartella con il nome "traduttore", all'interno createne un'altra con il nome "WEB-INF".
Dentro quest'ultima create altre 3 cartelle "classes", "lib" e "tlds". Andate ad inserire la libreria soap.jar dentro la cartella "lib". Adesso dentro classes create altre due cartelle "bridge" e "tags".


Step 3 top

Adesso realizziamo una classe, che utilizzando le classi soap invii un richiesta al web service di Babel passandogli due informazioni il testo da tradurre e i "locales", ovvero la modalità di traduzione:
esempio per tradurre dall'italiano all'inglese "it_en", inglese francese "en_fr" etc etc…..
Fatto questo otteniamo la risposta dal ws e la ritorniamo.


package bridge;

import java.net.*;
import java.util.*;
import org.apache.soap.*;
import org.apache.soap.encoding.*;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
import org.apache.soap.util.xml.*;


public class BabelBridge {

// creo un oggetto soap di tipo call per effettuare la chiamata
    private Call call = new Call ();
    private URL url;


     public String traduci(String translationmode, String sourcedata )

throws SOAPException,MalformedURLException{

//setto dentro la call di soap l'identificativo del servizio
     call.setTargetObjectURI("urn:xmethodsBabelFish");

//dichiaro a quale url è in ascolto il servizio
     url= new URL("http://services.xmethods.net:80/perl/soaplite.cgi");
     Vector param = new Vector ();

//secondo il meccanismo di soap serializzo le informazioni da inviare dentro ad un vettore
     param.addElement (new Parameter("translationmode", String.class,translationmode, null));
     param.addElement (new Parameter("sourcedata", String.class,sourcedata, null));
     call.setParams (param);

//indico alla chiamata quale metodo invocare remotamente
    call.setMethodName ("BabelFish");
    call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

//invoco il web service ed attendo la risposta
   Response result = call.invoke (url, "");

//controllo se la risposta contiene degli errori
     if (result.generatedFault ())
           {
              Fault fault = result.getFault();
              throw new SOAPException(fault.getFaultCode(), fault.getFaultString());
            }
     Parameter retValue = result.getReturnValue();
//ritorno castando a stringa il valore di ritorno dalla risposta
     if (retValue != null) return (String)retValue.getValue ();
              return "OPERAZIONE RIUSCITA";

    }

}

Adesso salvate la classe con nome "BabelBridge" dentro la cartella bridge (traduttore/WEB-INF/classes/bridge).



Step 4 top

Adesso realizziamo un semplice custom tag che utilizzi la nostra classe bridge passandogli le informazioni. Attenti questa classe, se avete deciso di realizzare un traduttore standalone e non un'applicazione per il web non deve essere scritta, basta solamente inserire un metodo main nella classe precedente(BabelBridge).


package tags;

import javax.servlet.*;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.TagSupport;

import bridge.*;

public class BabelTag extends TagSupport{

//dichiaro un attributo per memorizzare I locales
private String versus;

//dichiaro un attributo per memorizzare il testo da tradurre
private String mex;

public void setVersus(String versus){
      this.versus=versus;
      }
public String getVersus(){
      return versus;
      }

public void setMex(String mex){
      this.mex=mex;
      }
public String getMex(){
     return mex;
     }

public int doEndTag() throws JspException{

     try{
 
              JspWriter out=pageContext.getOut();
                    if("null".equalsIgnoreCase(mex)||mex==null)return EVAL_PAGE;


            //mi istanzio il mio bridge
             BabelBridge bb=new BabelBridge();

            //e ne invoco il metodo che mi permette di effettuare la traduzione
             String result=bb.traduci(versus,mex);
                   if(result==null)return EVAL_PAGE;

           //non mi rimane da fare altro che formattare la risposta a mio piacimento
           out.println("<textarea rows=\"4\" name=\"aa\" cols=\"40\" readonly            onfocus=\"this.blur()\">"+result+"</textarea>");

            }catch(Exception ex){

                      ex.printStackTrace();
            }
            return EVAL_PAGE;
            }
}

Adesso salvate la classe con il nome "BabelTag" dentro la cartella tags.



Step 5 top

Realizziamo il file tld che mappa il nostro custom tag:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>Traduttore</shortname>



<tag>
<!-- il nostro custom tag si chiamerà traduci -->
    <name>traduci</name>
    <tagclass>tags.BabelTag</tagclass>
    <bodycontent>JSP</bodycontent>
    <attribute>

    <!-- e prenderà come attributi due valori versus e mex -->
    <name>versus</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
    <name>mex</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
</tag>
</taglib>

Adesso salvate il file con nome "traduttore.tld" dentro la cartella tlds

Realizziamo il nostro web.xml:


<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

<web-app>
<!-- la mia libreria di custom tag sarà richiamabile dalle jsp con il nome traduttore -->
<taglib>
      <taglib-uri>traduttore</taglib-uri>
      <taglib-location>/WEB-INF/tlds/traduttore.tld</taglib-location>
</taglib>

</web-app>

Adesso salvate il file con il nome "web.xml" dentro la cartella "WEB-INF".

Infine realizziamo la nostra complicatissima jsp che ci permetterà di effettuare le traduzioni:

<!-- importo la taglib dentro la mia jsp -->
<%@taglib uri="traduttore" prefix="traduttore"%>
<html>
<body>

<!-- creo un form che richiami la stessa pagina fornendo le informazioni al custom tag -->
<form action="#" method="post">
<textarea rows="4" name="testo" cols="40"></textarea><br>
<select name="versus" size="1">
<option value="en_zh" >da Inglese a Cinese</option>
<option value="en_fr" >da Inglese a Francese</option>
<option value="en_de" >da Inglese a Tedesco</option>
<option value="en_it" SELECTED>da Inglese a Italiano</option>
<option value="en_ja" >da Inglese a Giapponese</option>
<option value="en_ko" >da Inglese a Coreano</option>
<option value="en_pt" >da Inglese a Portoghese</option>
<option value="en_es" >da Inglese a Spagnolo</option>
<option value="zh_en" >da Cinese a Inglese</option>
<option value="fr_en" >da Francese a Inglese</option>
<option value="fr_de" >da Francese a Tedesco</option>
<option value="de_en" >da Tedesco a Inglese</option>
<option value="de_fr" >da Tedesco a Francese</option>
<option value="it_en" >da Italiano a Inglese</option>
<option value="ja_en" >da Giapponese a Inglese</option>
<option value="ko_en" >da Coreano a Inglese</option>
<option value="pt_en" >da Portoghese a Inglese</option>
<option value="ru_en" >da Russo a Inglese</option>
<option value="es_en" >da Spagnolo a Inglese</option>
</select><br>
<input type="submit" name="Traduci" value="Traduci"><br>
</form>

<!-- richiamo il custom tag traduci passandogli come informazioni il versus e il mex -->
<traduttore:traduci versus='<%=request.getParameter("versus")==null?"null":request.getParameter("versus")%>' mex='<%=request.getParameter("testo")==null?"null":request.getParameter("testo")%>' />

</body>
</html>

Adesso salvate quest'ultimo file con il nome "index.jsp" dentro la cartella traduttore.



Step 6 top

A questo punto aprite una shell e mettetevi nella cartella classes e lanciare il compilatore java passandogli nel classpath la libreria di soap (javac -classpath %CLASSPATH%;..\lib\soap.jar tags/*.java bridge/*.java).

Dopo aver corretto il centinaio di errori che il compilatore gentilmente vi mostrerà, sempre nella vostra shell tornate nella cartella engine (traduttore/) e realizzate il war della vostra nuova web application (jar -cvf traduttore.war *).

A questo punto no vi resta che buttare il vostro file traduttore.war che risiede nella cartella traduttore, dentro la cartella webapps di tomcat (o qualsiasi altro servlet engine o application server stiate usando) e startare il server.

http://localhost:8080/traduttore/index.jsp è il vostro risultato ………….



Riflessione top

Sarebbe interessante anche crearne una versione stand alone per gli usi più disparati, tipo un nostro traduttore da integrare nelle applicazioni gestionali della nostra azienda…….

public static void main(String args[]){

try{
      BabelBridge bb=new BabelBridge();
      System.out.println(bb.traduci(args[0],args[1]));
           }catch(Exception e){
                 e.printStackTrace();
           }
}

Inserite questo metodo dentro la classe BabelBridge (compilate) e provate a lanciarla da riga di comando, tipo: java -classpath %CLASSPATH%;..\lib\soap.jar bridge.BabelBridge en_it "i could not ask more" …………

Fai il downLoad del file war

Ciao ………Nino Guarnacci !!!!!!!



Documentazione top
WSDL
http://www.xmethods.net/sd/2001/BabelFishService.wsdl
Proprietario xmethods.net
Descrizione Interfaccia per il servizio BabelFish di Altavista


 Attachments List
Generic Documenttraduttore.war
Generic Documentsoap.jar



JavaPortal è ideato da:    
K-Tech Logo










LICENZA



Eccetto dove diversamente specificato, i contenuti di questo sito sono rilasciati sotto licenza Creative Commons

Sitemap  © 2002-2004 Copyright Information. Privacy . Today is sabato 19 giugno 2010