Cosa è ZK framework

Cosa è ZK framework

Cosa è ZK Framework

ZK Framework è una soluzione open source basata su Java per lo sviluppo di applicazioni web enterprise con interfacce utente ricche e interattive. Nato nel 2005 con l’obiettivo di semplificare lo sviluppo di Rich Internet Applications (RIA), ZK si distingue per il suo approccio “Ajax senza JavaScript”, consentendo agli sviluppatori di creare applicazioni web moderne utilizzando esclusivamente Java, senza la necessità di conoscere tecnologie frontend come JavaScript, AJAX o WebSocket.

Storia e filosofia del framework

ZK Framework è stato rilasciato per la prima volta nel 2005 dalla Potix Corporation ed è diventato rapidamente un riferimento nel settore per le sue innovazioni tecnologiche. Il framework è stato il primo a supportare il pattern MVVM (Model-View-ViewModel) in ambiente Java, il primo a offrire una soluzione responsive cross-platform (write once, run everywhere), e il primo a introdurre l’architettura Server+Client Fusion. Oggi, con la versione 10.2.1 rilasciata a luglio 2025, ZK continua a evolversi mantenendo la sua filosofia di produttività e semplicità.

Open source e licensing – Cosa è ZK framework

ZK è disponibile in due versioni: ZK CE (Community Edition) e ZK EE (Enterprise Edition). La versione Community Edition è rilasciata sotto licenza LGPL, rendendola liberamente disponibile sia per progetti open source che commerciali. Questa scelta riflette la filosofia di Potix Corporation secondo cui l’open source rappresenta il modo migliore per costruire software sicuro, trasparente e affidabile. La versione Enterprise Edition, invece, offre funzionalità avanzate e supporto professionale per progetti mission-critical.

Architettura e approccio server-centric

L’architettura di ZK si basa su un approccio server-centric con la possibilità di sfruttare anche il lato client quando necessario (Server+Client Fusion). In questo modello, tutta la logica di business viene eseguita sul server, mentre il client si limita a renderizzare l’interfaccia utente. Il framework gestisce automaticamente la sincronizzazione dei componenti e il flusso degli eventi tra client e server, rendendo completamente trasparente agli sviluppatori la complessità della comunicazione AJAX.

A differenza del tradizionale meccanismo request-response del web, ZK non invia i campi dei form tramite GET o POST. Invece, utilizza richieste AJAX per aggiornare lo stato interno di ogni widget dell’interfaccia. Il browser scarica una descrizione JSON della pagina web e utilizza un renderer client per trasformarla in UI. Questa architettura risulta molto efficiente: analizzando il traffico tra client e server, si osservano diverse richieste che vanno avanti e indietro fino al completamento del rendering della pagina.

Dal lato client, ZK Client Engine si basa su jQuery, sfruttando le risorse di questa libreria diffusa e beneficiando del supporto di milioni di sviluppatori nella community. L’architettura Server+Client Fusion, introdotta dalla versione 5.0, consente agli sviluppatori di accedere direttamente ai widget client-side quando necessario, offrendo la flessibilità di lavorare direttamente con i componenti basati su jQuery per migliorare ulteriormente l’esperienza utente.

Componenti UI e ZUML – Cosa è ZK framework

ZK mette a disposizione oltre 200 componenti Ajax pronti all’uso, tra cui oltre 123 componenti basati su XUL e 83 componenti XHTML. Questi componenti coprono diverse esigenze UI come layout, input, visualizzazione dati, calendari, tabelle pivot e fogli di calcolo. Ogni componente può essere configurato in termini di stile, comportamento e funzionalità secondo le specifiche esigenze dell’applicazione.

L’interfaccia utente viene definita tramite ZUML (ZK User Interface Markup Language), un linguaggio di markup che rende la progettazione di interfacce ricche semplice come scrivere pagine HTML. ZUML è una variante di XUL che eredita tutte le caratteristiche disponibili per XML e separa la definizione dell’UI dalla logica runtime. I componenti possono essere riutilizzati come macro componenti, e gli sviluppatori possono creare nuovi controlli UI personalizzati estendendo il framework.

Pattern MVC e MVVM

ZK supporta nativamente diversi pattern architetturali per lo sviluppo di applicazioni: Model-View-Controller (MVC), Model-View-Presenter (MVP) e Model-View-ViewModel (MVVM). Il pattern MVVM è particolarmente raccomandato e rappresenta una delle innovazioni più significative introdotte da ZK.

