2010-05-26 18 views
24

En JSF, hay un estado de vista asociado a cada página, que se pasa hacia atrás y adelante con somete etc.¿Qué es viewstate en JSF y cómo se usa?

Sé que ViewState se calcula utilizando los estados de los distintos controles en la página, y que se puede almacenar ya sea del lado del cliente o del lado del servidor.

La pregunta es: ¿cómo se usa este valor? ¿Se utiliza para validar los valores enviados al enviar, para garantizar que la misma solicitud no se envíe dos veces?

Además, ¿cómo se calcula? Me doy cuenta de que las caras enriquecidas se pueden calcular de forma diferente a mis caras, pero una idea sería agradable.

Gracias.

+0

Actualmente hay cierto debate sobre el estado de vista en la comunidad JSF. Ver este informe de error: http: // java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-1055 –

Respuesta

24

La pregunta es: ¿cómo se usa este valor ? ¿Se usa para validar los valores enviados al enviar, para garantizar que la misma solicitud no se envíe dos veces al ?

El motivo original por el que viewstate existe es porque HTTP no tiene estado. El estado de los componentes entre las solicitudes debe mantenerse de una forma u otra. O almacena el estado en la memoria en el servidor y lo vincula a la sesión, o lo serializa/deserializa en la solicitud/respuesta cada vez.

AFAIK, viewstate no se usa para detectar el envío doble, pero podría hacerlo si adjunta una marca de tiempo o algo similar.

viewstate también se puede cifrar para garantizar que el cliente no lo modifique.

También, cómo se calcula - I se dan cuenta de que richfaces pueden calcularse diferente a MyFaces, sino una idea estaría bien.

Cada componente es responsable de persistir su estado con saveState y restoreState (ver este tutorial). Así que diferentes conjuntos de componentes dan como resultado un estado de vista diferente. De forma similar, diferentes implementaciones JSF pueden dar como resultado un estado de vista diferente.

+0

"O almacena el estado en la memoria en el servidor y lo vincula a la sesión, o lo serializa/deserializa en la solicitud/respuesta cada vez." ¿Cómo elijo uno sobre otro? –

+1

@KorayTugay hay un param javax.faces.STATE_SAVING_METHOD en la configuración – ewernli

+0

Muchas gracias. –

13

Si está familiarizado con JavaScript, puede pensar en un árbol de componentes JSF un poco como un DOM HTML donde la página HTML define el estado inicial pero puede modificarlo en tiempo de ejecución.

La tecnología de visualización (generalmente JSP o Facelets) define el estado inicial, pero luego se puede manipular mediante programación. Por ejemplo, puede agregar un component o establecer un property. Para que esto funcione correctamente, el estado de la vista debe persistir entre las solicitudes.

El estado de la vista se divide en dos partes. El primero define la estructura del árbol de componentes:

UIView 
- UIForm 
    - UICommand 
    - UIInput 

La segunda parte define el estado de los componentes. Estos están separados debido a componentes como UIData, donde es posible que los niños tengan (por ejemplo) por estado de fila. Esto se organiza/desorganiza a través de los mecanismos StateHolder.

Cuestiones relacionadas