Login
Cerca all'interno di JavaPortal
Help
Home Page Documentazione Forum Progetti Partner Pubblica!
Documentazione > Tutorial > Comunicazione fra J2ME e un application server J2EE
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

Hai una tesi in Java?
Tesine preparate
per esami?
Pubblica tutto su
JavaPortal!

Scrivi al nostro staff


Java Application Server day 2009


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


Cifrare dati in Java, parte 1: Architettura


Rss Feed
Home Page
Articoli
News
Forum
Classi

  Visualizza Commenti (2) Aggiungi Commento    
Add to Shortcuts
 
Vota l'articolo
Comunicazione fra J2ME e un application server J2EE
By Enrico cesaretti
4 settembre 2005
Valutazione Acquisita: 80

  Comunicazione fra J2ME e un application server J2EE
Program Ambiente

Introduzione
In questo articolo vedremo la facilità con cui è possibile far comunicare un dispositivo portabile wireless ed un application server j2ee. Per lo sviluppo dei vari componenti utilizzeremo le api midp1.0.3 e j2ee1.3 rilasciate dalla SUN Microsystem. Da cellulare compatibile j2me inviaremo dei dati ad una servlet java caricata su un application server Jboss3.0.4. L'architettura avrà un aspetto simile a questo:

 

Fig. 1 Comunicazione fra J2ME e un application server J2EE 



Ambiente top

Per prima cosa abbiamo bisogno di una tabella sulla quale effettuare l'inserimento dei dati. Supponiamo che la nostra tabella si chiami ANAGRAFICA e contenga i campi ID, NOME e COGNOME. Ecco lo skin completo:

ANAGRAFICA

ID

PK

INT

3

NOME

 

VARCHAR

20

COGNOME

 

VARCHAR

20


Per questo esempio useremo un database opensource di tipo MYSQL scaricabile al link http://www.mysql.org e vi navigheremo con un tool anch'esso opensource di nome MySQL-Front.

Una volta realizzata la tabella, dobbiamo preoccuparci di creare una web application contenente la servlet in grado di inserirvi i dati. La struttura della nostra web-app sarà simile a questa:

Fig. 2  Ambiente

Andiamo quindi a scrivere il codice per le varie risorse. Ecco la servlet che inserisce i dati nel DB:

//Importiamo i package necessari.
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class Insert extends HttpServlet
{

public void init()
{
          System.out.println("<<<[ Insert inizializzata ]>>>");
}

protected void service(
          HttpServletRequest request,
          HttpServletResponse response)throws IOException
{
/*
Dichiariamo due variabili di tipo java.lang.String e le valorizziamo utilizzando dei parametri della request(nome,cognome).
/**/
          String nome = request.getParameter("nome");
          String cognome = request.getParameter("cognome");

/*
Gazie alle API JDBC apriamo una connessione nei confronti del DB ed istanziiamo un oggetto java.sql.Statement utilizzando il driver di connessione per mysql scaricabile all'url http://www.mysql.org.
/**/

          Connection con =null;
          Statement sta = null;
          try
          {
                    Class.forName("org.gjt.mm.mysql.Driver");
                    con = DriverManager.getConnection(
                    "jdbc:mysql://localhost/micro"
                    ,"root"
                    ,"root");
                    sta = con.createStatement();
/*
A questo punto siamo in grado di lanciare l'istruzione SQL per inserire i dati utilizzando per tale operazione i parametri presi dalla request.
/**/
                    sta.executeUpdate
                    (
                    "INSERT INTO anagrafica VALUES('','"+nome+"','"+cognome+"');"
                    );

/*
La risposta verrà inviata al client con un java.io.PrintWriter che scrive sull'oggetto response.
Notare come il content della response viene settato in modalita' text/plain.
/**/
          PrintWriter out = response.getWriter();
          response.setContentType("text/plain");
          out.print("Parametri inseriti\nnome: " + nome +"\ncognome: " + cognome);
          }catch(Exception e)
          {
                    System.out.println(e);
          }finally
          {
          try
          {
/*
Come ultima operazione dobbiamo deallocare le risorse prima utilizzate.
/**/
           if(sta!=null)sta.close();
           if(con!=null)con.close();
          }catch(Exception e)
          {
                    System.out.println(e);
          }

          }

      }

}

Fai il download di Servlet.zip

Adesso mappiamo la servlet con un url-pattern nel file descrittore di deploy web.xml:

<?xml version="1.0"?><!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>
          <servlet>
                    <servlet-name>alias</servlet-name>
                    <servlet-class>Insert</servlet-class>
          </servlet>
          <servlet-mapping>
                    <servlet-name>alias</servlet-name>
                    <url-pattern>inserisci</url-pattern>
          </servlet-mapping>
</web-app>

Possiamo testarne il funzionamento utilizzando un semplice file html che invia i dati alla servlet in modalità POST:

