Questo è il primo di una serie di articoli che ci aiuteranno a scoprire, pian piano, le caratteristiche di Java Server Faces (JSF), un framework java basato sul design pattern architetturale Model-View-Controller. Esistono diverse implementazioni del framework: oltre a quella Sun, sono disponibili anche le implementazioni di Apache (MyFaces) e di Oracle (ADF).
I vantaggi principali offerti dal framework sono i seguenti:
- JSF mette a disposizione dei componenti predefiniti
- JSF è basato sugli eventi. Gli eventi
- I componenti predefiniti sono considerati "intelligenti", cioè sono in grado di validare automaticamente i dati
- Molti ambienti di sviluppo, tra i quali Eclipse e NetBeans, presentano tool per la gestione visuale
In questo articolo introduttivo proponiamo un semplicissimo esempio per iniziare a prendere confidenza con il framework. Prevediamo una semplicissima pagina contenente un campo di testo, nel quale l'utente dovrà inserire il proprio nome, e un bottone per accedere al sistema. In seguito al click sul bottone, verrà mostrato un messaggio di benvenuto seguito dal nome dell'utente precedentemente inserito.
Utilizzeremo l'implementazione JSF della SUN, le cui librerie sono incluse in forma nativa nella versione 5.0 della J2EE.
Il cuore del framework è il file faces-config.xml, nel quale è possibile definire le regole di navigazione all'interno delle pagine dell'applicazione.
<?xml version="1.0" encoding="UTF-8"?>
<faces-config
Nella prima sezione del file abbiamo definito una vista. Ciascuna vista può avere differenti regole di navigazione. La regola che abbiamo definito può essere tradotta così: "se mi trovo nella pagina index.jsp
, e viene prodotta una action "benvenuto", allora viene caricata la vista welcome.jsp
, se invece viene prodotta una action "uscita", allora viene caricata la vista exit.jsp
.
Nella seconda parte del file abbiamo definito un bean, il cui nome logico è "utente". Questo bean, corrispondente alla classe IT.html.jsf.bean.UtenteBean
, potrà essere richiamato all'interno delle pagine jsp, con una sintassi del tipo #{utente.proprietà}
.
L'istanziamento, e la gestione di questo bean, è completamente a carico del framework. Naturalmente nella classe UtenteBean
devono essere definiti tutti i metodi getter e setter, rispettivamente per leggere e scrivere le proprietà del bean.
package IT.html.jsf.bean; public class UtenteBean { private String nome; public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }
Nel file web.xml
, della nostra applicazione, occorre configurare il framework JSF. È necessario definire, mediante il parametro javax.faces.CONFIG_FILES
, il path del file faces-config.xml
e occorre dichiarare la FacesServlet
e il suo relativo URL-pattern.
Nell'esempio utilizziamo la Servlet di default del framework, javax.faces.webapp.FacesServlet
, e impostiamo come pattern *.faces
. In questo modo tutte le richieste inviate alla nostra applicazione, che hanno come estenzione .faces, vengono intercettate dal framework JSF.
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> <servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/faces/index.jsp</welcome-file> </welcome-file-list> </web-app>
La versione standard di JSF prevede due taglibrary:
- core
- HTML
Ciascuna implementazione di JSF mette a disposizione differenti taglibrary, ma nell'esempio utilizzeremo soltanto quelle standard. Naturalmente, per utilizzare le taglibrary all'interno delle pagine jsp, è necessario importarle.
La pagina index.jsp, che contiene il form con il campo di testo è la seguente:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
Mediante la taglib core creiamo una vista (<f:view>
), mediante la taglib HTML creiamo un form (<h:form>
).
Il form contiene i seguenti elementi:
<h:outputText>
<h:inputText>
<h:commandButton>
<h:commandButton>
La pagina welcome.jsp, che contiene il messaggio di benvenuto, è la seguente:
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>..:: JSF Esempio::..</title>
</head>
<body>
<f:view>
<h:outputText value="Benvenuto" />
<h:outputText value="#{utente.nome}
Questa pagina contiene un semplice messaggio costituito da una parte statica e una parte dinamica, corrispondente al nome inserito precedentemente dall'utente.
L'URL da richiamare per testare la nostra applicazione è:
http://server_name port appname