Fórum Jsf Duplica quando precionado F5 #394251

24/01/2011

0

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

Responder

Post mais votado

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...

Antonio Ishac

Antonio Ishac
Responder

Gostei + 1

Mais Posts

26/01/2011

Dyego Carmo

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 !

Responder

Gostei + 0

26/01/2011

Antonio Ishac

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......
Responder

Gostei + 0

29/01/2011

Andrei Hirata

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. 
Responder

Gostei + 0

31/01/2011

Antonio Ishac

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 
Responder

Gostei + 0

02/02/2011

Antonio Ishac

Pessoal, alguém pode me ajudar ?
Responder

Gostei + 0

02/02/2011

Robson Teixeira

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
Responder

Gostei + 0

03/02/2011

Antonio Ishac

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

atenciosamente
Antônio Ishac
Responder

Gostei + 0

05/02/2011

Robson Teixeira

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
Responder

Gostei + 0

06/02/2011

Antonio Ishac

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

Gostei + 0

11/02/2011

Dyego Carmo

Problema Persiste ou foi corrigido ?

Caso esteja corrigido favor fechar a pendencia !

Valeu !
Responder

Gostei + 0

11/02/2011

Antonio Ishac

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
Responder

Gostei + 0

26/04/2011

Dyego Carmo

Resolvido ?

Se sim , por favor feche o chamado :)
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar