Cercando di capire immediatamente = “vero” saltare gli input quando non dovrebbe

Proprio quando pensavo di aver capito immediatamente … * sospiro *

Considera la seguente pagina JSF:

  

E questo fagiolo:

 public class TestBean { private String didSomething = "Nothing done yet"; // + getter public void doFoo() { didSomething = "Did foo!"; } public void doBar() { didSomething = "Did bar!"; } 

Da tutto quello che ho letto sull’immediato mi aspetterei quanto segue:

Su ciò che accadrà dopo, questa descrizione afferma:

“Un valore di ritorno nullo (come risultato del metodo di azione) fa sì che l’elaborazione continui normalmente, cioè i componenti non immediati vengono convalidati, quindi viene eseguito il modello di aggiornamento (se non si sono verificati errori di convalida). è necessario chiamare facesContext.renderResponse (); se il stream normale non è desiderato. ”

Da ciò ho avuto l’idea che l’elaborazione continui normalmente (dato che il mio metodo di azione non restituisce né un risultato né forza renderResponse() ), risultando nello stesso errore di convalida. L’unica differenza potrebbe essere che si verifica dopo l’ impostazione di didSomething . Tuttavia, questo non succede. Invece, sembra che il sito salti ancora tutte le fasi rimanenti, con il campo di input che non viene toccato. Re-rendering senza messaggio di errore.

Qualcuno può spiegarmi dove non riesco a capire come funziona?

Con immediate="true" sul pulsante, l’azione viene effettivamente invocata durante la fase dei valori di richiesta di applicazione e tutte le fasi rimanenti vengono saltate. Questo è anche l’unico punto di questo attributo: processare (decodificare, validare, aggiornare e richiamare) il componente immediatamente durante la fase di applicazione dei valori di richiesta.

Tutti gli input che non hanno immediate="true" vengono comunque ignorati. Vengono elaborati anche gli input che hanno immediate="true" , ma ciò accade anche durante la fase di applicazione dei valori di richiesta. Perché le fasi rimanenti dovrebbero essere invocate se tutto è già avvenuto nella fase di applicazione dei valori di richiesta?

Nell’articolo del ciclo di vita di Debug JSF è ansible trovare il seguente sumrio che dovrebbe chiarire quando (non) utilizzare il immediate"true" :

Va bene, quando dovrei usare l’attributo immediato?

Se non è ancora del tutto chiaro, ecco un riassunto, completo di esempi di utilizzo del mondo reale quando possono essere utili:

  • Se impostato solo su UIInput (s), la fase di convalida del processo verrà eseguita nella fase di applicazione della richiesta valori. Utilizzare questo per dare priorità alla convalida per i componenti UIInput in questione. Quando la convalida / conversione fallisce per nessuno di essi, i componenti non immediati non verranno convalidati / convertiti.

  • Se impostato solo in UICommand , la fase Valori della richiesta di applicazione fino a quando le fasi dei valori del modello di aggiornamento non verranno saltate per nessuno dei componenti UIInput . Usalo per saltare l’intera elaborazione del modulo. Ad esempio il pulsante “Annulla” o “Indietro”.

  • Se impostato in entrambi i componenti UIInput e UICommand , la fase Valori della richiesta di applicazione fino a quando i valori del modello di aggiornamento non verranno saltati per nessuno dei componenti UIInput che non ha questo attributo impostato. Utilizzare questo per saltare l’elaborazione dell’intero modulo previsto per determinati campi (con immediato). Ad esempio il pulsante “Password dimenticata” in un modulo di accesso con un campo obbligatorio ma non immediato.

Guarda anche:

  • Perché l’attributo “immediato” è stato aggiunto a EditableValueHolders?