Jsf Duplica quando precionado F5
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
Curtidas 0
Melhor post
Antonio Ishac
19/04/2011
Olá a todos, resolvi o problema criando um filter
Por favor gostaria de fechar o POST...
Agradeço pela ajuda de todos...
@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();
}
}
GOSTEI 1
Mais Respostas
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 !
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
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......
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
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
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
24/01/2011
Pessoal, alguém pode me ajudar ?
GOSTEI 0
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
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
24/01/2011
Olá Robson, é verdade, tem algum exemplo...
Obrigado pela resposta.
atenciosamente
Antônio Ishac
atenciosamente
Antônio Ishac
GOSTEI 0
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
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
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
24/01/2011
Problema Persiste ou foi corrigido ?
Caso esteja corrigido favor fechar a pendencia !
Valeu !
Caso esteja corrigido favor fechar a pendencia !
Valeu !
GOSTEI 0
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
24/01/2011
Resolvido ?
Se sim , por favor feche o chamado :)
Se sim , por favor feche o chamado :)
GOSTEI 0