|
Lo scopo del lavoro è quello di guadagnarsi il tempo libero
|
|
| Home Page |
|
| Articoli |
|
| News |
|
| Forum |
|
| Classi |
|
|
|
|
|
Verso il web 2.0: Getting started con echo2
By
Marco Immediato
15 gennaio 2007
Valutazione Acquisita:
80
|
 |
|
Echo2 è un'evoluzione di Echo Web Framework, basato su Ajax (Asynchronous JavaScript and XML) senza conoscerla nel dettaglio. L'aspetto che vi colpirà nell'utilizzare questo framework è la facilità di sviluppo: avrete la possibilità di sviluppare web application anche senza avere la conoscenza di HTML, HTTP e Javascript! Echo2 è un progetto open-source distribuito sotto i termini della Mozilla Public License ( o se prefetite GNU LGPL License) dalla società NextAPP.

|
|
|
Overview
|
top
|
Analizziamo in modo sommario come lavora questo framework:
- Il server è notificato da un'azione del client da un messaggio XML usando l'oggetto XMLHttpRequest.
- Il server processa l'input ricevuto, modificando lo stato dell'applicazione lato server per riflettere le azioni dell'utente.
- Il server risponde al client con un messaggio XML che contiene le direttive per l'update dello stato del client.
- Il client riceve il messaggio di risposta e lo processerà in modo da effettuare gli update necessari al DOM pella pagina.
Da notare che la comunicazione client/server è asincrona (grazie all'utilizzo dell'oggetto XMLHttpRequest) e quindi l'applicazione
Echo vive all'interno di una sola pagina senza un aggiornamento o refresh della stessa.
Ho provato questo framework scrivendo un'applicazione per la gestione di news, potete scaricare il codice sorgente e il war dell' applicazione.
I tempi di sviluppo sono stati davvero molto brevi...ma iniziamo.
|
|
Getting started
|
top
|
|
Per questa applicazione ho usato Apache Tomcat 5.5.17, ma qualsiasi servlet container andrà bene.
Scarichiamo Echo2 versione 2.0.0 al link http://www.nextapp.com/platform/echo2/echo/download/ e scompattiamolo sul filesystem.
Nella directory “SourceCode/src/exampleapp” ci sono delle applicazioni di esempio che possiamo usare come scheletro per scrivere la nostra, io ad esempio ho usato questa struttura:

Fig 1- struttura del progetto
Nella root abbiamo il build.xml e ant.properties Nella directory src/deploy abbiamo il web.xml In src/htdocs abbiamo una semplice pagina di benvenuto index.html In src/java avremo la nostra applicazione nel package web20.echo2.news In lib naturalmente ci sono le librerie usate dall'applicazione
Per creare una web application con Echo bisogna creare due classi: un ApplicationInstance e un WebContainerServlet.
ApplicationInstance è una classe astratta con un metodo init() che deve essere definito dallo sviluppatore. Il metodo init() è invocato per inizializzare lo stato dell'interfaccia utente. Esso deve ritornare un oggetto Window di Echo.
Analizziamo il seguente codice:
public class HelloWorldApp extends ApplicationInstance { public Window init() { Window window = new Window(); ContentPane contentPane = new ContentPane(); window.setContent(contentPane); Label label = new Label("Hello, world!"); contentPane.add(label); return window; } }
Questa classe rappresenta un'applicazione Echo che scrive sul browser la famigerata scritta “Hello, world!”.
Come notiamo la classe HelloWorldApp estende ApplicationInstance e quindi deve implementare il metodo init().
Oltre l'oggetto Window troviamo anche altri oggetti Echo, come ContentPane e Label del tutto paragonabili ai Container SWING.
L'oggetto ContentPane rappresenta un generico container in cui troviamo l'oggetto Label che scrive sulla finestra del browser “Hello, world!”.
WebContainerServlet invece è una classe Echo che deriva da HttpServlet. La sua funzione, dal punto di vista implementativo, è quello di creare nuove ApplicationInstance.
public class HelloWorldServlet extends WebContainerServlet { public ApplicationInstance newInstance() { return new HelloWorldApp(); } }
Seguendo questi due “must” iniziamo a scrivere la nostra applicazione:
la “servlet”:
public class NewsServlet extends WebContainerServlet {
private static final long serialVersionUID = 1L;
public ApplicationInstance newApplicationInstance() { return new NewsApp(); } }
e la nostra applicazione:
public class NewsApp extends ApplicationInstance {
private static final long serialVersionUID = 1L; private Window window; /** * questo metodo viene richiamato dal container * quando viene invocata la servlet */ public Window init() { window = new Window(); window.setTitle("Echo2 Example"); return window; } ... ...
Abbiamo così creato le basi per scivere la nostra applicazione.
|
|
I componenti
|
top
|
Una User Interface Echo è costruita da un insieme di oggetti Component organizzati come una gerarchia. Un Component è un oggetto che estende nextapp.echo2.app.Component come ad esempio Label, Button, ContentPane, TextField ....
Le gerarchie sono create e manipolate usando i metodi add() e remove() di ogni singolo Component.

Fig 2 - la gerarchia
La root della gerarchia è “Window” che rappresenta la finestra del browser e contiene l'applicazione. “Window” deve contenere un ContentPane che rappresenta la regione in cui i componenti possono essere aggiunti.
A questo punto inseriamo una pagina di login alla nostra applicazione.
Ciò è possibile farlo implementando una classe che estende ContentPane:
public class Login extends ContentPane {
private TextField userNameField; private PasswordField passwordField; public Login() { super(); Label label;
WindowPane loginWindow = new WindowPane(); loginWindow.setTitle("Login"); loginWindow.setClosable(false); add(loginWindow); SplitPane splitPane = new SplitPane(SplitPane.ORIENTATION_VERTICAL_BOTTOM_TOP, new Extent(32)); loginWindow.add(splitPane); Row controlRow = new Row(); splitPane.add(controlRow); Button button = new Button("Login Admin"); button.addActionListener(new ActionListener() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { processLoginAdmin(); } }); controlRow.add(button); Button buttonGuest = new Button("Login Guest"); buttonGuest.addActionListener(new ActionListener() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { processLoginGuest(); } }); controlRow.add(buttonGuest);
Grid layoutGrid = new Grid(); splitPane.add(layoutGrid);
label = new Label("Username"); layoutGrid.add(label);
userNameField = new TextField();
layoutGrid.add(userNameField); label = new Label("Password"); layoutGrid.add(label); passwordField = new PasswordField(); passwordField.addActionListener(new ActionListener() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { processLoginAdmin(); } }); layoutGrid.add(passwordField); Il nostro ContentPane può essere ora aggiunto all'applicazione tramite l'oggetto Window: public Window init() { window = new Window(); window.setTitle("Echo2 Example"); window.setContent(new Login()); return window; }
e il risultato sarà il rendering sul browser di una piccola finestra (WindowPane) che contiene due label (Username e Password), due input text e due button.
|
|
Le action
|
top
|
|
I componenti possono registrare un ActionListener che riceverà un ActionEvent (così come avviene nelle SWING) per poter effettuare delle operazioni applicative.
Ad esempio: Button button = new Button("Login Admin"); button.addActionListener(new ActionListener() { private static final long serialVersionUID = 1L; public void actionPerformed(ActionEvent e) { processLoginAdmin(); } });
Al Button “Login Admin” aggiungo un ActionListener che provvederà ad effettuare alcune operazioni eseguendo il metodo actionPerformed. n questo esempio, quando premo il pulsante “Login Admin”, viene richiamato un metodo privato processLoginAdmin che effettuerà i controlli necessari per effettuare la login.
private void processLoginAdmin() { if(!(NewsApp.getApp().loginAdmin(userNameField.getText(), passwordField.getText()))) getApplicationInstance().getDefaultWindow().getContent().add(new ErrorLogin()); }
Da notare che la logica di login è spostata nell'applicazione, infatti è buona norma lasciare la logica dell'applicazione al di fuori dei Component.
Tramite il metodo statico getApp(), posso lavorare con l'istanza della mia applicazione e richiamarne i metodi di business come in questo caso la login.
public class NewsApp extends ApplicationInstance { ... ... public boolean loginAdmin(String username, String password){ boolean userExist = false;
... ... return userExist; } ... ...
Nel caso in cui non si hanno i privilegi per la login, viene aggiunto un componente (ErrorLogin) che rappresenta una piccola finestra con un messaggio di errore alla pagina.
|
|
Style
|
top
|
Molto importante in un'applicazione web è l'aspetto grafico della pagina.
I fogli di stile (CSS) ci hanno sempre aiutato a centralizzare la gestione dello stile della pagina html (o jsp). In Echo ciò non può avvenire perchè....non ci sono pagine html o jsp!!!
Lo stile ad un'applicazione Echo si definisce in modo programmatico, implementando 2 interfacce: Style e StyleSheet. MutableStyle è una classe che implementa l'interfaccia Style, possiamo definire tramite quest'oggetto lo stile di un componente. Ad esempio:
MutableStyle buttonStyle = new MutableStyle(); buttonStyle.setProperty( AbstractButton.PROPERTY_BACKGROUND, Color.GREEN); buttonStyle.setProperty( AbstractButton.PROPERTY_BORDER, new Border(2, Color.GREEN, Border.STYLE_GROOVE));
Button button1 = new Button("Alpha"); button1.setStyle(buttonStyle); parentComponent.add(button1);
Con questo codice stiamo creando uno stile per un Button che avrà il background di colore verde e un bordo con lo stile GROOVE. Possiamo anche definire anche uno StyleSheet, ossia un insieme di Style, in modo da applicarlo all'intera applicazione.
Ad esempio:
Button button1 = new Button("Alpha"); button1.setStyleName("Default"); MutableStyleSheet styleSheet = new MutableStyleSheet(); styleSheet.addStyle(AbstractButton.class, "Default", buttonStyle); styleSheet.addStyle(AbstractButton.class, "Special", specialButtonStyle); styleSheet.addStyle(TextComponent.class, "Login", loginFieldStyle);
dove buttonStyle, specialButtonStyle e loginFieldStyle sono oggetti Style.
Quindi nel metodo init() della nostra applicazione possiamo scrivere:
window = new Window(); setStyleSheet(nostroStyleSheet);
e utilizzare gli stili contenuti nello stylesheet all'interno di tutti i componenti dell'applicazione.
|
|
Configurazione
|
top
|
Come ogni framework che si rispetti dobbiamo familiarizzare con i suoi file XML di configurazione....ma con Echo2 no!!!
Non ci sono per nulla file di configurazione, l'unico XML è il solito web.xml dove verrà mappata la servlet Echo.
Nella nostra applicazione il web.xml sarà:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>NewsApplication</display-name> <description> NewsApplication </description>
<servlet> <servlet-name>NewsApplication</servlet-name> <servlet-class>web20.echo2.news.NewsServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>NewsApplication</servlet-name> <url-pattern>/news</url-pattern> </servlet-mapping> </web-app>
e questa servlet verrà richiamata da un link nell'unica pagina HTML della nostra applicazione, index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Redirecting to application...</title> </head> <body> <p> <a href="news">Start application...</a> </p> </body> </html>
|
|
Database
|
top
|
|
ll database utilizzato per l'applicazione è HSQL, scritto completamente in java ed utilissimo da usare durante lo sviluppo di applicazioni come database di test.
Per questa applicazione ho utilizzato la modalità database su file, le tabelle usate sono 2:
- USERS, dove ci sono tutti gli utenti che hanno il ruolo di admin
- NEWS, dove ovviamente vengono memorizzate le news
|
|
Build e deploy
|
top
|
|
Adesso creiamo il nostro war e poi deployamo su tomcat.
Nella root del progetto abbiamo 2 file: build.xml e ant.properties in cui bisogna configurare alcune variabili per un corretto build dell'applicazione.
| project.name | Echo2 news | debug
| yes | servlet.lib.jar
| D:/apache_projects/apache-tomcat-5.5.17/common/lib/servlet-api.jar | | echo2.home | D:/java/NextApp_Echo2 | | echo2.app.lib.jar | ${echo2.home}/BinaryLibraries/Echo2_App.jar | echo2.webcontainer.lib.jar
| ${echo2.home}/BinaryLibraries/Echo2_WebContainer.jar | | echo2.webrender.lib.jar | ${echo2.home}/BinaryLibraries/Echo2_WebRender.jar | warfile
| Echo2.war | dir.src
| src | | dir.src.app | ${dir.src}/java | dir.src.htdocs
| ${dir.src}/htdocs | | dir.src.deploy | ${dir.src}/deploy | dir.build
| build | dir.war
| war |
Naturalmente i path usati nel file di configurazione sono personalizzabili.
Lanciamo ant per create la nostra applicazione:

Fig 3 - esecuzione del file Ant
e copiamo il file Echo2.war, creato nella directory war, all'interno della directory di deploy di tomcat, ossia in TOMCAT_HOME/webapps.
|
|
L'applicazione
|
top
|
|
Finalmente ora possiamo vedere in azione Echo2.
Lanciamo il server e scriviamo sul browser:
http://localhost:8080/echo2, ci apparirà questa pagina:

Fig 4 - Pagina di start
Nella pagina troveremo un link che punterà alla servlet e che ci istanzierà la nostra applicazione. Entriamo:

Fig 5 - il WindowPane
ci appare una finestra (il famoso WindowPane) in cui è possibile effettuare la login.
Da notare che possiamo muovere questa finestra per tutta l'area del browser.
Se vogliamo modificare le news ci autentichiamo come amministratori (admin/admin), altrimenti selezioniamo GUEST.
Entriamo come guest ed inseriamo una news cliccando sul tasto corrispondente:

Fig 6 - Inserisci una nuova news
Inseriamo una news e salviamola (icona verde ).

Fig 7 - finestra inserimento testo e salvataggio news
Notiamo che tutte queste operazioni vengono effettuate senza il refresh della pagina.
Si può provare ad inserire altre notizie e ad aprirle tutte nella stessa pagina. 
Fig 8 - vista dell' elenco dell news nella singola finestra
naturalmente il tutto ancora senza il refresh della pagina!

Fig 9 - vista dell' elenco delle news iin modalità estesa in tutta la pagina
|
|
Conclusioni
|
top
|
Questo framework permetterà a java di fare un passo un ulteriore passo nella direzione del Web 2.0.
I tempi di sviluppo sono davvero brevi e la curva di apprendimento è molto bassa, sopratutto per chi ha già una conoscenza delle SWING.
Il framework ha altri aspetti molto interessanti sicuramente da approfondire e affrontare, online è disponbile una documentazione accurata.
La community di Echo2 è già molto grande e questo è un aspetto positivo che aiuterà lo sviluppatore ad affrontare le problematiche che troverà durante lo sviluppo.
Infatti questo articolo non pretende di fornire tutte le informazioni riguardanti il framework, vuole solo dare al lettore le basi per poter meglio approfondirne la sua conoscenza.
|
|
|

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