PrimeFaces è una suite open source utilizzabile con il framework JavaServer Faces 2.0, esplicitamente pensata per realizzare i componenti presentazionali di una applicazione web enterprise: editor HTML, finestre di dialogo, meccanismi per l'auto-completamento, grafici e calendari, drag & drop, integrazione di mappe google e molto altro.
La suite offre supporto sia ad ajax che al rendering parziale delle pagine web, grazie ad una integrazione nativa con jquery. L'aspetto grafico dei componenti si basa su JQuery UI: è quindi possibile personalizzarlo attraverso lo skin framework Theme Roller, o utilizzare un discreto insieme di temi predefiniti. Da segnalare infine la presenza di uno User Interface Kit per la realizzazione di applicazioni Web orientate ai dispositivi mobili (iPhone, Android, etc.), di semplice e veloce configurazione.
Una rubrica dei contatti con PrimeFaces
Vogliamo implementare una piccola applicazione Web per la gestione di una classica agenda di contatti. Prima di entrare nei dettagli realizzativi, definiamo tutto ciò che occorre per l'ambiente di sviluppo:
| Librerie/framework utilizzati per l'esempio | |
|---|---|
| PrimeFaces 2.2.1 | JSF Mojarra 2.0.4 |
| JBoss Developer Studio 4.0.0.cr1 | GlassFish Application Server |
| iText | Apache POI |
| PostgreSQL | JDBC per PostgreSQL |
| Parametri di connessione a JDBC | |
|---|---|
| Proprietà | Valore |
| portNumber | 5432
|
| databaseName | PrimeFacesDb
|
| datasourceName | PrimeFacesDemoDS
|
| serverName | 127.0.0.1
|
| user | postgres
|
| password | postgres
|
Salviamo tutto e, tornando nella tab General definire un collegamento JNDI JDBC Resources
verrà visualizzata una pagina simile alla seguente:
Cliccando su New
jdbc/PrimeFacesDemo
(clic per ingrandire)

