Login
Cerca all'interno di JavaPortal
Help
Home Page Documentazione Forum Progetti Partner Pubblica!
Documentazione > Tutorial > XMoon : un framework per ottimizzare i tempi di sviluppo.
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


Blaise Pascal
È molto più bello sapere qualcosa di tutto, che tutto di una cosa


Hello World con Eclipse


Rss Feed
Home Page
Articoli
News
Forum
Classi

  Visualizza Commenti (0) Aggiungi Commento    
Add to Shortcuts
 
Vota l'articolo
XMoon : un framework per ottimizzare i tempi di sviluppo.
By Mario Neè
7 giugno 2005

  XMoon : un framework per ottimizzare i tempi di sviluppo.
Program Panoramica del framework
Program Business object
Program Business logic
Program Integrazione con Struts
Program Integrazione con Hibernate
Program Esempio

Come spesso accade, per chi sviluppa applicazioni, si affrontano progetti dai tempi molto brevi e/o dai requirement che mutano durante la fase di sviluppo.
Davanti ad una simile situazione è molto utile avere gli strumenti adeguati per ottenere un'applicazione reattiva ai cambiamenti provenienti dall'esterno in modo del tutto indolore per lo sviluppatore e al tempo stesso veloce da realizzare.
Partendo da queste necessità è stato pensato e realizzato XMoon (http://www.xmoon.it), un progetto opensource che ha lo scopo di rendere la fase di sviluppo e debug semplice e veloce.
XMoon riesce ad ottenere questi risultati combinando due fattori : sfruttando oggetti dinamici a runtime insieme ad un linguaggio interpretato.



Panoramica del framework top

Il framework segue il paradigma MVC "model view controller", ereditato direttamente da Struts, dove i ruoli di presentation, control e business logic vengono affidati a componenti diversi e sono tra di loro disaccoppiati, con evidenti vantaggi in termini di riusabilità, manutenibilità, modularità e qualità.
XMoon definisce sia il business logic (Controller) che i business object (Model) con dei file xml traendo tutti i vantaggi da questo linguaggio che offre una maggiore flessibilità, compatibilità e portabilità rispetto a qualsiasi altro linguaggio.


<?xml version="1.0" encoding="ISO-8859-1"?>
<service>
        <task>
                <code>
                        print("hello world !");
                </code>
        </task>
</service>

Il livello di presentazione è affidato a Velocity, una delle migliori soluzioni per la creazione di template dinamici. (http://jakarta.apache.org/velocity/index.html)
Velocity utilizza la sintassi del linguaggio di templating (Vtl, Velocity Template Language). Questo tipo di sintassi è estremamente ridotta e copre essenzialmente l'impostazione di variabili, cicli, istruzioni condizionali, macro, inclusione di file e d'altri template.
A confronto delle jsp si ha una maggiore leggibilità del codice che risulta molto più compatto, efficiente e di facile comprensione.

 

Fig 1  Panoramica del framework



Business object top

Alla base del sistema di XMoon troviamo un meta-oggetto denominato Obj, rappresentante le caratteristiche dell'istanza di un altro oggetto.
Vediamo qui di seguito un esempio:


<obj scope="session">
      <dynadescriptor>Cliente</dynadescriptor>
      <init>
            data_creazione = new Date();
            me.set("data_creazione", data_creazione)
            </init>
</obj>


In questo esempio stiamo inizializzando un obj cliente.xml che avrà uno scope di tipo sessione e si legherà ad un altro oggetto che è il Dynadescriptor, ossia il descrittore dei campi del nostro cliente che vedremo in seguito.
All'intermo del tag <init> abbiamo la possibilità di scrivere come deve essere inizializzato ogni obj cliente. Nel nostro caso viene inizializzato l'attributo data creazione con la data attuale del sistema.


<dynadescriptor>
      <field type="value"><name>id</name></field>
      <field type="value"><name>nome</name></field>
      <field type="value"><name>cognome</name></field>
      <field type="value"><name>citta</name></field>
      <field type="value"><name>data_creazione</name></field>
</dynadescriptor>


Il Dynadescriptor è un modo potente e dinamico di descrivere oggetti senza nemmeno scrivere una riga di codice Java. I campi di questo oggetto possono essere facilmente modificati o letti tramite semplice metodi set e get; per cui se volessimo settare il nome dell'oggetto cliente basterebbe scrivere : cliente.set("nome", "Gianni").
L'Obj oltre a legarsi ai dynadescriptor può anche istanziare le comuni classi java nel seguente modo:


<obj scope="session">
      <class>it.prova.Cliente</class>
</obj>



Business logic top

Sempre all'interno di file xml troviamo come si muoverà la nostra applicazione grazie ad un linguaggio di programmazione interpretato che utilizza come interprete Beanshell http://www.beanshell.org.
L'interprete è un programma in grado di leggere un sorgente in un certo linguaggio e, istruzione per istruzione, verificarne la sintassi, effettuarne la traduzione in linguaggio macchina e far eseguire al microprocessore della macchina il codice binario generato.
L'interprete è inoltre in grado di interrompere spontaneamente l'esecuzione quando rilevi un errore di sintassi, consentire al programmatore la correzione dell'errore e riprendere l'esecuzione dall'istruzione appena modificata.
La programmazione interpretata facilita enormemente le varie fasi di sviluppo e correzione del programma.

 

Fig. 2 Business Logic

In questo servizio troviamo il tag <obj> dove viene definito quali Obj il sistema andrà a caricare nel contesto del servizio, utilizzando la classe ObjNode che si prende cura di gestire tutti gli Obj seguendo lo scope che essi hanno.
Il servizio avrà uno o più task che si possono eseguire in successione e in qualsiasi momento, si potrà fermare la sequenza settando l'attributo execute del WorkBench a false.
XMoon offre la possibilità di tenere in cache questi service per aumentare le prestazioni del sistema, nel caso di un'applicazione che giri su un sistema di produzione.



Integrazione con Struts top

Per far lavorare i nostri service con struts dovremo aggiungere le seguenti righe al file struts-config.xml


<action path="/test" type="it.xmoon.TaskAction">
      <forward name="success" path="/test.vm"/>
      <forward name="error" path="/error.vm"/>
</action>

TaskAction, in questo esempio, cerca il service test.xml in WEB-INF/xml/service. Viene chiamato a questo punto la classe BshNode che si prenderà cura di gestire i task del service e ritornare un ActionForward.



Integrazione con Hibernate top
Come in tutte le applicazioni del mondo reale si ha la necessità di avere un dispositivo in cui vengono salvati i dati, a questo si aggiunge il bisogno di garantirne la concorrenza e l'integrità. Sul mercato ci sono tante buone soluzioni, ma quella di Hibernate rappresenta la più versatile, potente e veloce da utilizzare.
Dalla nuova release, la 0.5, è stato aggiunta l'integrazione con hibernate, da ritenersi ancora in fase beta e con alcune aree di miglioramento.
All'interno di un service potremo accedere sia all'oggetto Session che Transaction di hibernate rispettivamente con hb e tx all'interno dei nostri service.
Nella prossima release si cercherà di rendere maggiore l'integrazione tra il motore di persistenza e l'Obj.


Esempio top

Come in tutti gli esempi che si rispettino, anche il nostro scriverà il classico messaggio "hello world" all'interno di una pagina web.
Partiamo col creare il service che salvaremo nel file prova.xml :

<?xml version="1.0" encoding="ISO-8859-1"?>
<service>
      <task>
            <code>
                  messaggio = "Hello World!";
            </code>
      </task>
</service>

Fatto questo dobbiamo configurare il service appena creato nella configurazione di Struts (struts-config.xml), all'interno del tag <action-mappings>.


<action path="/prova" type="it.xmoon.TaskAction">
      <forward name="success" path="/prova.vm"/>
      <forward name="error" path="/error.vm"/>
</action>

Nella configurazione possiamo notare i forward che non sono altro che la "direzione" che vogliamo dare alla nostra richiesta Http dopo che il service è stato eseguito o è terminato in errore.
XMoon dopo avere eseguito il task del service prova.xml se non trova un forward definito dall'utente e se il processo è andato a buon fine, assegna un valore il valore di default "success" che nella nostra configurazione và a richiamare il template prova.vm di Velocity.

Andiamo ora a scrivere il template prova.vm:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
      <head>
            <title>Servizio prova</title>
      </head>
      <body>
            <table>
                  <tr>
                         <td>
                              $messaggio
                        </td>
                  </tr>
            </table>
      </body>
</html>

e questo il risultato finale:
 
Fig. 3 Esempio


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