[RESOLVIDO]Desabilitar Cache do Navegador - JSF 2.0 + Primefaces

Boa tarde Senhores,

Estou desenvolvendo um sistema JSF 2.0 + Primefaces pela primeira vez e estou me deparando com a seguinte situação:

Tenho um formulário e um Bean. Os campos do formulários são setados no objeto da bean e tudo funciona normalmente. Estou trabalhando com abas e, mesmo eu dando um new Object() no meu objeto da bean, NEM SEMPRE quando eu volto a aba, os campos do formulário são limpos (já chequei o update e também a função que dá o new object()). O que me leva a crer que se trata de cache do navegador, pois é bem inconstante. Visto isto, fui googlelizar hehe… encontrei a seguinte classe:

package utils;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletResponse;

public class CacheControl implements PhaseListener {

	private static final long serialVersionUID = 1L;

	public PhaseId getPhaseId() {

		return PhaseId.RENDER_RESPONSE;

	}

	public void afterPhase(PhaseEvent event) {

	}

	public void beforePhase(PhaseEvent event) {

		FacesContext facesContext = event.getFacesContext();

		HttpServletResponse response = (HttpServletResponse) facesContext

		.getExternalContext().getResponse();

		response.addHeader("Pragma", "no-cache");

		response.addHeader("Cache-Control", "no-cache");

		response.addHeader("Cache-Control", "no-store");

		response.addHeader("Cache-Control", "must-revalidate");

		response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");

	}

}

Devidamente registrada no faces-config.xml:

<lifecycle>
    <phase-listener id="nocache">utils.CacheControl</phase-listener>
</lifecycle>

Porém, o problema persiste…

Alguém tem alguma sugestão ae?

Um abraço a todos!

no meu projeto
estou trabalhando com abas e não tenho esse problema
após dar o submit

Estranho o new Obj(); // não funcionar

já testou com outro browser?

Já tentou zerar os atributos do objeto?
Não sei se é a melhor forma, mas dá certo.

[quote=tmvolpato]no meu projeto
estou trabalhando com abas e não tenho esse problema
após dar o submit

Estranho o new Obj(); // não funcionar

já testou com outro browser?[/quote]

Já sim… Chrome e I.E.

O mais estranho é que alguns campos vem preenchidos e outros não… Sendo que o objeto é um só… o.0

[quote=lordkure]Já tentou zerar os atributos do objeto?
Não sei se é a melhor forma, mas dá certo.[/quote]

Você quer dizer, zerar os atributos um a um? Dai eu perco velocidade de desenvolvimento e padronização =/

cara eu acho que isso pode servir :

http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

não, nada disso…

no método salvar
abaixo dele vc tem

exemplo:

selecioneBean = new Usuario(); //ele limpa todos os campos, para que possa ser adicionado um novo sem sujeira do anterior

e alguns campos são limpos e outros não
deve ter alguma coisa estranha na aplicação
isso não é cache, percorra seu código
e olhe os campos onde os dados ainda persiste
após o submit

Após dar o submit
alguns dados ainda é mantido? é esse o problema neh?

[quote=Polverini]cara eu acho que isso pode servir :

http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/
[/quote]

Acho que deve ser isso mesmo Polverini… ótimo artigo!

Quero fazer uma tentativa com a “maneira educada” descrita no exemplo, porém… devo usar esta classe onde? registrar como lifecycle? onde implemento isto?

Obrigado

Opaa… consegui entender e aplicar a classe do artigo que vc me enviou.

Caso seja útil a alguém, segue:

1 - Leia o artigo do Rafael Ponte em: http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

Após entender o motivo do problema, execute uma das soluções propostas, eu no caso, escolhi a que o próprio autor diz utilizar, a “maneira educada” de se limpar a árvore de componentes.

O próprio autor fornece uma classe que implementa a solução, para utiliza-la, faça o seguinte:

No bean, crie um objeto UIForm:

private UIForm form;

No arquivo xhtml, ao declarar o form, ligue-o ao objeto criado no bean:

<h:form id="formCadastro" binding="#{bean.form}">

E no(s) método(s) em que você instancia um novo objeto que se utiliza no form, execute o método da classe que o Rafael Ponte generosamente forneceu à comunidade:

NomeDaClasse.cleanSubmittedValues(form);

Problema resolvido!

Obrigado Polverini pela dica, Obrigado Rafael Ponte pelo artigo e a todos que leram e ajudaram com dicas…

Um abraço