<html>
<body>
<h2>Pagina di registrazione</h2>
<hr>
          <table>
                    <form action="inserisci" method="post">
                    <tr>
                    <td>
                    Nome
                    </td>
                    <td>
                    <input type="text" name="nome">
                    </td>
                    </tr>
                    <tr>
                    <td>
                    Cognome
                    </td>
                    <td>
                    <input type="text" name="cognome">
                    </td>
                    </tr>
          </table>
          <hr>
                    <input type="submit" name="registra" value="inserisci">
          </form>
</body>
</html>

Come è possibile notare, ho inserito un form con l'impostazione action="inserisci" che invia i dati in POST alla servlet. Una volta eseguiti tutti i passaggi, impacchettiamo l'applicazione in un war ed effettuiamo il deploy su un application server compatibile j2ee. Per questo esempio ho utilizzato Jboss3.0.4. Ecco il risultato:

 

Fig. 3  Ambiente

Il comando inserisci invierà i dati presenti nella form alla servlet in modalità POST, ed il server risponderà con una pagina in formato testo:

 

Fig. 4  Ambiente

Quando visualizzeremo il contenuto della tabella ANAGRAFICA vedremo i dati prima inseriti nelle caselle di testo:

 

Fig. 5  Ambiente

Lo scopo di questo articolo è quello di eseguire le stesse operazioni viste sopra utilizzando, come client, un dispositivo wireless compatibile j2me. Vediamo dunque come configurare il nostro sistema.

Per prima cosa dobbiamo scaricare i vari componenti dal sito http://java.sun.com.
Per una guida dettagliata sul download e l'installazione consultare il link http://www.javaportal.it/docs/midlet1.htm .

Una volta installata la suite j2me, utilizziamo il nostro Wireless toolkit per creare un nuovo progetto assegnandogli un nome globale ed un nome per la prima midlet:

 

Fig. 6  Ambiente

l progetto appena creato ha una struttura di questo tipo:

 

Fig. 7  Ambiente

che verrà creata nella directory apps, all'interno della directory di installazione del nostro toolkit.

Es: C:\j2me1.0.3\apps

Esaminiamo insieme il codice della Midlet incaricata del trasferimento dei dati alla servlet.La midlet verrà inserita nella directory src del nostro progetto:


//Importiamo i package necessari.
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;

/*
Estendiamo la classe MIDLet ed implementiamo l'interfaccia CommandListener che ci permette di gestire gli eventi generati dai vari componenti utilizzando il metodo commandAction()
/**/
public class Inserimento extends MIDlet implements CommandListener
{
/*
Dichiariamo un oggetto Display,
un Form, tre TextField e due command.
/**/

private Display display;
private Form form;
private TextField nome, cognome, indirizzo;
private Command chiama, esci;

public Inserimento()
{
//Prendiamo un riferimento al display del dispositivo.
        display = Display.getDisplay(this);

//Istanziamo i tre oggetti TextField.
       indirizzo = new TextField(
       "Indirizzo:",
       "http://localhost:8080/Registra/inserisci",
       150,
       TextField.ANY);
       cognome = new TextField("Cognome:", "", 50, TextField.ANY);
       nome = new TextField("Nome:", "", 50, TextField.ANY);

//Istanziamo gli oggetti Command ed il form.
       chiama = new Command("Chiama", Command.SCREEN, 2);
       esci = new Command("Esci", Command.EXIT, 1);
       form = new Form("Inserisci i dati");

//Aggiungiamo i componenti all'oggetto form.
       form.append(indirizzo);
       form.append(cognome);
       form.append(nome);
       form.addCommand(esci);
       form.addCommand(chiama);

//Registriamo il form al gestore degli eventi(Questa classe).
       form.setCommandListener(this);
}

/*
Ecco i metodi per la gestione del ciclo di vita della midlet.
Notare come nel metodo startApp() appendiamo il form sul display del dispositivo.
/**/
public void startApp(){display.setCurrent(form);}
public void pauseApp(){}
public void destroyApp(boolean unconditional){}

//Metodo per la gestione degli eventi.
public void commandAction(Command c, Displayable s)
{
/*
Se l'utente seleziona il comando chiama viene invocato il metodo callServlet().
/**/
       if (c == chiama)
       {
              try
              {
              callServlet();
              }catch (Exception e)
              {
              System.out.println(e.toString());
              }
/*
Se l'utente seleziona il comando esci vengono invocati i metodi destroyApp() e notifyDestroyed() che permettono l'uscita dall'applicazione.
/**/
              }else if (c == esci)
              {
              destroyApp(false);
              notifyDestroyed();
       }
}

/*
Il metodo che effettua la connessione alla servlet passandogli i parametri.
/**/
private void callServlet() throws IOException
{
/*
Dichiariamo un oggetto HttpConnection che rappresenta una connessione http.
/**/
       HttpConnection http = null;
//Dichiariamo un InputStream
       InputStream input = null;
/*
Dichiariamo una String che, prendendo i dati dalle TextField, crea dinamicamente una richiesta GET da inviare alla servlet
/**/
       String url = indirizzo.getString() +
       "?nome=" +
       nome.getString() +
       "&cognome=" +
       cognome.getString();
              try
                     {
/*
Apriamo la connessione http con il metodo open passandogli la stringa url.
/**/
              http = (HttpConnection) Connector.open(url);

//Setto la modalità di inviamo dati a GET
              http.setRequestMethod(HttpConnection.GET);

/*
Da questo punto gestiamo la response del server.
Facciamo un controllo e se la response contiene il codice http 200, l'interazione è andata a buon fine e siamo pronti all'elaborazione dei dati, altrimenti appendiamo al form il codice di errore http visualizzandolo poi sul display.
/**/
              if (http.getResponseCode() == HttpConnection.HTTP_OK)
              {
//dichiariamo un array di byte vuoto
              byte servletData[]=null;
/*
Valorizziamo l'InputStream prima dichiarato ottenendo l'InputStream dalla connessione
/**/
              input = http.openInputStream();
//Cerchiamo di ottenere la lunghezza in byte della response
              int length = (int) http.getLength();
//Se la lunghezza della response è nota:
              if (length > 0)
              {
/*
Impostiamo la dimensione dell'array di byte utilizzando la lunghezza in byte della response.
/**/
                     servletData = new byte[length];
//Effettuiamo la lettura dei dati dall'InputStream sull'array
                     input.read(servletData);
//Appendiamo al form i dati di output
                     form.append("\n" + new String(servletData));
//Visualizziamo il form sul display
                     display.setCurrent(form);
//Se la response è nulla:
                }else if(length == 0)
                {
                     form.append("\nLettura fallita");
//Se la lunghezza non è nota:
              }else
              {
//Istanziamo un oggetto ByteArrayOutputStream
                     ByteArrayOutputStream output =
                     new ByteArrayOutputStream();
/*
Leggiamo l'InputStream e inseriamo il contenuto nel ByteArrayOutputStream con il metodo write()
/**/
                     int ch;
                     while ((ch = input.read()) != -1)
                     output.write(ch);
//Valorizziamo l'array di bytes
                     servletData = output.toByteArray();
//Appendiamo al form i dati di output
                     form.append("\n" + new String(servletData));
//Visualizziamo il form sul display
                     display.setCurrent(form);
//Chiudiamo il ByteArrayOutputStream
                     output.close();
                     }
              }else
              {
//Gestione dei vari http status code diversi da 200
              form.append("Http exit code: " +
              http.getResponseCode() +
              "\n");
       display.setCurrent(form);
       }
       }catch (Exception e)
       {
//Gestione degli errori di connessione
              form.append("Errore di rete:\n");
              form.append("Type: "+e);
              form.append("Message: "+e.getMessage());
         }finally
{
//Chiudiamo le risorse allocate.
              if (input != null)input.close();
              if (http != null)http.close();

                     }
       }
}

