Jsf Duplica quando precionado F5

Java

24/01/2011

Olá pessoal, preciso da ajuda de vcs. Tenho um fornulário para cadastro feito em JSF 2 com JPA 2. Quando Persisto no banco de dados ele gravra o registro, mas se por ventura dou um F5 o formulário é submetido novamente duplicando os registros. Gostaria de saber como posso ter esse controle sobre os meus formulários, tanto na insersão, update, exclusão.   O Struts tem um componente chamado 'synchronizer token' para esse tipo de gestão, não o conheço, fiz uma pesqisa na web e li alguma coisa sobre essa ferramenta.   Como posso estar implementando isso no JSF 2 para a minha gestão dos formulários sem o uso de JavaScript.   Atenciosamente Antônio Ishac
Antonio Ishac

Antonio Ishac

Curtidas 0

Melhor post

Antonio Ishac

Antonio Ishac

19/04/2011

Olá a todos, resolvi o problema criando um filter
 
@WebFilter(servletNames={"Faces Servlet"})
public class JPAFilter implements Filter {

private EntityManagerFactory factory;

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

 EntityManager entityManager = this.factory.createEntityManager();
 request.setAttribute("entityManager", entityManager);

 chain.doFilter(request, response);

 try {
 entityManager.getTransaction().begin();
 entityManager.getTransaction().commit();
 } catch (Exception e) {
 entityManager.getTransaction().rollback();
 } finally {
 entityManager.close();
 }
 }

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
 this.factory = Persistence.createEntityManagerFactory("estudojpaPU");

 }

 @Override
 public void destroy() {
 this.factory.close();
 }

}
 
  Por favor gostaria de fechar o POST...   Agradeço pela ajuda de todos...
GOSTEI 1

Mais Respostas

Dyego Carmo

Dyego Carmo

24/01/2011

F5 é como se voce estivesse enviando novamente o "comando" para o bean...

O JSF possui alguns mecanismos para evitar esse tipo de coisa....

mas se for chamada DIRETA... vai duplicar mesmo... voce vai ter que fazer chamadas indiretas para que este problema nao ocorra !

GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Ok Diego....

Meu formulário invoca o managedbean pelo <h:commandbutton action="#{meuBean.salva} />

Quero saber como posso fazer esse controle utilizando a tecnologia jsf 2 para que essas coisas não aconteça ?.

me ajudem......
GOSTEI 0
Andrei Hirata

Andrei Hirata

24/01/2011

POsta o codigo ae para eu ver...O que ta acontecendo é q vc ta usando POST e por isto a cada REFRESH, novos POST é dado. 
GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Amigo é uma implementação normal, o botão do formulário chama um managedBean, mas depois que a página é submetida e for dado um refresh na tela os dados novamente são submetidos, isso é normal, acontece mesmo. Eu só queria saber como posso fazer esse controle com JSF 2, mas tá dificil, ninguém me dá uma luz.... Atenciosamente Antônio Ishac 
GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Pessoal, alguém pode me ajudar ?
GOSTEI 0
Robson Teixeira

Robson Teixeira

24/01/2011

Olá Antonio
  Você poderia fazer uso do phase-listener ja que ele age dentro do ciclo de vida do JSF acredito que isso possa ajuda-lo.

att
  robson
GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Olá Robson, é verdade, tem algum exemplo... Obrigado pela resposta.

atenciosamente
Antônio Ishac
GOSTEI 0
Robson Teixeira

Robson Teixeira

24/01/2011

Olá antonio
 
  segue 1 exemplo do phase-listener aplicado somente a internacionalização para ter uma ideia com como usar-lo para tratar as suas requisição quando usa o f5.

import javax.faces.event.PhaseListener;

public class LocalePhaseListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {
        if (event.getPhaseId().equals(PhaseId.RESTORE_VIEW)){
            if (SessionManager.getUsuarioInSession()!=null && SessionManager.getUsuarioInSession().getIdioma()!=null){
                event.getFacesContext().getViewRoot().setLocale((Locale)
                        new Locale(SessionManager.getUsuarioInSession().getIdioma()));
            }else{
                event.getFacesContext().getViewRoot().setLocale(
                        JsfUtil.getFacesContext().getApplication().getDefaultLocale());
            }
        }
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        if (event.getPhaseId().equals(PhaseId.RENDER_RESPONSE)){
            if (SessionManager.getUsuarioInSession()!=null && SessionManager.getUsuarioInSession().getIdioma()!=null){
                event.getFacesContext().getViewRoot().setLocale((Locale)
                        new Locale(SessionManager.getUsuarioInSession().getIdioma()));
            }else{
                event.getFacesContext().getViewRoot().setLocale(
                        JsfUtil.getFacesContext().getApplication().getDefaultLocale());
            }
        }
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

}



adicionar no faces-config

<lifecycle>
        <phase-listener>br.com.view.util.listener.LocalePhaseListener</phase-listener>
    </lifecycle>

espero que tenha ajudado
att
  robson
GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Ok Robson, obrigado pela resposta e explicação. Vou tentar implementar, caso não consigo irei postar minha dúdida.   atenciosamente Antônio Ishac
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/01/2011

Problema Persiste ou foi corrigido ?

Caso esteja corrigido favor fechar a pendencia !

Valeu !
GOSTEI 0
Antonio Ishac

Antonio Ishac

24/01/2011

Não ainda persiste o problema, estou tentando implementar a solução dita pelo Robson, mas ainda não consegui, estou pesquisando...   Caso tenha alguma solução me avise.   Atenciosamente Antônio Ishac
GOSTEI 0
Dyego Carmo

Dyego Carmo

24/01/2011

Resolvido ?

Se sim , por favor feche o chamado :)
GOSTEI 0
POSTAR