Como saber se estou em uma nova postagem?
Pergunta
Eu li em docs JSF que ResponseStateManager
tem um método isPostBack()
. Como (e onde) eu posso ter uma instância de ResponseStateManager
?
Solução
Como saber se estou em uma nova postagem?
Depende da versão JSF.
No JSF 1.0 / 1.1, não há nenhuma ResponseStateManager#isPostback()
método disponível. verifique se o parâmetro javax.faces.ViewState
está presente no mapa pedido de parâmetros como disponível por ExternalContext#getRequestParameterMap()
.
public static boolean isPostback() {
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
return externalContext.getRequestParameterMap().contains("javax.faces.ViewState");
}
No JSF 1.2, de fato usar ResponseStateManager#isPostback()
que por sua vez, na verdade, verifica a presença de parâmetro javax.faces.ViewState
no mapa de solicitação de parâmetro.
public static boolean isPostback() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getRenderKit().getResponseStateManager().isPostback(context);
}
No JSF 2.0, em vez disso use FacesContext#isPostback()
, que debaixo das cobertas realmente delegados ResponseStateManager#isPostback()
.
public static boolean isPostback() {
return FacesContext.getCurrentInstance().isPostback();
}
Outras dicas
Na verdade, antes jsf1.2, IsPostback foi obtida através da requestScope da instância atual de FaceContext .
Desde JSF1.2, O ResponseStateManager (classe auxiliar para StateManager que conhece a tecnologia de renderização específico que está sendo usado para gerar a resposta, um singleton classe abstrata ??strong>, vended pela RenderKit.)
Durante a vista fase do ciclo de vida de restauração, ViewHandler recupera o ResponseStateManager objeto a fim de testar se a solicitação é uma nova postagem ou um pedido inicial.
Se a solicitação é uma nova postagem, o método therestoreView de ViewHandler é chamado. Este método usa theResponseStateManager objeto para re-construir a árvore de componentes e restaurar o estado. Depois que a árvore é construída e estado é restaurado, instância theViewHandler não é necessário até que a fase de resposta tornar ocorre novamente.
Esse artigo mencionada acima ( Criação e Utilização de renderização um personalizado Kit ) ilustra como implementar / obter uma ResponseStateManager, através de um RenderKit (definido pelo manipulador de tag implementar a etiqueta que torna o componente).
Pode ser este é o suficiente para que você comece seu próprio ResponseStateManager no seu contexto?
Para JSF1.2
public static boolean isPostback(){
FacesContext context = FacesContext.getCurrentInstance();
return context != null && context.getExternalContext().getRequestParameterMap().containsKey(ResponseStateManager.VIEW_STATE_PARAM);
}