Fai il download di Midlet.zip
 
Completata la midlet, effettuiamo la compilazione utilizzando il tarso Build del Wireless toolkit

Fig. 8 Ambiente

Se la compilazione è andata a buon fine, passiamo alla fase di impacchettamento e preverifica, anch'essa effettuata dal Wireless toolkit alla voce di menu Project/Package:

Fig. 9 Ambiente

Durante questa fase viene creato un pacchetto .jar posizionato nella directory bin. Tale pacchetto può essere portato su dispositivo wireless per essere poi eseguito. Se non si dispone di tale dispositivo è possibile utilizzare uno degli emulatori messi a disposizione dalla SUN Microsystem all'interno del Wireless toolkit.
Per testare l'applicazione ho utilizzato l'emulatore MediaControlSkin, ma un qualsiasi altro andrà bene. Ho lanciato il test cliccando sul tasto Run:

Fig. 10 Ambiente 

Il lancio dell'applicazione avviene cliccando nel tasto launch del cellulare. Le librerie grafiche che vengono utilizzate dai componenti della j2me sono nativi del dispositivo, quindi potremmo notare delle differenze a livello grafico fra i vari dispositivi. Ecco come si presenterà l'applicazione:

Fig. 11 Ambiente 

Dopo aver inserito i valori nei campi, invochiamo la servlet con l'apposito comando chiama.

Fig. 12 Ambiente 

Se la chiamata va a buon fine dovremmo trovarci davanti un risultato di questo tipo:

 

Fig. 13 Ambiente

Per una ulteriore verifica, possiamo interrogare il DB e noteremo l'arrivo dei nuovi dati.

Fig. 14 Ambiente

Partendo da questa basilare architettura possiamo sviluppare componenti ben più complessi, che ci permettono, utilizzando un dispositivo wireless, di muovere la logica applicativa su un application server. Dobbiamo sempre tener presente che dal nostro "cellulare java" è possibile comunicare con un server utilizzando vari protocolli di trasmissione dati.

L'idea di questa applicazione mi è venuta leggendo il libro "Core J2ME tecnology & MIDP" di John W. Muchow ,che vi consiglio caldamente.


 Attachments List
Generic DocumentServlet.zip
Generic DocumentMidlet.zip
Username:
Password:
To sign up for an account, click register... Register
Hide





Powered By



Campagna Anti-IF


Skin


PARTNER
Zio Budda
HostingJava


LICENZA



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

Sitemap  © 2002-2004 Copyright Information. Privacy . Today is domenica 1 agosto 2010