Nel pattern MVVM, l’applicazione è divisa in tre parti: il Model contiene i dati e le regole di business, la View rappresenta l’interfaccia utente (pagine ZUL con componenti ZK), e il ViewModel è responsabile di esporre i dati del Model alla View e fornire le azioni richieste dalla View. Il ViewModel è un’astrazione della View che contiene lo stato e il comportamento della vista, ma non deve contenere alcun riferimento ai componenti UI.

ZK gestisce automaticamente la comunicazione e la sincronizzazione dello stato tra View e ViewModel tramite un componente chiamato Binder. Quando un utente interagisce con i componenti, gli eventi vengono inviati al server e il Binder invoca i metodi comando corrispondenti nel ViewModel. Il ViewModel accede ai dati dal Model e aggiorna le proprie proprietà, quindi il Binder ricarica le proprietà modificate per aggiornare lo stato dei componenti.

La creazione di un ViewModel in ZK è semplice come creare un POJO (Plain Old Java Object). Il ViewModel espone il suo stato come proprietà JavaBean tramite metodi getter e setter. Le annotazioni di data binding in ZUML, come @load, @save e @command, automatizzano le operazioni CRUD e la sincronizzazione dello stato tra la vista UI e i dati, eliminando la necessità di scrivere codice boilerplate.

Operazioni CRUD e data binding

ZK offre potenti capacità di data binding tramite annotazioni che possono essere dichiarate direttamente nelle pagine ZUML. Questo meccanismo automatizza le operazioni CRUD (Create, Read, Update, Delete) e la sincronizzazione dello stato tra la vista e i dati POJO.

Le annotazioni principali includono: @init per caricare i dati una sola volta all’inizializzazione, @load per caricare i dati dal ViewModel ogni volta che vengono aggiornati, @save per salvare i dati dall’UI al ViewModel quando l’utente modifica un valore, e @command per invocare metodi comando nel ViewModel in risposta a eventi utente.

Il data binding di ZK supporta direttamente oggetti Java e gestisce in modo trasparente la trasmissione dei dati tra client e server, eliminando la necessità per gli sviluppatori di gestire manualmente questi aspetti.

Navigation e Template

ZK supporta diversi approcci per la navigazione tra le pagine. Il metodo più semplice è utilizzare Executions.sendRedirect() per reindirizzare l’utente a una nuova pagina. Per applicazioni più complesse, ZK permette di implementare sistemi di navigazione basati su template, dove una pagina principale (layout) contiene aree dinamiche che vengono popolate con contenuti diversi in base alla navigazione dell’utente.

I template in ZK vengono definiti usando il tag <template> all’interno di componenti come <listbox> o <grid> per specificare come renderizzare ciascun elemento di una collezione. Il framework fornisce variabili implicite come each per accedere all’elemento corrente durante l’iterazione.

Autenticazione e sicurezza

ZK offre meccanismi robusti per implementare l’autenticazione e proteggere le pagine da accessi non autorizzati. L’approccio base prevede la memorizzazione delle credenziali utente nella sessione HTTP dopo un login riuscito. ZK fornisce la classe Session come wrapper di HttpSession, permettendo di memorizzare i dati dell’utente durante la gestione degli eventi.

Per proteggere le pagine dall’accesso illegale, ZK offre il meccanismo degli Initiator. Un Initiator è una classe che implementa l’interfaccia org.zkoss.zk.ui.util.Initiator e viene invocata prima della creazione dei componenti. È possibile creare un Initiator che verifica la presenza delle credenziali utente nella sessione e, se assenti, reindirizza l’utente alla pagina di login.

ZK protegge le applicazioni da attacchi XSS (Cross-Site Scripting), DoS (Denial of Service) e CSRF (Cross-Site Request Forgery). Inoltre, ZK rafforza l’autenticazione e l’autorizzazione attraverso l’integrazione con framework di sicurezza di terze parti come Spring Security, offrendo una soluzione completa e enterprise-ready per la gestione della sicurezza applicativa.

Integrazione con Spring Framework

L’integrazione con Spring Framework è uno dei punti di forza di ZK. ZK supporta l’iniezione delle dipendenze Spring attraverso diversi meccanismi. Il modo più semplice consiste nell’utilizzare il DelegatingVariableResolver che permette di referenziare bean Spring direttamente nelle pagine ZUML utilizzando il loro bean ID.

Per un’integrazione più avanzata, ZK fornisce l’annotazione @WireVariable che consente di iniettare automaticamente i bean Spring nei composer o ViewModel. Quando si applica un SelectorComposer a una pagina ZUL con il DelegatingVariableResolver, è possibile utilizzare @WireVariable su campi membro per iniettare i bean Spring corrispondenti.

