2012-05-08 12 views
8

Tenemos activado el ahorro de estado del cliente y usamos beans de respaldo ViewScoped. Cuando el ahorro de estado del cliente está activado y estamos usando un bean ViewScoped, el bean ViewScoped se serializa en la página o se almacena en sesión con un token/key que se serializa a la página (para que la página pueda recuperar el bean de la sesión si la página se publica (vuelve a sí misma)¿Los beans ViewScoped se serializan en la página cuando se activa el ahorro de estado del cliente?

Una preocupación aquí podría ser que, si se serializa, entonces nos podríamos preocupar por no almacenar variables de instancia grandes en ViewScoped bean ya que está serializado a la página y va atrás/adelante sobre el cable.

Respuesta

9

Cuando ahorro estado cliente está encendido y estamos utilizando un grano ViewScoped, es el frijol ViewScoped serialzied a la página o se dice, almacenado en la sesión con un/clave token que se serializa en la página?

Mojarra 2.x almacena ver los frijoles con ámbito en la sesión HTTP. Hay una configuración no documentada que tiene un máximo predeterminado de 25 beans de ámbito de vista en sesión. Vea también issue 4015. En otras palabras, las instancias de bean con ámbito de vista física nunca se almacenan en el estado de vista de JSF. Sólo son referenciados por un UUID que a su vez se almacena en el estado de vista JSF. Por lo tanto, no se serializan en el estado de vista JSF, independientemente del método de ahorro de estado del cliente/servidor.


Una preocupación en este caso podría ser que, si es serializado, entonces podríamos queremos entonces preocuparse de no almacenar las variables de instancia de gran tamaño en el grano ViewScoped ya que es serializado a la página y se remonta/adelante por el cable.

Esto es una preocupación válida. Incluso si fuera cierto, estamos hablando de casos bastante extremos. Una colección de 100 entidades promedio con cada 10 propiedades promedio ya no debería tener más de ~ 5 KB adicionales en el tamaño del estado de la vista. Tenga en cuenta que puede obtener un gran ancho de banda al habilitar la compresión gzip en el servidor web, incluso hasta un 70% por recurso basado en texto.

Si, no obstante, se trata de datos de gran tamaño, el tamaño de almacenamiento de la sesión HTTP puede convertirse en una preocupación. Consulte también JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory? Lo ideal es que el bean de ámbito de vista simplemente se destruya tan pronto como la página a la que hace referencia se descargue mediante una navegación GET o cierre de la ficha del navegador. El bean con ámbito de vista JSF predeterminado no hace eso. Solo se destruye durante una devolución de datos a una vista diferente, o cuando la sesión expira.

En caso de que utilice la biblioteca de utilidades JSF OmniFaces, desde la versión 2.2, el @org.omnifaces.cdi.ViewScoped admite la destrucción durante una descarga. Esto debería tener un efecto positivo en el tamaño de almacenamiento de la sesión HTTP.

+0

Gracias-- esta es una gran información para saber. – BestPractices

+0

De nada. – BalusC

+0

Agregando a esta gran respuesta: también puede encriptar el viewstate prestado por el cliente. Creo que esto incluso será el predeterminado en JSF 2.2 –

3

Tenga en cuenta que la respuesta de BalusC no es verdadera para las versiones recientes de JSF: para las versiones recientes, los datos de los beans javax.faces.view.ViewScoped se guardan en el servidor. Ver JAVASERVERFACES-3090

+0

Gracias por el aviso, actualicé la respuesta. – BalusC

Cuestiones relacionadas