In questo articolo si fornirà una dettagliata introduzione sul framework ZK, spiegando come si colloca nel panorama delle nuove tecnologie per il web e analizzando le differenze tra ZK e gli altri framework Web 2.0 che si trovano sul mercato. Nel prossimo articolo implementeremo un semplice “Hello World” mostrando come applicare il pattern MVC per scrivere pagine web ben strutturate e di facile manutenzione.
ZK è un Web Framework open source basato su componenti Ajax, scritto interamente in Java che permette di creare ricche interfacce grafiche per applicazioni web senza alcun bisogno di utilizzare il linguaggio JavaScript ne’ script Ajax. ZK è open source, e ha adottato di recente la licenza LGPL che permette di usarlo liberamente anche in ambito commerciale.
La parte centrale di ZK consiste in un meccanismo “event-driven” basato su oltre duecento componenti Ajax, e un linguaggio di mark-up (XUL/XHTML) usato per disegnare le interfacce grafiche.
Si integra con gran parte delle tecnologie Java EE esistenti sul mercato: Spring, Spring Web Flow, JBoss Seam, EJB, JSP e JSF sono solo degli esempi.
Caratteristiche principali di ZK
Dall’avvento di Internet a oggi, le applicazioni web si sono evolute moltissimo: da pagine statiche in HTML, a pagine dinamiche (DHTML), a pagine che fanno uso di plugin esterni come Java e Flash e, infine, a pagine che incorporano tecnologie Ajax (Asynchronous JavaScript and XML) [1] [3].
L’importanza di Ajax risiede nella possibilità di sviluppare pagine web che abbiano la stessa interattività delle applicazioni desktop senza doversi integrare con plugin proprietari e quindi senza dover utilizzare alcuna virtual machine all’interno di una pagina web.
Ajax si basa fortemente su JavaScript per gestire gli eventi lanciati dall’interfaccia grafica mediante interazione dell’utente e per manipolare l’interfaccia stessa. Quindi la domanda che ci dobbiamo porre è: come integrare la tecnologia Ajax nei nostri siti web? Nel mondo Java/J2EE esistono già diversi framework che permettono di integrare facilmente componenti Ajax, in particolare esistono framework basati sullo standard JSF; altri invece sono framework proprietari come GWT o Echo2. Ma a, differenza di tutti questi, ZK è particolarmente semplice e intuitivo da imparare e utilizzare [2]:
In sintesi, ZK:
- definisce un linguaggio dichiarativo XML (ZUML) per le interfacce grafiche (View) che risulta essere estremamente intuitivo e molto meno prolisso del corrispondente linguaggio XML usato dallo standard JSF;
- è basato su lancio di eventi e sull’utilizzo di componenti: in questa maniera permette di utilizzare lo stesso modello di programmazione usato nelle applicazioni desktop anche per le applicazioni web;
- si integra in maniera trasparente con Spring, Spring Web Flow, Spring Security, Jboss Seam, JSP, JSF, Flash plugin, EJB;
- è server-centrico: questo vuol dire che tutti i componenti grafici vengono creati sul server e quindi permette una più facile comunicazione tra componenti direttamente sul lato server;
- le interfacce grafiche sono personalizzabili tramite CSS;
- Comet server push, drag-and-drop, context menu (pop-up menu) sono presenti nei componenti grafici;
- permette di gestire i bookmark, è compatibile con SEO (Search Engine Optimization);
- presenta numerosi componenti di terze parti come: JFreeChart, JasperReports, Google Maps, FCKeditor, Timeline, Timeplot, ExtJS, Dojo;
- ZK Script: è possibile scrivere il codice di script che lega la parte business con la parte vista in molti linguaggi: Java, JRuby, Groovy, JavaScript ma anche Python e PHP.
- è disponibile un ottimo editor WYSIWYG (plugin per Eclipse) per disegnare e avere una preview delle pagine che si stanno scrivendo;
- last but not least: ZK funziona anche su Mobile, e in particolare su Android e BlackBerry.
Chi sviluppa e gestisce ZK
ZK è un framework ideato, progettato e manutenuto dalla società Potix di Taiwan. È una giovane società di 20 dipendenti, si occupa di consulenza per aziende che necessitano di sviluppare applicazioni per il web; è stata fondata da Tom Yeh e Henri Chen che lavorano assieme sin dai primi anni Novanta.
Tra gli investitori di Potix segnaliamo iD Innovation (di proprietà Acer) e Asus [4].
Chi usa ZK
ZK è largamente usato nel web. Il sito di ZK conta più di un milione di download in tre anni di vita; tra i propri clienti la Potix annovera una larga varietà di società private e istituzionali, dalle più piccole alle più grandi tra cui: Barclays, Sun Microsystems, Swiss Re, Oracle, Societe’ Generale, Alcatel-Lucent, State Grid, MMC, China Southern Power Grid che sono degli esempi di clienti che fanno parte di Fortune 500.
Come si posiziona nel mondo delle tecnologie per il Web
ZK è solo uno dei tanti framework nati per facilitare lo sviluppo di applicazioni per il Web 2.0.
Possiamo suddividere i framework per il web in due categorie:
- framework che sfruttano la nuova tecnologia Ajax, cioè permettono di scrivere quelle applicazioni web che forniscono uno spiccato livello di interazione sito-utente senza l’utilizzo di alcun plugin;
- framework che sfruttano invece applet come Adobe Flex, ma anche Java Applet e le nuovissime Java FX.
Seguendo la filosofia degli ideatori di ZK, le applicazioni web dovrebbero sfruttare al meglio la tecnologia JavaScript in modo tale da permettere agli utenti di interagire velocemente con un’applicazione web senza dover ricorrere a una virtual machine esterna al browser.
ZK permette agli sviluppatori di programmare direttamente le interfacce grafiche (aggiungere connessioni a un database o web services, manipolare la struttura della vista, etc.), senza utilizzare direttamente le librerie JavaScript.
Inoltre i dati vengono visualizzati sul web direttamente dal modello e la vista viene aggiornata automaticamente quando occorre.
Tutto questo prende il nome di Direct RIA (Rich Internet Application): programmare con ZK è facile e diretto quanto programmare una interfaccia grafica per una applicazione desktop.
Differenze e analogie con gli altri framework Java per il Web 2.0
ZK vs. GWT
GWT è un framework sviluppato da Google [5] che permette di scrivere applicazioni RIA basate su JavaScript direttamente in codice Java (ma senza usare tutto il Runtime Environment).
Sostanzialmente la filosofia di GWT prevede di compilare il codice Java in codice JavaScript e di distribuire direttamente il codice JavaScript compilato.
L’ultima versione di GWT permette di interpretare automaticamente il codice Java senza necessariamente compilarlo: in questa maniera si distribuisce direttamente il compilato Java e non il puro codice JavaScript.
A prima vista i due framework sembrano molto simili: entrambi sfruttano la stessa idea di “liberare” il programmatore Java dalla necessità di scrivere codice in JavaScript, liberandolo quindi dall’incombenza di scrivere codice poco manutenibile e potenzialmente non compatibile con tutti i maggiori browser.
Ma se si guardano più da vicino le due scelte architetturali si noterà una grossa differenza: ZK costruisce le interfacce grafiche sul lato server, mentre le GWT effettuano le stesse operazioni sul lato client.
Come si vede in figura 2, ZK è composto da due parti principali: ZK Client Engine e ZK Update Engine. La parte Client gira sul browser, mentre l’altra sul server. La parte client e la parte server lavorano come farebbero un “lanciatore” e un “ricevitore”: gli eventi vengono generati e lanciati dalla parte client al server per elaborare un algoritmo che modifica l’interfaccia grafica e poi rilancia alla parte client per aggiornare il DOM nel browser.
GWT invece:
- costruisce e lancia eventi solo sul lato client;
- non usa un linguaggio XML dichiarativo che descrive concisamente le interfacce grafiche;
- si integra difficilmente con codice già esistente ed è possibile farlo solamente con il meccanismo di RPC;
- il supporto di binding di dati in ZK è più semplice e potente, inoltre ZK si integra facilmente con un contenitore EJB (JBoss) o con Spring Framework.
In generale avere a disposizione la possibilità di elaborare gli eventi sul lato server permette al programmatore di utilizzare interamente il runtime environment di Java e inoltre anche tutte le librerie incluse nel server. Questo vantaggio è impossibile nelle architetture client-centriche.
ZK non solo offre la possibilità di scrivere degli script in Java (mediante BenShell), ma addirittura offre supporto anche per linguaggi di script con Groovy, JRuby, Python e PHP.
L’architettura server-centrica comporta due aspetti:
- L’applicazione gira interamente sul server: questo permette di scrivere molte meno righe di codice e di utilizzare tutte le strutture dati e librerie scritte Java, quindi molto più “comode” e manutenibili. In sostanza si diventa più produttivi.
- L’applicazione web elaborerà qualsiasi evento dell’utente sul server (i componenti Ajax integrati dentro ZK vengono sempre elaborati sul client), quindi si perde di efficienza rispetto ad altri framework client-centrici.
L’aspetto negativo della scelta architetturale server-centrico risiede nelle performance (a meno che non usiate la libreria JavaScript di ZK e quindi il JavaScript come linguaggio di script, e allora tutte le elaborazioni vengono fatte sul client, ma si renderà il codice meno manutenibile).
Il problema verrà analizzato durante il confronto con le JSF, in cui vedremo non solo le similitudini e le differenze architetturali, ma anche le differenze di performance e il consumo di memoria.
ZK vs. JSF
I due framework sono molto simili e sono entrambi degli ottimi strumenti per il Web 2.0. Le JSF sono uno standard della Sun largamente usato; implementano un modello di programmazione basato su eventi, orientato a componenti che ne permette una facile estensione da parte di chi volesse arricchire le interfacce grafiche già presenti nello standard. Tutte queste caratteristiche hanno permesso la nascita di numerose estensioni come: RichFaces, IceFaces, PrimeFaces e altri [6].
La promessa delle JSF era quella di permettere ai programmatori di sviluppare siti web scalabili e con un rapido ambiente di sviluppo (come è già presente nel framework .Net). ZK ha gli stessi obiettivi ed ha anche molti concetti simili come i Backing beans, un linguaggio dichiarativo XML per l’interfaccia grafica e un modello ad eventi. Ma a differenza delle JSF offre i seguenti vantaggi:
- il vantaggio di poter scrivere meno codice rispetto alle JSF: date uno sguardo a “Google Maps Locator” implementato con ZK e con IceFaces nell’articolo [7], è un esempio di come una architettura server-side può venire in aiuto nella scrittura dell’applicazione web;
- il vantaggio di non doverlo integrare con librerie di terze parti che implementano componenti Ajax (ZK implementa già 200 componenti Ajax), ZK include componenti complicati come: Gmaps, un calendario, lo spread sheet di Excel, un menù “fish-eye”, etc.;
- non è necessario integrarlo con altre librerie che ne semplifichino il linguaggio di descrizione delle interfacce grafiche: il linguaggio che viene usato si chiama ZUML, è molto intuitivo e compatto (lavorando con le JSF spesso è conveniente integrarle con le Facelets[9]) e non impone al programmatore neanche la conoscenza dell’HTML;
- il vantaggio di disporre di un editor gratis WYSIWYG che vi permette di vedere in tempo reale tutte le modifiche che fate alla pagina web e inoltre anche l’autocompletamento nel file ZUML;
- il vantaggio di poter vedere in tempo reale i cambiamenti che vengono effettuati sul file ZUML anche quando tutta l’applicazione è distribuita nel container J2EE senza necessità di riavviare il server: basta solamente ricaricare la pagina web dal browser;
- il vantaggio di poter distribuire la propria applicazione anche per il mobile: per Android e BlackBerry;
- un meccanismo più flessibile e dinamico per il data binding e per la risoluzione di variabili (sono disponibili un variable resolver per Spring e uno JNDI per gli EJB).
Ambiente di sviluppo rapido
L’editor WYSIWYG di ZK è un plugin per Eclipse, si installa facilmente e permette la creazione di un progetto ZK basato su moderno server Java EE (almeno Tomcat 6).
Per utilizzarlo occorre:
- creare un progetto ZK scegliendo un contenitore Java EE preventivamente installato (in questo caso Tomcat 6);
- l’editor è già disponibile per la pagina iniziale di esempio.
Figura 5 – Editor WYSIWYG di ZK.
ZK vs. JSF: Analisi delle performance
Questo aspetto è cruciale per decidere definitivamente sulla bontà di un framework Web 2.0. Gli ideatori di ZK hanno effettuato degli studi sul proprio prodotto e lo hanno confrontato le prestazioni dei loro concorrenti. A tal proposito richiamiamo due articoli pubblicati su Java Lobby in cui si apre un dibattito [8] su quale framework sia più veloce.
Il primo articolo è stato pubblicato dagli autori di ZK che descrivono i risultati dei seguenti scenari di test: Vengono effettuati rispettivamente 3 test di performance e 3 test di consumo di memoria su questi scenari:
- immissione di dati in una form di 3 elementi (nome, password e commenti);
- visualizzazione di una griglia di 15 elementi;
- visualizzazione di una griglia di 150 elementi.
Mentre l’articolo pubblicato dagli autori di ZK riporta dei risultati di IceFaces alquanto deludenti; gli autori di IceFaces pubblicano un secondo set di risultati correggendo le performance del proprio prodotto a livelli simili a quelli di ZK (gli autori di ZK non avevano ben ottimizzato IceFaces, la configurazione che ottimizza il prodotto non sembra comunque ben documentata).
Leggendo ambedue gli articoli risulta che i due framework non hanno grosse differenze di performance e, per quanto riguarda il consumo di memoria, ZK sembra essere più leggero. In ogni caso i due grafici non ci sembrano così diversi da poter farci scegliere l’uno a discapito dell’altro. Le considerazioni che possiamo fare sui due studi effettuati sono: ZK risulta essere un framework che consuma poca memoria e che non risente la lentezza propria di un framework server-centrico.
Come mia considerazione vorrei aggiungere che, se le performance sono così importanti, e se il sito che occorre sviluppare deve servire milioni di connessioni contemporaneamente, allora forse vale la pena investire sulle tecniche di cloud-computing che risolvono questi problemi efficacemente, invece di ricercare il web framework più veloce e leggero in assoluto.
La scelta del framework da usare per scrivere la propria applicazione web dovrebbe ricadere su quello che ci piace di più, che ci permette di completare il nostro lavoro nel minor tempo possibile e contemporaneamente di produrre un ottimo lavoro.
Conclusioni
La promessa di ZK è quella di poter scrivere siti Web 2.0 in modo semplice e veloce, con poca manutenzione e con poco sforzo in fase di apprendimento. Da questo punto di vista ZK assolve appieno il suo compito: se vi metterete a sperimentare un po’ con questo framework vi accorgerete che è ottimo per scrivere velocemente siti web, per fare prototipi, e inoltre la manutenzione è minima perchè la quantità di righe di codice che occorre scrivere è molto bassa.
Noterete che il linguaggio ZUML è facile da apprendere e utilizzare, che il plugin ZK per Eclipse vi permette di disegnare la grafica delle pagine vedendo in tempo reale le modifiche effettuate. Inoltre ZK si integra facilmente con i framework Java EE più adatti all’implementazione della logica “business” di un sito web, come possono essere gli EJB o Spring, ma è anche possibile integrarlo direttamente con Hibernate. ZK implementa anche lo standard JSF con il proprio pacchetto di integrazione.
I punti di forza di ZK non tolgono certamente nulla a JSF o a GWT, ma evidenziano come ZK sia uno degli strumenti migliori nel mondo Web 2.0: la sua facilità di apprendimento e di uso, la sua notevole flessibilità e la possibilità di essere integrato con JSF, di funzionare anche sui palmari e di disporre di complicati componenti Ajax pronti all’uso ne fanno sicuramente un ottimo strumento da tenere in considerazione.
Nel prossimo articolo vedremo più da vicino ZK sviluppando un semplice programma “Hello World!” seguendo uno dei pattern più usati nel mondo Java EE per scrivere applicazioni web: il pattern MVC.
Riferimenti
[1]Henri Chen , Robbie Cheng , “ZK: Ajax without the JavaScript Framework”, Apress Com, 2007, ISBN10: 1-59059-901-2
http://www.apress.com/book/view/1590599012
[2] JavaLobby, “ZK vs. Ajax JSF Components: Simplicity Matters!”, 2008
http://java.dzone.com/articles/zk-vs-ajax-jsf-components-simp-0
[3] ZK team, “ZK Home Page”
http://www.zkoss.org/
[4] Informazioni sulla società Potix
http://www.linkedin.com/companies/potix-corporation
[5] GWT Home page
http://code.google.com/intl/it-IT/webtoolkit/
[6] Esempi di estensioni delle JSF: Prime Faces, Rich Faces, Ice Faces, My Faces
http://primefaces.prime.com.tr/en/
http://www.jboss.org/richfaces
http://www.icefaces.org/main/home/
http://myfaces.apache.org/
[7] Differenze tra ZK e JSF
http://www.zkoss.org/smalltalks/zkIcefaces/
[8] Dibattito sulle performance tra ZK e IceFaces frameworks
http://ria.dzone.com/articles/performance-report-server-side
http://java.dzone.com/articles/icefaces-performance-report
[9] Facelets
https://facelets.dev.java.net/