Una rubrica dei contatti con PrimeFaces: il progetto J2EE in Glassfish
In Jboss Developer Studio creiamo un progetto J2EE Enterprise (enterprise application project) con nome PrimeFacesDemoEAR al quale legheremo i successivi due progetti JSF e JPA. Creato il progetto enterprise, proseguiamo con un nuovo progetto JSF 2:
Nel wizard di creazione del progetto, facciamo attenzione a collegare il nostro EAR. Diamo un nome al progetto, ad esempio PrimeFacesDemo, scegliamo la versione 2.0 del framework in JSF Environment e scegliamo la location del progetto oppure lasciamo il percorso di default con un check su Use default path. Scegliamo poi la versione servlet da utilizzare, 2.5 o 3 , impostiamo il runtime per GlassFish 3.1 (Se l'adapter per il server non dovesse comparire nella lista, scarichiamolo attraverso il link Download additional adapters) e facciamo in modo che punti alla directory di installazione:
Al termine della creazione del progetto inseriamo in WEB-INF/lib
primefaces-2.2.1.jar
.jar
Affinchè PrimeFaces funzioni correttamente è necessario definire nel web.xml
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.primefaces.resource.ResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/primefaces_resource/*</url-pattern>
</servlet-mapping>
e siccome stiamo utilizzando una versione di mojarra 2.0 anche il seguente parametro
<context-param>
<param-name>com.sun.faces.allowTextChildren</param-name>
<param-value>true</param-value>
</context-param>
queste operazioni completano l'aspetto di configurazione della libreria. Sebbene sia possibile utilizzare pagine jsp, dalla versione 2.0 di JSF l'uso di esse è divenuto deprecato: faremo quindi uso delle facelets per comporre le pagine xhtml. Configuriamo quindi il mapping sulla Faces Servlet all'interno del file web.xml, ad esempio nel modo seguente:
<context-param>
<description>
The default suffix for extension-mapped resources that contain JSF components. Default is '.jsp'.
</description>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtm</url-pattern>
</servlet-mapping>
Le nostre pagine saranno salvate con estensione .xhtml raggiungibili con .xhtm
<!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3c.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>...</h:head>
<h:body>
...
</h:body>
</html>
Si tratta di una pagina xhtml in cui vengono importati i tag del framework JSF e della libreria PrimeFaces.
PrimeFaces fornisce dalle funzionalità particolarmente per la costruzione di tabelle, tra cui
- Paginazione
- Selezione singola di un record
- Selezione multipla di record
- Lazy Loading, ovvero la possibilità di caricare soltanto un sottoinsieme alla volta del numero di record totale
- Selezione della singola cella
- Ordinamento sulle colonne
Realizziamo quindi un esempio sfruttando questo componente. Immaginiamo di avere una tabella di contatti con i campi Nome, Cognome, Telefono, Mail e Professione
Il componente dataTable istant ajax rerender
Una rubrica dei contatti con PrimeFaces: il progetto JPA
Dopo aver definito il progetto JSF PrimeFacesDemo, creiamo un progetto JPA con nome PrimeFacesDemoJPA. Dobbiamo fare attenzione ad utilizzare la versione JPA dell'application server, perciò esaminiamo questi passaggi del wizard di creazione del progetto:
Selezioniamo il nostro target runtime. In EAR membership aggiungiamo il progetto all'enterprise application project già creato nella schermata finale scegliere Hibernate (JPA 2.x).
Terminata la creazione del progetto, editiamo il file persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="PrimeFacesDemoJPA">
<jta-data-source>jdbc/PrimeFacesDemo</jta-data-source>
</persistence-unit>
</persistence>
in questo modo definiamo una persistence unit collegata al database configurato in Glassfish precedentemente. Abbiamo una sola tabella e quindi dobbiamo creare l'entity JPA primefaces.demo.jpa
@Entity
@Table(name="contatti")
@SequenceGenerator(name="CONTACT_SEQUENCE_GENERATOR", sequenceName="contatti_id_seq",allocationSize=1,initialValue=1)
public class Contact implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CONTACT_SEQUENCE_GENERATOR")
private Integer id;
private String cognome;
private String nome;
private String professione;
private String telefono;
public Contact() {...}
// metodi get e set...
}
contatti_id_seq
Una Rubrica dei contatti con PrimeFaces: le pagine di visualizzazione
Iniziamo qui con la realizzazione della pagina dataTable.xhtml. In questa pagina trovano spazio diversi componenti primefaces:
- dataTable per la visualizzazione della lista dei record
- panel per la decorazione con pannello dotato di header
- dialog per la visualizzazione delle interfacce di inserimento/modifica record
- grow per la visualizzazione di messaggi di notifica
Come detto precedentemente si tratta di una pagina conforme allo standard xhtml e deve quindi necessariamente avere la seguente forma generale:
<html xmlns="http://www.w3c.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
<h:head>...</h:head>
<h:body>
...
<h:body>
</html>
datatable: la lista dei record
In allegato all'articolo sono disponibili i sorgenti degli applicativi nei quali trovare l'intera pagina, qui concentriamoci sulle parti più importanti iniziando dalla datatable (clicca per visualizzare il codice). Si tratta del componente che utilizziamo per visualizzare la lista dei record, analizziamo uno ad uno gli attributi della dataTable utilizzati:
| attributo | descrizione |
|---|---|
| var | rappresenta la variabile di iterazione; ad ogni step del ciclo contiene l'oggetto relativo al contatto corrente della lista contacts definita nel bean ContactsBean |
| value | il collegamento con la lista contacts del bean ContactsBean i cui oggetti desideriamo visualizzare nella dataTable |
| selection | contiene gli oggetti Contact selezionati dalla lista attraverso il dataTable |
| selectionMode | permette di impostare la selezione singola o multipla |
| paginator | attiva o disattiva la paginazione per la tabella |
| rows | numero di record per pagina |
| update | aggiorna lo stato di un componente il cui id è specificato come valore al termine di una richiesta ajax |
| onselectComplete | al termine della richiesta ajax indica quale operazione compiere |












