Comprendi l’ambito di Flash in JSF2

Da quanto ho capito, gli oggetti posizionati all’interno dell’ambito Flash in un ciclo di vita delle richieste di facce saranno disponibili per il ciclo di vita delle richieste di facce successive e quindi cancellati.

Supponiamo che io abbia due pagine:

page01.xhtml :

   

Page01Bean:

 @ManagedBean @RequestScoped public class Page01Bean { public void action(){ FacesContext.getCurrentInstance().getExternalContext().getFlash().put("fooKey", "fooValue"); } } 

page02.xhtml :

  

Quindi, quando si fa clic sul pulsante di page01.xhtml , un volto richiede il ciclo di vita (ad esempio, il ciclo di vita A) inizia e imposta il valore sul flash sotto il tasto chiamato fooKey

Quindi apro un’altra scheda del browser e sfogliamo page02.xhtml . Un altro ciclo di vita delle richieste di facce (ad esempio il ciclo di vita B) inizia a eseguire il rendering di questa pagina. Mi aspettavo che il ciclo di vita B potesse accedere al campo di applicazione del flash del suo ciclo di vita precedente (cioè il ciclo di vita A) e visualizzare fooValue in page02.xhtml . Tuttavia, non visualizza nulla.

Per favore correggimi quanto frainteso sull’ambito del flash in questo exmaple. Grazie mille

In breve, le variabili memorizzate nello scope flash sopravviveranno a un reindirizzamento e verranno eliminate successivamente. Questo è veramente utile quando si implementa un pattern Post-Redirect-Get.

Se provi a navigare verso un’altra pagina reindirizzando e accedendo agli attributi al caricamento, saranno lì. Dopo che la richiesta è stata eseguita, i valori nel flash verranno scartati. Per esempio:

Sei in page1.xhtml e hai un commandLink che reindirizza a una nuova pagina con un metodo come questo (Nota: userò la navigazione implicita).

 public String navigateToPageB() { FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", "Hello World!"); return "pageB?faces-redirect=true"; } 

Quando viene eseguito il rendering di pageB.xhtml, è ansible accedere a tali valori tramite espressioni EL come

  

che mostrerà “Hello World!” stringa che abbiamo salvato in precedenza in navigatePagineB.

Per quanto riguarda la tua domanda, aprendo una nuova scheda nel tuo explorer non stai accedendo allo stesso contesto che stavi accedendo alla tua scheda precedente, quindi la tua variabile non sarà disponibile lì.

La risposta precedente è corretta, ma solo per completezza vorrei dire che ci sono stati un sacco di problemi nelle implementazioni di Mojarra con tutte queste cose, ma alla fine sono riusciti a farlo funzionare correttamente nelle versioni Mojarra 2.1.27 e 2.2.5.

Come dice @Gamb, lo scopo dell’ambito del flash è di mantenere vivo un parametro mappandolo internamente attraverso il reindirizzamento. Possiamo anche mantenere il parametro attivo più a lungo se ne abbiamo bisogno. A parte il modo menzionato, FacesContext#getCurrentInstance#getExternalContext#getFlash#put , c’è anche la possibilità di impostare il parametro tramite l’espressione EL, usando . Ho implementato un test di base successivo a SSCCE che mostra una gamma più ampia di opzioni, utilizzando due viste:

Bean1

 @ManagedBean @ViewScoped public class Bean1 implements Serializable { /** * Just takes the given param, sets it into flash context and redirects to * page2 * * @param inputValue * @return */ public String goPage2(String inputValue) { FacesContext.getCurrentInstance().getExternalContext().getFlash() .put("param", inputValue); return "page2?faces-redirect=true"; } } 

page1.xhtml

            

Param1: #{flash['param']}

Param2: #{flash['param2']}

Bean2

 @ManagedBean @ViewScoped public class Bean2 implements Serializable { public String getParam() { /** * Takes the parameter from the flash context */ return (String) FacesContext.getCurrentInstance().getExternalContext() .getFlash().get("param"); } } 

page2.xhtml

      

Param1: #{bean2.param}

Param1: #{flash.param}

Param1: #{flash['param']}

Param2: #{flash['param2']}

#{flash.keep.param}

Guarda anche:

  • Documentazione flash JSF
  • Mantenendo i parametri del flash quando l’utente ricarica manualmente la vista