2009-01-09 29 views

Respuesta

38

¿Cómo saber si estoy en una devolución de datos?

Depende de la versión JSF.

En JSF 1.0/1.1, no hay ningún método disponible ResponseStateManager#isPostback(). compruebe si el parámetro javax.faces.ViewState está presente en el mapa de parámetros de solicitud disponible en ExternalContext#getRequestParameterMap().

public static boolean isPostback() { 
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
    return externalContext.getRequestParameterMap().contains("javax.faces.ViewState"); 
} 

En JSF 1.2, de hecho utilizar ResponseStateManager#isPostback() que a su vez comprueba efectivamente la presencia de javax.faces.ViewState parámetro en el mapa de parámetros.

public static boolean isPostback() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context.getRenderKit().getResponseStateManager().isPostback(context); 
} 

En JSF 2.0, en lugar de utilizar FacesContext#isPostback(), que bajo las sábanas en realidad delegados a ResponseStateManager#isPostback().

public static boolean isPostback() { 
    return FacesContext.getCurrentInstance().isPostback(); 
} 
+0

podemos verificar isPostback en la página jsf (no en código java)? –

+4

La instancia actual de 'FacesContext' está disponible en el alcance de EL por' # {facesContext} ', por lo que debería hacer esto:' # {facesContext.postback} '. – BalusC

6

De hecho, antes de jsf1.2, isPostBack se obtuvo a través del requestScope of the current instance of FaceContext.

Desde JSF1.2, La ResponseStateManager (clase de ayuda a StateManager que conoce la tecnología de renderización específica que se utiliza para generar la respuesta, un singleton clase abstracta, expendido por el RenderKit.)

Durante el restaurar la fase de vista del ciclo de vida, ViewHandler retrieves the ResponseStateManager object para probar si la solicitud es una devolución de datos o una solicitud inicial.

Si una solicitud es una devolución de datos, se llama al método therestoreView de ViewHandler. Este método usa el objeto RespuestStateManager para volver a generar el árbol de componentes y restaurar el estado. Después de construir el árbol y restablecer el estado, la instancia de ViewHandler no es necesaria hasta que la fase de respuesta al renderizado vuelva a ocurrir.

Ese artículo mencionado más arriba (Creating and Using a Custom Render Kit) ilustra cómo implementar/obtener una ResponseStateManager, a través de un RenderKit (definido por el controlador de etiqueta implemente la etiqueta que hace que el componente).
¿Puede ser esto suficiente para obtener su propio ResponseStateManager en su contexto?

+0

gracias por tu exhaustividad (te voté). Necesitaba una pista más práctica, ahí es donde puedo obtener una instancia de ResponseStateManager que está usando mi implementación: más tarde descubrí que simplemente puedo acceder a RenderKit desde FacesContext y usar getResponseStateManager() –

2

Para JSF1.2

public static boolean isPostback(){ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM); 
} 
Cuestiones relacionadas