ZK fornisce anche ZK Spring Boot Starter, un progetto che semplifica l’integrazione di ZK con Spring Boot. Questo starter configura automaticamente ZK all’interno di applicazioni Spring Boot, gestendo la registrazione dei servlet, la configurazione delle risorse e l’integrazione con l’ecosistema Spring. Lo starter supporta proprietà di configurazione come zk.homepage, zk.zul-view-resolver-enabled, e configurazioni per WebSocket e server push.

È consigliabile applicare scoped-proxy sui bean utilizzati nei composer o ViewModel per garantire la corretta serializzazione durante la replica delle sessioni in ambienti di clustering.

Integrazione con JPA

ZK si integra perfettamente con JPA (Java Persistence API) per la gestione della persistenza dei dati. L’integrazione tipica prevede l’uso di Spring per gestire l’EntityManager e le transazioni. La configurazione richiede le dipendenze Maven per Spring ORM, Hibernate (o altro provider JPA), e il driver del database.

Un aspetto critico nell’integrazione JPA con ZK è la gestione delle relazioni lazy-loaded. Quando si utilizzano collezioni lazy-loaded in entità JPA, è necessario applicare il pattern entitymanager-per-request per evitare LazyInitializationException. Questo pattern mantiene l’EntityManager aperto per tutta la durata della richiesta HTTP, permettendo l’accesso alle collezioni lazy-loaded anche durante il rendering della vista.

