Il JSF lifecycle è uno degli argomenti più importanti da comprendere quando si lavora con JavaServer Faces, oggi evoluto nel mondo moderno come Jakarta Faces. A prima vista una pagina JSF può sembrare simile a una normale pagina web: il client invia una richiesta HTTP, il server elabora la richiesta e restituisce HTML. Tuttavia, dietro questa apparente semplicità, JSF gestisce un ciclo di vita molto più articolato.
Il motivo è semplice: JSF non lavora soltanto con pagine HTML, ma con un albero di componenti server-side. Ogni campo, pulsante, messaggio, form o tabella può essere rappresentato da un componente lato server, con stato, valore, validatori, convertitori, eventi e collegamenti ai managed bean.
Per questo motivo, capire il JSF lifecycle explained significa capire quando JSF legge i valori inviati dall’utente, quando li converte, quando li valida, quando aggiorna i bean, quando invoca le action e quando renderizza nuovamente la pagina XHTML.
In breve: il ciclo di vita JSF è il processo con cui una richiesta Faces viene trasformata in una risposta Faces, passando attraverso fasi come restore view, apply request values, process validations, update model values, invoke application e render response.
Indice dei contenuti
- Che cos’è il JSF Lifecycle
- Le fasi del ciclo di vita JSF
- Initial request e postback
- Restore View
- Apply Request Values
- Process Validations
- Update Model Values
- Invoke Application
- Render Response
- JSF Action Button Lifecycle
- Lifecycle XHTML JSF
- JSF 1.2 Lifecycle
- JSF 2 Lifecycle
- JSF 1.2 Lifecycle Constructor
- Debug del JSF Lifecycle
- javax.enterprise.resource.webcontainer.jsf.lifecycle
- Errori comuni nel ciclo di vita JSF
- FAQ sul JSF Lifecycle
Che cos’è il JSF Lifecycle
Il JSF lifecycle è il processo interno con cui JavaServer Faces gestisce una richiesta HTTP diretta a una pagina JSF. Quando l’utente apre una pagina, compila una form, clicca un pulsante o invia dati al server, JSF non si limita a chiamare un metodo e restituire HTML. Prima ricostruisce o crea la vista, legge i valori inviati, converte i dati, valida gli input, aggiorna il modello, esegue eventuali action e infine renderizza la risposta.
Questo processo è particolarmente importante perché JSF è un framework component-based. Una pagina non è vista solo come testo XHTML, ma come un UIViewRoot che contiene un albero di componenti.
In una pagina JSF, un campo come questo:
<h:inputText value="#{userBean.name}" />
non è soltanto un input HTML. È un componente JSF collegato a una proprietà del bean. Durante il lifecycle, JSF deve capire quale valore è stato inviato, convertirlo se necessario, validarlo, aggiornare userBean.name e poi renderizzare nuovamente la pagina.
Schema generale
Faces Request
↓
Restore View
↓
Apply Request Values
↓
Process Validations
↓
Update Model Values
↓
Invoke Application
↓
Render Response
↓
Faces Response
Queste sono le sei fasi principali del ciclo di vita standard di JSF. Non sempre vengono eseguite tutte. In alcuni casi il processo può saltare direttamente alla fase di render response, oppure può completare la risposta prima del normale completamento del ciclo.
Concetto chiave: JSF è stateful. Questo significa che conserva e ricostruisce lo stato della vista tra una richiesta e l’altra.
Le fasi del ciclo di vita JSF
Il ciclo standard di JavaServer Faces è composto da sei fasi. Ogni fase ha una responsabilità precisa.
| Fase | Cosa fa |
|---|---|
| Restore View | Crea o ricostruisce l’albero dei componenti della vista. |
| Apply Request Values | Legge i valori inviati nella request e li salva nei componenti. |
| Process Validations | Converte e valida gli input dell’utente. |
| Update Model Values | Aggiorna le proprietà dei managed bean collegate ai componenti. |
| Invoke Application | Esegue action, action listener e logica applicativa. |
| Render Response | Genera la risposta HTML da inviare al browser. |
Queste fasi sono fondamentali per capire problemi frequenti come:
- perché il metodo action non viene chiamato;
- perché un valore non arriva al bean;
- perché una validazione blocca la navigazione;
- perché un converter fallisce prima dell’action;
- perché un componente con
immediate="true"cambia il comportamento della pagina; - perché il costruttore del bean viene chiamato in un momento diverso da quello atteso.
Initial request e postback
Per capire il JSF lifecycle explained bisogna distinguere tra due tipi di richiesta:
- Initial request: l’utente apre una pagina JSF per la prima volta.
- Postback: l’utente invia una form da una pagina JSF già renderizzata.
Initial request
Nel caso di una initial request, JSF deve creare la vista e renderizzarla. Non ci sono ancora valori inviati da una form, non ci sono validazioni utente da eseguire e non c’è un modello da aggiornare con dati provenienti dal browser.
In forma semplificata:
Initial Request
↓
Restore View
↓
Render Response
Postback
Nel caso di un postback, invece, l’utente sta inviando dati da una pagina già generata. JSF deve recuperare la vista precedente, applicare i valori della request, validare, aggiornare il modello, invocare l’application logic e renderizzare la nuova risposta.
Postback
↓
Restore View
↓
Apply Request Values
↓
Process Validations
↓
Update Model Values
↓
Invoke Application
↓
Render Response
Nota pratica: molti problemi JSF nascono proprio dal non capire se una richiesta è una initial request o un postback.
Restore View
Restore View è la prima fase del JSF lifecycle. Durante questa fase, JSF crea o ricostruisce l’albero dei componenti della pagina.
Se la richiesta è una initial request, JSF crea una nuova vista. Se invece la richiesta è un postback, JSF recupera la vista precedente e la ricostruisce con lo stato disponibile sul client o sul server, a seconda della configurazione dello state saving.
Durante questa fase vengono collegati componenti, validatori, convertitori, listener ed eventuali elementi necessari alla gestione della vista.
Esempio di pagina XHTML
<h:form>
<h:inputText value="#{userBean.name}" />
<h:commandButton value="Salva" action="#{userBean.save}" />
</h:form>
Questa pagina viene rappresentata internamente come un albero di componenti. JSF non ragiona soltanto in termini di markup finale, ma di componenti server-side.
UIViewRoot
La radice dell’albero dei componenti JSF è UIViewRoot. Tutti i componenti della pagina sono figli diretti o indiretti di questa radice.
UIViewRoot
↓
h:form
↓
h:inputText
↓
h:commandButton
Questa fase è importante perché tutto il resto del lifecycle lavora sull’albero dei componenti ricostruito o creato in Restore View.
Apply Request Values
Durante la fase Apply Request Values, JSF legge i parametri inviati nella request HTTP e li assegna localmente ai componenti della vista.
In questa fase il valore non viene ancora copiato nel managed bean. Viene salvato come submitted value nel componente JSF.
In forma semplificata, per un componente input può succedere qualcosa di simile:
if (input.isRendered()) {
String value = request.getParameter(input.getClientId());
if (value != null) {
input.setSubmittedValue(value);
}
}
Questo significa che, se l’utente scrive “Mario” in un campo input, JSF prima mette quel valore dentro il componente, non direttamente dentro il bean.
Perché questa fase è importante?
È importante perché spiega perché il valore del bean non viene aggiornato subito. Prima JSF raccoglie i dati inviati, poi li converte, li valida e solo successivamente li copia nel modello.
Il ruolo di immediate=”true”
Se un componente ha l’attributo immediate="true", alcune operazioni vengono anticipate a questa fase. Questo può cambiare in modo significativo il comportamento del lifecycle.
<h:commandButton value="Annulla"
action="#{userBean.cancel}"
immediate="true" />
Un pulsante con immediate="true" può essere utile, per esempio, quando vuoi annullare una form senza essere bloccato da validazioni su campi obbligatori.
Attenzione:
immediate="true"non deve essere usato a caso. È utile per casi specifici, ma può rendere difficile capire il flusso della pagina se abusato.
Process Validations
Durante la fase Process Validations, JSF esegue conversioni e validazioni sui valori inviati dall’utente.
In questa fase entrano in gioco:
- converter standard;
- converter custom;
- validator standard;
- validator custom;
- attributi come
required="true"; - messaggi di errore associati ai componenti.
Esempio con required
<h:inputText value="#{userBean.email}" required="true" />
<h:message for="email" />
Se il campo è obbligatorio e l’utente lo lascia vuoto, JSF genera un messaggio di errore e salta direttamente alla fase di render response, senza aggiornare il modello e senza invocare l’action applicativa.
Esempio di validatore custom
import jakarta.faces.component.UIComponent;
import jakarta.faces.context.FacesContext;
import jakarta.faces.validator.FacesValidator;
import jakarta.faces.validator.Validator;
import jakarta.faces.validator.ValidatorException;
@FacesValidator("urlValidator")
public class UrlValidator implements Validator<String> {
@Override
public void validate(FacesContext context,
UIComponent component,
String value) throws ValidatorException {
if (value == null || !value.startsWith("https://")) {
throw new ValidatorException(
new jakarta.faces.application.FacesMessage("URL non valido")
);
}
}
}
Nel vecchio JSF il package era spesso javax.faces.*. Nelle versioni moderne Jakarta Faces si usa jakarta.faces.*.
Cosa succede se la validazione fallisce?
Se la validazione fallisce:
- JSF registra un messaggio nel
FacesContext; - il modello non viene aggiornato;
- l’action del pulsante non viene invocata;
- la pagina viene renderizzata di nuovo con i messaggi di errore.
Process Validations
↓
Errore di validazione
↓
Render Response
Update Model Values
Se conversione e validazione hanno successo, JSF passa alla fase Update Model Values.
In questa fase i valori locali dei componenti vengono copiati nelle proprietà dei managed bean collegate tramite Expression Language.
Per esempio, dato questo input:
<h:inputText value="#{userBean.name}" />
JSF esegue concettualmente qualcosa di simile:
userBean.setName(input.getValue());
Questa fase spiega perché il bean non riceve il nuovo valore finché la validazione non è stata completata correttamente.
Esempio di managed bean
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Named;
@Named
@RequestScoped
public class UserBean {
private String name;
public String save() {
System.out.println("Nome salvato: " + name);
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
In questo esempio, setName() viene chiamato durante la fase Update Model Values, non durante Apply Request Values.
Regola pratica: se una validazione fallisce, il model non viene aggiornato e l’action non viene eseguita.
Invoke Application
Durante la fase Invoke Application, JSF esegue la logica applicativa collegata alla richiesta.
È in questa fase che vengono normalmente chiamati:
- metodi action;
- action listener;
- logiche di navigazione;
- eventuali redirect;
- codice applicativo associato al click di un pulsante.
Esempio di action
<h:commandButton value="Salva" action="#{userBean.save}" />
Metodo nel bean:
public String save() {
// logica applicativa
return "success";
}
Se tutto è andato bene nelle fasi precedenti, JSF invoca userBean.save() durante Invoke Application.
Navigazione
Il valore restituito da un’action può essere usato per determinare la pagina successiva.
public String save() {
return "detail";
}
In base alla configurazione della navigazione, JSF può decidere quale vista renderizzare dopo l’esecuzione dell’action.
Render Response
Render Response è l’ultima fase del ciclo di vita JSF. Durante questa fase, JSF genera la risposta da inviare al browser.
Nel caso di pagine XHTML, JSF attraversa l’albero dei componenti e produce l’HTML finale.
Se ci sono messaggi di errore, questi vengono mostrati all’utente tramite componenti come:
<h:messages />
oppure:
<h:message for="email" />
Alla fine della fase, JSF salva lo stato della vista in modo che possa essere ricostruito in una richiesta successiva.
Schema finale
Render Response
↓
Generazione HTML
↓
Salvataggio stato vista
↓
Risposta al browser
Nota importante: se una validazione fallisce, JSF salta direttamente a Render Response e mostra di nuovo la stessa pagina con i messaggi di errore.
JSF Action Button Lifecycle
La keyword jsf action button lifecycle riguarda un caso molto pratico: cosa succede quando l’utente clicca su un pulsante JSF come h:commandButton.
Esempio XHTML
<h:form>
<h:inputText id="name" value="#{userBean.name}" required="true" />
<h:message for="name" />
<h:commandButton value="Salva" action="#{userBean.save}" />
</h:form>
Quando l’utente clicca su “Salva”, il flusso è questo:
Click sul pulsante
↓
Postback
↓
Restore View
↓
Apply Request Values
↓
Process Validations
↓
Update Model Values
↓
Invoke Application
↓
Render Response
Se il campo name è vuoto, la validazione fallisce e il metodo save() non viene chiamato.
Click sul pulsante
↓
Process Validations
↓
Errore required
↓
Render Response
Pulsante annulla con immediate
Un caso frequente è un pulsante “Annulla” che deve funzionare anche se la form contiene errori.
<h:commandButton value="Annulla"
action="#{userBean.cancel}"
immediate="true" />
Con immediate="true", l’action può essere processata prima delle normali validazioni dei campi input.
Uso tipico:
immediate="true"è utile per pulsanti come Annulla, Indietro o Reset, ma non dovrebbe essere usato per nascondere problemi di validazione.
Lifecycle XHTML JSF
La keyword lifecycle xhtml jsf riguarda il rapporto tra il file XHTML e il ciclo di vita JSF.
In JSF moderno, le pagine sono spesso file .xhtml basati su Facelets. Questi file definiscono la vista, ma JSF li interpreta come una struttura di componenti.
Esempio XHTML completo
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="jakarta.faces.html">
<h:head>
<title>JSF Lifecycle Example</title>
</h:head>
<h:body>
<h:form>
<h:outputLabel for="name" value="Nome" />
<h:inputText id="name" value="#{userBean.name}" required="true" />
<h:message for="name" />
<h:commandButton value="Salva" action="#{userBean.save}" />
</h:form>
</h:body>
</html>
Durante il lifecycle, JSF:
- legge la pagina XHTML;
- costruisce l’albero dei componenti;
- collega input, output, form, messaggi e pulsanti;
- associa i valori ai managed bean;
- gestisce validazione e conversione;
- produce HTML finale.
JSF 1.2 Lifecycle
Il JSF 1.2 lifecycle segue le stesse fasi concettuali principali del ciclo standard:
- Restore View
- Apply Request Values
- Process Validations
- Update Model Values
- Invoke Application
- Render Response
La differenza principale rispetto alle versioni moderne riguarda l’ecosistema, le API, la configurazione e il modo in cui vengono gestiti managed bean, Facelets e annotazioni.
Nei progetti JSF 1.2 è molto comune trovare:
- package
javax.faces.*; - configurazione nel file
faces-config.xml; - managed bean dichiarati in XML;
- uso più frequente di JSP o Facelets configurato separatamente;
- application server Java EE legacy.
Esempio di managed bean in faces-config.xml
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>com.example.UserBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Oggi, nelle applicazioni moderne, si preferiscono CDI, annotazioni e package jakarta.*, ma conoscere JSF 1.2 è ancora utile quando si lavora su progetti legacy.
JSF 2 Lifecycle
Il JSF 2 lifecycle mantiene le stesse fasi fondamentali, ma introduce un ecosistema più moderno rispetto a JSF 1.2.
Con JSF 2 diventano molto più comuni:
- Facelets come tecnologia standard per le viste;
- annotazioni per managed bean e componenti;
- supporto Ajax integrato;
- migliore gestione delle risorse;
- template XHTML più strutturati;
- navigazione implicita.
Esempio JSF 2 con Ajax
<h:form>
<h:inputText id="name" value="#{userBean.name}">
<f:ajax event="keyup" render="output" />
</h:inputText>
<h:outputText id="output" value="#{userBean.name}" />
</h:form>
Con Ajax, JSF può eseguire un lifecycle parziale, processando solo alcuni componenti e renderizzando solo parti specifiche della vista.
Partial lifecycle
Ajax Request
↓
Restore View
↓
Apply Request Values su componenti processati
↓
Validazione parziale
↓
Update Model parziale
↓
Render parziale della risposta
Questo rende JSF 2 più adatto a interfacce dinamiche rispetto alle versioni precedenti.
JSF 1.2 Lifecycle Constructor
La ricerca jsf 1.2 lifecycle constructor riguarda spesso un dubbio pratico: quando viene chiamato il costruttore di un managed bean rispetto al ciclo di vita JSF?
Il costruttore del bean non corrisponde a una fase del JSF lifecycle. Viene chiamato quando il framework deve creare l’istanza del bean, in base allo scope e alla configurazione.
Esempio
public class UserBean {
public UserBean() {
System.out.println("Costruttore UserBean");
}
public String save() {
System.out.println("Action save");
return "success";
}
}
Se il bean è in request scope, può essere ricreato a ogni richiesta. Se è in session scope, può vivere per tutta la sessione utente. Se è in view scope, può vivere finché la vista viene mantenuta.
| Scope | Comportamento tipico |
|---|---|
| Request | Nuova istanza a ogni richiesta. |
| View | Istanza mantenuta durante la vita della vista. |
| Session | Istanza mantenuta durante la sessione utente. |
| Application | Istanza condivisa a livello applicativo. |
Nota pratica: se vedi il costruttore chiamato più volte, controlla lo scope del bean e se la pagina sta generando nuove request o postback.
Debug del JSF Lifecycle
Il ciclo di vita JSF può essere tracciato usando un PhaseListener. Questo è molto utile quando vuoi capire quali fasi vengono eseguite e in quale ordine.
Esempio moderno con Jakarta Faces
import jakarta.faces.event.PhaseEvent;
import jakarta.faces.event.PhaseId;
import jakarta.faces.event.PhaseListener;
public class LifeCycleListener implements PhaseListener {
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
@Override
public void beforePhase(PhaseEvent event) {
System.out.println("START PHASE " + event.getPhaseId());
}
@Override
public void afterPhase(PhaseEvent event) {
System.out.println("END PHASE " + event.getPhaseId());
}
}
Versione legacy con javax.faces
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
public class LifeCycleListener implements PhaseListener {
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
public void beforePhase(PhaseEvent event) {
System.out.println("START PHASE " + event.getPhaseId());
}
public void afterPhase(PhaseEvent event) {
System.out.println("END PHASE " + event.getPhaseId());
}
}
Registrazione in faces-config.xml
<lifecycle>
<phase-listener>com.example.LifeCycleListener</phase-listener>
</lifecycle>
Con questo listener puoi vedere nel log l’inizio e la fine di ogni fase del ciclo JSF.
Output di esempio
START PHASE RESTORE_VIEW
END PHASE RESTORE_VIEW
START PHASE APPLY_REQUEST_VALUES
END PHASE APPLY_REQUEST_VALUES
START PHASE PROCESS_VALIDATIONS
END PHASE PROCESS_VALIDATIONS
START PHASE UPDATE_MODEL_VALUES
END PHASE UPDATE_MODEL_VALUES
START PHASE INVOKE_APPLICATION
END PHASE INVOKE_APPLICATION
START PHASE RENDER_RESPONSE
END PHASE RENDER_RESPONSE
javax.enterprise.resource.webcontainer.jsf.lifecycle
La keyword javax.enterprise.resource.webcontainer.jsf.lifecycle fa riferimento a una categoria di logging usata in diversi ambienti Java EE, GlassFish, Payara o implementazioni storiche collegate a JSF/Mojarra.
Questa categoria può comparire nei log quando il server registra informazioni, warning o dettagli relativi al ciclo di vita JSF.
Esempio di log
[WARNING] [javax.enterprise.resource.webcontainer.jsf.lifecycle]
#{bean.action}: javax.faces.FacesException
In ambienti come GlassFish o Payara, può essere possibile configurare il livello di log per questa categoria.
Esempio concettuale
javax.enterprise.resource.webcontainer.jsf.lifecycle.level=FINE
Oppure tramite strumenti di amministrazione del server:
asadmin set-log-levels javax.enterprise.resource.webcontainer.jsf.lifecycle=FINE
Attenzione: il modo preciso per configurare questa categoria dipende dal server applicativo e dalla versione. In ambienti moderni Jakarta EE, i package applicativi possono essere
jakarta.*, ma alcune categorie di logging legacy possono ancora comparire con nomijavax.*.
JSF Lifecycle BalusC
La ricerca jsf lifecycle balusc è molto comune perché BalusC, autore noto nella community JSF, ha pubblicato spiegazioni molto dettagliate sul debug e sul ciclo di vita JSF.
Quando si studia il lifecycle, è utile confrontare la teoria ufficiale con esempi pratici di debug, perché molti problemi reali emergono solo osservando quale fase viene eseguita, quale viene saltata e dove si verifica l’errore.
Un approccio consigliato è:
- studiare le sei fasi standard;
- creare un piccolo esempio XHTML;
- aggiungere un
PhaseListener; - provare una form valida;
- provare una form con errore di validazione;
- provare un pulsante con
immediate="true"; - osservare quali fasi vengono eseguite.
JSF Lifecycle Manual: schema operativo
Un piccolo JSF lifecycle manual può essere utile per diagnosticare problemi rapidamente.
| Problema | Fase da controllare |
|---|---|
| Il valore non arriva al bean | Update Model Values |
| L’action non viene chiamata | Process Validations |
| Il converter fallisce | Process Validations |
| La pagina mostra errori ma non naviga | Render Response dopo validazione fallita |
| Il pulsante Annulla non funziona | Valutare immediate=”true” |
| Il costruttore viene chiamato troppe volte | Scope del bean |
| Il comportamento Ajax è diverso dal previsto | Partial lifecycle e attributi execute/render |
Errori comuni nel ciclo di vita JSF
Pensare che il bean venga aggiornato subito
Il valore inviato dall’utente viene prima salvato nel componente, poi convertito, validato e solo dopo copiato nel bean.
Non capire perché l’action non viene chiamata
Se una validazione fallisce, JSF salta Invoke Application. Quindi il metodo action non viene eseguito.
Usare immediate=”true” senza capire l’effetto
immediate="true" modifica l’ordine normale del lifecycle. Può essere utile, ma può anche rendere difficile capire il comportamento della pagina.
Confondere initial request e postback
La prima apertura della pagina non segue lo stesso flusso di una form inviata dall’utente.
Ignorare lo scope del bean
Molti problemi apparentemente legati al lifecycle sono in realtà problemi di scope: request, view, session o application.
Non usare un PhaseListener in fase di debug
Un PhaseListener è uno degli strumenti più semplici per capire cosa sta succedendo nel ciclo JSF.
Best practice per lavorare con il JSF Lifecycle
- Usa
h:messagesoh:messageper visualizzare errori di validazione. - Controlla sempre lo scope del bean.
- Evita logica pesante nel costruttore del bean.
- Usa
@PostConstructper inizializzazioni dopo la creazione del bean. - Usa
immediate="true"solo quando hai un motivo preciso. - Abilita un
PhaseListenerquando devi capire l’ordine delle fasi. - Ricorda che Ajax può eseguire un lifecycle parziale.
- Nei progetti legacy controlla se il codice usa
javax.faces.*ojakarta.faces.*.
FAQ sul JSF Lifecycle
Che cos’è il JSF lifecycle?
Il JSF lifecycle è il processo con cui JavaServer Faces gestisce una richiesta, ricostruisce la vista, legge gli input, valida i dati, aggiorna il modello, invoca la logica applicativa e renderizza la risposta.
Quali sono le fasi del JSF lifecycle?
Le fasi principali sono Restore View, Apply Request Values, Process Validations, Update Model Values, Invoke Application e Render Response.
Cos’è il JSF 2 lifecycle?
Il JSF 2 lifecycle è il ciclo di vita JSF nelle versioni 2.x, con supporto più moderno a Facelets, annotazioni, Ajax e navigazione semplificata.
Cos’è il JSF 1.2 lifecycle?
Il JSF 1.2 lifecycle segue le stesse fasi fondamentali, ma appartiene a un ecosistema più legacy, spesso basato su javax.faces.*, configurazioni XML e application server Java EE più vecchi.
Quando viene chiamato il costruttore di un bean JSF?
Il costruttore viene chiamato quando il framework crea l’istanza del bean. Il momento dipende dallo scope del bean e dalla configurazione.
Perché l’action di un pulsante JSF non viene chiamata?
Spesso perché una validazione o una conversione fallisce nella fase Process Validations. In quel caso JSF salta Invoke Application e va direttamente a Render Response.
A cosa serve immediate=”true” in JSF?
Serve ad anticipare il processamento di un componente nel lifecycle. È utile per pulsanti come Annulla o Indietro, ma va usato con attenzione.
Cosa significa lifecycle xhtml jsf?
Significa studiare come una pagina XHTML JSF viene trasformata in un albero di componenti, processata durante le fasi del lifecycle e renderizzata come HTML finale.
A cosa serve un PhaseListener?
Un PhaseListener permette di eseguire codice prima e dopo le fasi del lifecycle. È molto utile per debug e tracciamento.
Cos’è javax.enterprise.resource.webcontainer.jsf.lifecycle?
È una categoria di logging collegata al ciclo di vita JSF in alcuni server Java EE, GlassFish, Payara o ambienti legacy. Può essere usata per tracciare o configurare log relativi al lifecycle.
Conclusione
Il JSF lifecycle è il cuore del funzionamento di JavaServer Faces. Capirlo significa sapere quando JSF crea o ripristina la vista, quando legge i valori dalla request, quando valida gli input, quando aggiorna il modello, quando esegue le action e quando renderizza la risposta.
Molti problemi JSF diventano più semplici da risolvere quando si conosce il lifecycle. Se un valore non arriva al bean, se un’action non viene chiamata, se una validazione blocca la pagina o se un pulsante si comporta in modo strano, quasi sempre la risposta si trova in una delle fasi del ciclo.
Conoscere il JSF 1.2 lifecycle, il JSF 2 lifecycle, il comportamento dei pulsanti, il ruolo di XHTML, il debugging con PhaseListener e le categorie di logging come javax.enterprise.resource.webcontainer.jsf.lifecycle è fondamentale per lavorare bene sia su applicazioni legacy sia su progetti più moderni basati su Jakarta Faces.
Riassunto finale: JSF non processa una pagina in modo lineare come un semplice servlet. Lavora con un albero di componenti, stato della vista, validatori, converter, managed bean, eventi e fasi precise. Capire questo flusso è la chiave per usare JSF in modo corretto.