2012-05-08 9 views
8

Abbiamo attivato il salvataggio dello stato del client e utilizzare i bean di supporto ViewScoped. Quando il salvataggio dello stato del client è attivo e utilizziamo un bean ViewScoped, il bean ViewScoped viene serializzato alla pagina o si dice, memorizzato in sessione con un token/chiave serializzato sulla pagina (in modo che la pagina possa richiamare il bean dalla sessione se la pagina è postata - torna a se stessa)I bean ViewScoped sono serializzati sulla pagina quando il salvataggio dello stato del client è attivato?

Un problema potrebbe essere che, se è serializzato, allora potremmo voler preoccuparci di non memorizzare grandi variabili di istanza sul bean ViewScoped poiché è serializzato alla pagina e va avanti/indietro sul filo.

risposta

9

durante il salvataggio dello stato del client è attivato e che stiamo usando un fagiolo ViewScoped, è il fagiolo ViewScoped serialzied alla pagina o è dire, conservato in seduta con un token/chiave che è serializzato sulla pagina?

Mojarra 2.x memorizza i bean con scope nella sessione HTTP. Esiste un'impostazione non documentata che ha un limite predefinito di 25 scope scope scope in sessione. Vedi anche issue 4015. In altre parole, le istanze del bean con ambito fisico non vengono mai memorizzate nello stato di visualizzazione JSF. Sono referenziati solo da un UUID che a sua volta è memorizzato nello stato di visualizzazione JSF. Quindi, non sono serializzati nello stato di visualizzazione JSF, indipendentemente dal metodo di salvataggio dello stato client/server.


Una preoccupazione qui potrebbe essere che, se è serializzato, allora potremmo vogliamo poi preoccuparsi di non memorizzare grandi variabili di istanza sul fagiolo ViewScoped come è serializzato sulla pagina e torna/avanti sul filo.

Questa è una preoccupazione valida. Anche se fosse vero, stiamo comunque parlando di casi piuttosto estremi. Una raccolta di 100 entità medie con 10 proprietà medie non dovrebbe essere più di un altro ~ 5 KB sulle dimensioni dello stato di visualizzazione. Tieni presente che puoi ottenere molta larghezza di banda attivando la compressione gzip sul server web, anche fino al 70% per risorsa basata sul testo.

Se si hanno a che fare con dati di grandi dimensioni, la dimensione di archiviazione della sessione HTTP può a sua volta diventare un problema. Vedi anche JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory? Idealmente, il bean con scope vista dovrebbe essere distrutto non appena la pagina a cui fa riferimento viene scaricata da una scheda di navigazione GET o da una scheda del browser chiusa. Il bean con scope vista JSF predefinito non lo fa. Viene distrutto solo durante un postback su una vista diversa o quando la sessione scade.

Nel caso in cui si utilizzi la libreria di utilità JSF OmniFaces, dalla versione 2.2 il @org.omnifaces.cdi.ViewScoped supporta la distruzione durante uno scaricamento. Ciò dovrebbe avere un effetto positivo sulla dimensione della memoria della sessione HTTP.

+0

Grazie-- questa è un'ottima informazione da sapere. – BestPractices

+0

Prego. – BalusC

+0

In aggiunta a questa ottima risposta: puoi anche criptare il viewstate reso client. Penso che questo sarà anche il default in JSF 2.2 –

3

Si noti che la risposta di BalusC non è vera per le versioni recenti di JSF: per le versioni recenti i dati dei bean javax.faces.view.ViewScoped vengono mantenuti sul server. Vedi JAVASERVERFACES-3090

+0

Grazie per l'avviso, ho aggiornato la risposta. – BalusC