Spring fornisce OpenEntityManagerInViewFilter che implementa questo pattern. Il filtro deve essere configurato nel web.xml con un url-pattern che copra tutte le pagine che accedono a oggetti lazy-loaded, incluso il path /zkau/* per le richieste AU di ZK.

Nel persistence.xml si definisce la persistence unit, mentre nella configurazione Spring si definiscono il DataSource, l’EntityManagerFactory e il TransactionManager. Le annotazioni JPA vengono utilizzate per mappare le classi entità, e Spring gestisce automaticamente le transazioni tramite l’annotazione @Transactional.

Esempio pratico: applicazione ToDo List – Cosa è ZK framework

Ecco un esempio pratico di creazione di una semplice applicazione ToDo List con ZK Framework utilizzando il pattern MVVM:

TodoItem.java (Model)

public class TodoItem {
    private int id;
    private String subject;
    private boolean complete;
    
    public TodoItem(int id, String subject) {
        this.id = id;
        this.subject = subject;
        this.complete = false;
    }
    
    // Getters e setters
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    public String getSubject() { return subject; }
    public void setSubject(String subject) { this.subject = subject; }
    public boolean isComplete() { return complete; }
    public void setComplete(boolean complete) { this.complete = complete; }
}

TodoListViewModel.java (ViewModel)

import org.zkoss.bind.annotation.*;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import java.util.*;

public class TodoListViewModel {
    private List<TodoItem> todoList = new ArrayList<>();
    private String newTodoSubject;
    private int nextId = 1;
    
    @Init
    public void init() {
        // Inizializzazione lista con dati esempio
        todoList.add(new TodoItem(nextId++, "Studiare ZK Framework"));
        todoList.add(new TodoItem(nextId++, "Sviluppare applicazione demo"));
    }
    
    @Command
    @NotifyChange({"todoList", "newTodoSubject"})
    public void addTodo() {
        if (newTodoSubject != null && !newTodoSubject.trim().isEmpty()) {
            todoList.add(new TodoItem(nextId++, newTodoSubject));
            newTodoSubject = "";
        }
    }
    
    @Command
    @NotifyChange("todoList")
    public void deleteTodo(@BindingParam("item") TodoItem item) {
        todoList.remove(item);
    }
    
    @Command
    @NotifyChange("todoList")
    public void toggleComplete(@BindingParam("item") TodoItem item) {
        item.setComplete(!item.isComplete());
    }
    
    // Getters e setters
    public List<TodoItem> getTodoList() { return todoList; }
    public String getNewTodoSubject() { return newTodoSubject; }
    public void setNewTodoSubject(String subject) { this.newTodoSubject = subject; }
}

todolist.zul (View)

<?page title="ToDo List con ZK Framework"?>
<zk>
    <window border="normal" width="600px" 
            apply="org.zkoss.bind.BindComposer"
            viewModel="@id('vm') @init('com.esempio.TodoListViewModel')">
        <caption label="La Mia ToDo List" iconSclass="z-icon-list-alt"/>
        
        <!-- Area input per nuove attività -->
        <hlayout spacing="5px">
            <textbox value="@bind(vm.newTodoSubject)" 
                     placeholder="Cosa devi fare?" 
                     width="400px"
                     onOK="@command('addTodo')"/>
            <button label="Aggiungi" 
                    onClick="@command('addTodo')"
                    iconSclass="z-icon-plus"/>
        </hlayout>
        
        <separator height="10px"/>
        
        <!-- Lista delle attività -->
        <listbox model="@load(vm.todoList)" 
                 emptyMessage="Nessuna attività in lista"
                 height="300px">
            <listhead>
                <listheader label="Completato" width="100px"/>
                <listheader label="Attività"/>
                <listheader label="Azioni" width="100px"/>
            </listhead>
            <template name="model">
                <listitem>
                    <listcell>
                        <checkbox checked="@bind(each.complete)"
                                  onCheck="@command('toggleComplete', item=each)"/>
                    </listcell>
                    <listcell>
                        <label value="@load(each.subject)"
                               style="@load(each.complete ? 'text-decoration:line-through' : '')"/>
                    </listcell>
                    <listcell>
                        <button label="Elimina" 
                                onClick="@command('deleteTodo', item=each)"
                                iconSclass="z-icon-times"/>
                    </listcell>
                </listitem>
            </template>
        </listbox>
    </window>
</zk>

Questo esempio dimostra i concetti chiave di ZK:

  • Separazione Model-View-ViewModel: il Model (TodoItem) contiene i dati, il ViewModel (TodoListViewModel) gestisce la logica, e la View (todolist.zul) definisce l’UI
  • Data binding bidirezionale: @bind sincronizza automaticamente i dati tra UI e ViewModel
  • Gestione eventi: @command invoca metodi nel ViewModel in risposta agli eventi utente
  • Notifica cambiamenti: @NotifyChange aggiorna automaticamente l’UI quando i dati cambiano
  • Componenti riutilizzabili: uso di componenti ZK standard come listbox, textbox, button

L’importanza della formazione del team

Come abbiamo visto, ZK Framework offre un ecosistema ricco e potente per lo sviluppo di applicazioni enterprise. Tuttavia, la sua corretta implementazione richiede una solida comprensione dei pattern architetturali (MVC/MVVM), delle best practice di integrazione con Spring e JPA, e dei meccanismi di sicurezza.

La formazione del team di sviluppatori è fondamentale per lavorare efficacemente sui progetti software e per evitare errori che possono creare danni significativi sul lavoro. Una comprensione superficiale del framework può portare a problemi di performance, vulnerabilità di sicurezza, difficoltà nella manutenzione del codice e costi di sviluppo più elevati. Investire nella formazione significa ridurre il technical debt, aumentare la produttività del team e garantire la qualità del software prodotto.

Formazione ZK Framework con Innovaformazione

Innovaformazione offre corsi di formazione professionale su richiesta per aziende IT, incluso un corso specifico su ZK Framework. La formazione viene erogata in modalità online in classe virtuale, con calendario da concordare in base alle esigenze aziendali.

Un vantaggio importante: è possibile accedere alla formazione finanziata dei dipendenti tramite Fondimpresa, con tutta la gestione della pratica curata interamente da Innovaformazione. Questo permette alle aziende di formare i propri team senza impatto sui budget formativi.

Contatti:

  • Email: info@innovaformazione.net
  • Tel: 3471012275 (Dario Carrassi)
  • Catalogo corsi QUI.

Conclusioni – Cosa è ZK framework

ZK Framework rappresenta una soluzione matura e affidabile per lo sviluppo di applicazioni web enterprise in Java. Con oltre 20 anni di storia, un’architettura innovativa Server+Client Fusion, supporto completo per pattern MVVM, e un’integrazione profonda con l’ecosistema Java (Spring, JPA, Hibernate), ZK continua a essere una scelta valida per team che desiderano massimizzare la produttività mantenendo alti standard di qualità e sicurezza.

La natura open source, la vasta documentazione disponibile, e il supporto di una community attiva rendono ZK una tecnologia accessibile anche per nuovi progetti. Tuttavia, come per ogni framework enterprise, il successo dipende dalla competenza del team di sviluppo: investire nella formazione è la chiave per sfruttare appieno le potenzialità di ZK e costruire applicazioni robuste e manutenibili.

(fonte) (fonte) (fonte) (fonte)

Per altri articoli tecnici di settore consigliamo di navigare sul nostro blog QUI.

Vuoi essere ricontattato? Lasciaci il tuo numero telefonico e la tua email, ti richiameremo nelle 24h:

    Ti potrebbe interessare

    Articoli correlati