Vai al contenuto

JavaServer Faces

Da Wikipedia, l'enciclopedia libera.
(Reindirizzamento da Java Server Faces)
JavaServer Faces
software
Logo
Logo
GenereFramework per applicazioni web
SviluppatoreEclipse Foundation
Ultima versione4.1.0 (5 giugno 2024)
Sistema operativoMultipiattaforma
LinguaggioJava
LicenzaEclipse Public License 2.0 e GPL linking exception
(licenza libera)
Sito webjakarta.ee/specifications/faces/

JavaServer Faces (JSF) è una tecnologia Java, basata sul design pattern architetturale Model-View-Controller (MVC), il cui scopo è quello di semplificare lo sviluppo dell'interfaccia utente (UI) di una applicazione web; può quindi essere considerata un framework per componenti lato server di interfaccia utente.

È descritta da un documento di specifiche (JSR 372[1]) alla cui stesura hanno partecipato i membri del Java Community Process. È interessante osservare che uno dei principali artefici di questa tecnologia è stato Craig R. McClanahan, allora dipendente di Sun Microsystems e creatore del popolare framework Struts. Di JavaServer Faces esistono alcune implementazioni: oltre a quella di Oracle, detta Mojarra JavaServer Faces[2]. Framework basati sulle jsf sono: PrimeFaces, BootsFaces[3], Icefaces e RichFaces[4].

Un applicativo Java Server Faces è composto da:

  • FacesServlet: è la servlet principale del framework, che deve essere aggiunta nel file web.xml;
  • configurazione: viene fatta attraverso il file faces-config.xml e le annotations;
  • pagine e componenti: è possibile usare questo framework con diversi Page Declaration Language (detti anche View Declaration Language), ma i Facelets sono quelli raccomandati a partire dalla versione 2.0 di JSF;
  • presentatori: si occupano di visualizzare agli utenti un componente e traducono i dati immessi dagli utenti in valori dei componenti;
  • convertitori: hanno il compito di convertire i valori dei componenti (che possono essere diversi tipi di dati: date, numeri, booleani, eccetera) da e verso le stringhe che verranno visualizzate;
  • validatori: si accertano che i valori immessi dagli utenti siano validi;
  • backing beans e navigazione: per backing bean si intende una classe Java che ha delle annotation che la rendono visibile ed utilizzabile all'interno del framework JSF. Tali classi contengono anche la logica operativa e gestiscono il flusso di navigazione da una pagina all'altra. Per trasformare una classe qualsiasi in un backing bean è sufficiente aggiungere le annotation @Named e @RequestScoped;
  • supporto per AJAX: a partire dalla versione 2.2 di JSF, c'è un supporto integrato per le chiamate AJAX;
  • linguaggio per le espressioni: tale linguaggio viene usato all'interno delle pagine JSF per agganciare le variabili e le azioni tra le pagine ed i backing bean.

FacesServlet è una classe che fa parte del framework ed implementa la specifica Servlet. Intercetta le richieste che arrivano al web server e gestisce tutto il ciclo di vita delle pagine e dei backing beans.

Affinché questa servlet possa svolgere il suo compito, è necessario aggiungerla al file web.xml del nostro applicativo web:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee web-app_4_0.xsd" version="4.0">
    <servlet>
        <servlet-name>facesServlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
</web-app>

Configurazione

[modifica | modifica wikitesto]

La configurazione può essere svolta mediante files XML o annotations.

Per effettuare la configurazione via XML, è possibile usare il file faces-config.xml, un esempio è il seguente:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd" version="2.3">
    <!-- Inserire qui eventuali configurazioni necessarie -->
</faces-config>

Un file che, invece, è necessario per attivare la componente Context and Dependency Injection, che si occupa dei backed beans, è beans.xml. Un esempio:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="all">
    <!-- Inserire qui eventuali configurazioni necessarie -->
</beans>

