Domanda

Mojarra Attuazione della JSF 2 ha i params contesto seguente:

  • com.sun.faces.numberOfViewsInSession (di default è 15)
  • com.sun.faces.numberOfLogicalViews (di default è 15)

Qual è la differenza tra loro? La documentazione non parla molto di questi. La mia app stava avendo problemi con ViewExpiredException per alcune pagine, ma dopo ci siamo imbattuti queste impostazioni per un (molto) più alto valore, ci siamo fermati ad avere problemi.

La mia app è una forma pesante, ajax-enabled app finanziaria (alcuni schermi hanno 50+ ingressi, con la possibilità di aggiungere molto di più di dati / ingressi tramite la tecnologia AJAX).

quello che può essere la causa di questo comportamento? Capisco che il primo parametro definisce il numero di "pagine" che sono tenuti in sessione, che possono essere utili per il pulsante indietro, ma i miei casi d'uso che attivano il ViewExpiredException non utilizzare il pulsante Indietro. Che cosa significa la seconda param riferisce? Se rimango nello stesso schermo, ma continuare ad aggiungere un sacco di dati tramite la tecnologia AJAX, fa questa causa la necessità di un numero maggiore di punti di vista logici per pagina?

È stato utile?

Soluzione

Prima di tutto, l'attuazione Mojarra involontariamente scambiato il significato di quelle parametri di contesto. Quindi, se avete l'impressione che la descrizione è esattamente il contrario di quello che dice il nome del parametro letterale contesto, allora questo è certamente vero.


com.sun.faces.numberOfLogicalViews

Questo è fondamentalmente richiesta GET basa. Ogni richiesta GET crea una nuova visualizzazione in sessione.

Per sperimentare con esso, impostarlo su un valore pari a 3, avviare una nuova sessione del browser e aperto 4 schede del browser differenti (a prescindere dal URL; può essere lo stesso, può essere diverso) in sequenza e poi tornare al 1 ° scheda e inviare il modulo in là. Si otterrà un ViewExpiredException, perché questo punto di vista è stato spinto fuori dal LRU (Least Recently Used) map per le viste in sessione. Questo non accadrà se si apre max 3 schede.

Con il valore predefinito di 15, questo è un raro problema del mondo reale. Se il vostro webapp è davvero progettato per essere utilizzato in questo modo (ad esempio, un sito / social comunità che invita a essere aperti in più schede, come forum di discussione o Q & A), allora si potrebbe considerare l'utilizzo di stato lato client risparmio invece di aumentare il valore di default . Con client risparmio stato lato, non si sarà mai affrontare questa eccezione. Un'alternativa sarebbe quella di utilizzare OmniFaces <o:enableRestorableView> in combinazione una richiesta ambito parametri leguminose e richiesta o una vista fagioli con ambito che assegni in (post) costrutto se le proprie esigenze di stato da ristrutturare. Ancora un'altra alternativa è andare con <f:view transient="true"> , così il punto di vista non vengono salvati più, ma non è possibile utilizzare più fagioli vista con ambito.

I MyFaces equivalenti è org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION cui valore predefinito è 20.


com.sun.faces.numberOfViewsInSession

Questo è fondamentalmente sincrono (non la sessione aperta!) Richiesta POST base. Ogni richiesta POST sincrona crea una nuova vista logica. Essi sono tutti memorizzati in base ad una visione fisica come modo Map<PhysicalView, Map<LogicalView, ViewState>>. Così, con max 15 vista fisico e max 15 viste logiche, si può teoricamente avere 15 * 15 = 225 viste in sessione.

Per sperimentare con esso, impostarlo su un valore pari a 3, aprire una vista con una forma sincrona, lo presenta 4 volte e poi premere il tasto indietro del browser 4 volte e poi inviare nuovamente il modulo. Si otterrà un ViewExpiredException, perché questo punto di vista è stato spinto fuori dal LRU (Least Recently Used) della mappa per viste logiche. Questo non accadrà se si va indietro max 3 volte e poi inviarlo nuovamente.

Nota che presenta Ajax riutilizzare la stessa vista logica (si può confermare che vedendo esattamente lo stesso valore javax.faces.ViewState essere restituito su postback AJAX). C'è il supporto tasto indietro del browser non per lo stesso. tasto indietro del browser ti porta solo indietro alla richiesta sincrona precedente, sarebbe, pertanto, non ha alcun senso per memorizzare tutti quei postback Ajax viste logiche di sessione.

Con il valore di default del 15 e la tendenza attuale delle forme Ajax-only e la cache disabilitata su pagine dinamiche, questo è un problema molto raro del mondo reale. forme correttamente progettati non dovrebbero invitare alla pressione del pulsante Indietro del browser. Invece, essi dovrebbero in successo presentare redirect alla vista di destinazione e in caso di fallimento solo visualizzare nuovamente lo stesso modulo con errori di convalida. Vedere per i suggerimenti anche Come navigare in JSF? Come rendere URL riflettere pagina corrente (e non precedente) . Inoltre, la cache viene più spesso disattivato a pagine dinamiche, in modo che il pulsante indietro sarebbe fondamentalmente si darà una nuova vista posteriore. Vedere anche pulsante Evita indietro sul JSF applicazione web . Se questo è anche per la vostra applicazione il caso, allora si può tranquillamente impostare il valore a 1.

MyFaces avevano originariamente alcun equivalente per questo, e contato questo come una vista fisico in sessione pure. Nella versione 2.0.6, org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION è stato introdotto, con una simile scopo, anche se con una diversa implementazione e disabilitate di default.


Vedi anche:

Altri suggerimenti

Appena trovato questo sul web: http: // oss .ORG.CN / ossdocs / java / ee / javaeetutorial5 / doc / JSFConfigure11.html

Questo potrebbe essere utile:

  

viste logiche sono subviews di una vista di livello superiore. Ad esempio, se si dispone di una pagina che include più frame quindi ogni fotogramma è una vista logica.   Se si dispone di un'applicazione semplice, allora il valore di default di 15 o 15 vedute viste logiche potrebbe essere troppo grande. In questo caso, si dovrebbe prendere in considerazione la riduzione del numero consentito di opinioni e punti di vista logico alla memoria conserva. Al contrario, una più complessa applicazione potrebbe richiedere più di 15 punti di vista o viste logiche da salvare in una sessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top