Le facelets hanno sostituito le Java Server Pages come tecnologia preferita per il lato view nella versione 2.0 di JSF, in quanto il ciclo di vita di una JSP è molto semplice, mentre il ciclo di vita di una facelet può essere molto elaborato.

Ecco un esempio di facelet che visualizza informazioni sul browser usato dall'utente:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>User agent</title>
    </h:head>
    <h:body>
        #{header["user-agent"]}
    </h:body>
</html>

Per backed bean si intende una classe visibile e modificabile all'interno del framework. Possiamo trasformare una qualunque classe in un backed bean. Ad esempio:

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@Named
@RequestScoped
public class BackedBeanExample {
  private String attributeName = "Default value";

  public String getAttributeName() {
    return attributeName;
  }

  public void setAttributeName(String attributeName) {
    this.attributeName = attributeName;
  }
}

Il listato qui sopra definisce un backed bean avente nome identico a quello della classe, ma con la prima lettera minuscola, quindi backedBeanExample. Questo bean ha un attributo di tipo stringa che si chiama attributeName, che ha un valore di default che è "Default value".

Possiamo usare questo bean all'interno di una facelet nel modo seguente:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Backed bean example</title>
    </h:head>
    <h:body>
        #{backedBeanExample.attributeName}
    </h:body>
</html>

Nel Technology Radar del gennaio 2014, ThoughtWorks ha scritto[5]:

«We continue to see teams run into trouble using JSF-- JavaServer Faces -- and are recommending you avoid this technology. Teams seem to choose JSF because it is a J2EE standard without really evaluating whether the programming model suits them. We think JSF is flawed because it tries to abstract away HTML, CSS and HTTP, exactly the reverse of what modern web frameworks do. JSF, like ASP.NET webforms, attempts to create statefulness on top of the stateless protocol HTTP and ends up causing a whole host of problems involving shared server-side state. We are aware of the improvements in JSF 2.0, but think the model is fundamentally broken. We recommend teams use simple frameworks and embrace and understand web technologies including HTTP, HTML and CSS.»

ThoughtWorks consiglia di evitare questa tecnologia, in quanto cerca di astrarre su cose (HTML, CSS e HTTP) su cui non è il caso di astrarre e che gli altri framework non astraggono. Inoltre, sempre secondo il report, JSF cerca di creare degli stati sopra al protocollo HTTP che è privo di stati, ciò causerebbe tanti problemi collegati ad uno stato condiviso mantenuto a lato server.

Risposte alle critiche

[modifica | modifica wikitesto]

Il 12 febbraio 2014, Çağatay Çivici il capo sviluppatore di PrimeFaces, ha risposto alle critiche di ThoughtWorks con un articolo intitolato JSF non è più ciò che ti hanno raccontato.[6] Nell'articolo viene spiegato che le critiche non tengono conto delle evoluzioni più recenti che il framework ha avuto e che mantenere uno stato lato server rende lo sviluppo di applicazioni web più semplice. Çağatay Çivici nota che le critiche si riferiscono alla versione 2.0 del framework ed ignora il supporto ad AJAX. Nella risposta fa vedere quanto sia facile creare con PrimeFaces un applicativo web che usa bootstrap ed effettua chiamate AJAX.

  1. ^ JSR 372: JavaServer Faces (JSF 2.3) Specification.
  2. ^ Mojarra JavaServer Faces
  3. ^ BootsFaces
  4. ^ RichFaces
  5. ^ January 2014 Technology Radar (PDF), su thoughtworks.fileburst.com. URL consultato il 30 gennaio 2014 (archiviato dall'url originale il 7 aprile 2016).
  6. ^ JSF Is Not What You’ve Been Told Anymore

Voci correlate

[modifica | modifica wikitesto]

Altri progetti

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
Controllo di autoritàGND (DE4780730-1
  Portale Internet: accedi alle voci di Wikipedia che trattano di internet