Problema no cadastro de novo usuario. JSF 2 JPA 2  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

Boa Tarde gente,

Fiz um cadatros simples de Usuarios no JSF 2.

Depois de testar um pouco, vi que depois que eu cadastro um usuario novo se eu atualizar a pagina aparece aquela janela que pede para reenviar os dados e assim acaba duplicando meu usuario na base...

Vocês podem me falar um jeito de contornar essa situação?

Valeuu...Abraços
Ace
Java Ninja
[Avatar]

Membro desde: 23/04/2009 22:00:35
Mensagens: 256
Offline

Fala, Felipe Moraes
Faça uma requisição via ajax, assim vc resolve este problema..!

vlw




FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Felipe Moraes wrote:Boa Tarde gente,

Fiz um cadatros simples de Usuarios no JSF 2.

Depois de testar um pouco, vi que depois que eu cadastro um usuario novo se eu atualizar a pagina aparece aquela janela que pede para reenviar os dados e assim acaba duplicando meu usuario na base...

Vocês podem me falar um jeito de contornar essa situação?

Valeuu...Abraços

Normal amigo..."atualizar a pagina" para o navegador nada mais é que enviar o mesmo pedido anterior enviado!! Se o ultimo foi um cadastro, transação bancaria...JA ERA!!
bem vindo a WEB! kkkkk
Para contornar isso em processos transacionais use o pattern velho de guerra - SINCRONIZED TOKEN
http://www.refactoring.com/catalog/introduceSynchronizerToken.html
http://www.javaworld.com/javaworld/javatips/jw-javatip136.html

This message was edited 1 time. Last update was at 13/09/2011 14:52:51


Fernando Franzini
[Email] [WWW]
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

FernandoFranzini wrote:
Felipe Moraes wrote:Boa Tarde gente,

Fiz um cadatros simples de Usuarios no JSF 2.

Depois de testar um pouco, vi que depois que eu cadastro um usuario novo se eu atualizar a pagina aparece aquela janela que pede para reenviar os dados e assim acaba duplicando meu usuario na base...

Vocês podem me falar um jeito de contornar essa situação?

Valeuu...Abraços

Normal amigo..."atualizar a pagina" para o navegador nada mais é que enviar o mesmo pedido anterior enviado!! Se o ultimo foi um cadastro, transação bancaria...JA ERA!!
bem vindo a WEB! kkkkk
Para contornar isso em processos transacionais use o pattern velho de guerra - SINCRONIZED TOKEN
http://www.refactoring.com/catalog/introduceSynchronizerToken.html
http://www.javaworld.com/javaworld/javatips/jw-javatip136.html


Fernando, eu li os links que você mandou e dei uma pesquisada também e vi que o JSF 2 implementa já esse pattern...você sabe como eu faço para usar ele...ou eu realmente preciso implementar ele?

valeu
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

Ace wrote:Fala, Felipe Moraes
Faça uma requisição via ajax, assim vc resolve este problema..!

vlw


Ace, eu testei como você falou...e realmente resolve...só que eu acho que não é o jeito mais certo de tratar do problema...vou ver se consigo usando o synchronizer pattern como o FernandoFranzini falou...

Vlw
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Ace wrote:Fala, Felipe Moraes
Faça uma requisição via ajax, assim vc resolve este problema..!
vlw


O Ajax foi feito para fazer interações assíncronas com o servidor...se seu caso couber dentro do contexto do AJAX...resolve sim...pq o navegador não armazena as chamadas AJAX...mas se seu processo não tem AJAX não vai ser isso q justificara o uso !
Usar AJAX em processos q não precisa de chamada assíncronas pode gerar outros complicadores aia no sistema.

This message was edited 1 time. Last update was at 13/09/2011 15:33:20


Fernando Franzini
[Email] [WWW]
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Aonde vc leu que JSF já faz isso? Acho que não.....

This message was edited 1 time. Last update was at 13/09/2011 15:33:58


Fernando Franzini
[Email] [WWW]
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

FernandoFranzini wrote:Aonde vc leu que JSF já faz isso? Acho que não.....


Realmente Fernando, eu li errado...eu li que ele suporta...mas não diz que é nativo...erro meu...foi mal
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Pois é...seria é uma boa se tivesse especificação para isso...mas ainda não!
Bom, partindo do que os managed beans podem ficar na sessão, usar syncronized token é facil...vc pode usar String, Boolean ou até um objeto especifico para controlar isso....
Vc tem alguma duvida de como fazer?

Fernando Franzini
[Email] [WWW]
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

FernandoFranzini wrote:Pois é...seria é uma boa se tivesse especificação para isso...mas ainda não!
Bom, partindo do que os managed beans podem ficar na sessão, usar syncronized token é facil...vc pode usar String, Boolean ou até um objeto especifico para controlar isso....
Vc tem alguma duvida de como fazer?


Pra falar a verdade tenho...rsrs

eu até procurei algum exemplo na internet...mas todos usavam JSF 1 que eu não entendo nada...eu tava querendo alguma coisa mais simples...

você poderia me passar um exemplo???
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Estamos aqui para ajudar felipe...não se acanhe kkkkk
A coisa é bem simples....
1)Antes de vc entrar na tela de cadastro ai, vc atribui true para um boolean....tipo dentro action da chamada do menu que antecede o processo, ou na GUI anterior.
2)Quando o usuário gravar o registro...vc verifica a variável é true dentro de if...se for ele pode gravar...
3)Depois de gravar, vc atribuí false para essa boolean ai.
4)Caso o usuário duplique o request...vai estar false na variável e o código vai se desviado...com isso vc pode enviar uma mensagem de erro para o usuario ou tomar suas devidas medidas de acordo com a filosofia do seu sistema.
OBS - managed bean tem que estar na sessão.

This message was edited 2 times. Last update was at 13/09/2011 16:10:29


Fernando Franzini
[Email] [WWW]
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

FernandoFranzini wrote:Estamos aqui para ajudar felipe...não se acanhe kkkkk
A coisa é bem simples....
1)Antes de vc entrar na tela de cadastro ai, vc atribui true para um boolean....tipo dentro action da chamada do menu que antecede o processo, ou na GUI anterior.
2)Quando o usuário gravar o registro...vc verifica a variável é true dentro de if...se for ele pode gravar...
3)Depois de gravar, vc atribuí false para essa boolean ai.
4)Caso o usuário duplique o request...vai estar false na variável e o código vai se desviado...com isso vc pode enviar uma mensagem de erro para o usuario ou tomar suas devidas medidas de acordo com a filosofia do seu sistema.
OBS - managed bean tem que estar na sessão.


Vamos por partes então...por enquanto, minha aplicação só tem a tela de cadastro...então eu teria que colocar um filtro para setar uma variavel com um boolean na seção?

e depois no managed bean recuperar esse boolean e na hora de adicionar...eu checaria se a variavel era true e adicionava?...é isso??
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Vamos por partes então...por enquanto, minha aplicação só tem a tela de cadastro...então eu teria que colocar um filtro para setar uma variavel com um boolean na seção?
Sim....mas fazer um filtro só para isso é pura bobeira....na verdade vc tem que setar true quando o usuario entrar no cadastro!!! Normalmente via menu....

e depois no managed bean recuperar esse boolean e na hora de adicionar...eu checaria se a variável era true e adicionava?...é isso??
A variável boolean deve ESTAR no managed bean que ele tb deve estar na sessão.

Outra coisa que eu esqueci...o método da action do managed bean deve ser sinchronized evitando múltiplos http request entrar ao mesmo tempo....



E por ai vai....

This message was edited 1 time. Last update was at 14/09/2011 07:13:52


Fernando Franzini
[Email] [WWW]
Felipe Moraes
Thread.start()

Membro desde: 02/02/2009 10:22:44
Mensagens: 34
Offline

FernandoFranzini wrote:Vamos por partes então...por enquanto, minha aplicação só tem a tela de cadastro...então eu teria que colocar um filtro para setar uma variavel com um boolean na seção?
Sim....mas fazer um filtro só para isso é pura bobeira....na verdade vc tem que setar true quando o usuario entrar no cadastro!!! Normalmente via menu....


Não entendi essa parte...por exemplo logo que o usuario acessar a tela de cadastro, o ManagedBean de cadastro vai ser instanciado certo?...então eu colocaria



dentro do construtor do Managed Bean???

e como assim via menu???
FernandoFranzini
GUJ Master
[Avatar]

Membro desde: 24/04/2009 12:58:16
Mensagens: 1541
Offline

Construtir nãoooooo!! Dai o pattern nao funciona!
vc vai atribuir TRUE nela quando o usuário indicar que esta entrando para fazer a operação gravar!! Normalmente é de um menu!
pensa assim...como sua aplicação vai saber que é para mostrar a tela de cadastro?
Quando o usuario click no menu "CADASTRO TAL"...dai vc faz um action

This message was edited 1 time. Last update was at 14/09/2011 09:24:37


Fernando Franzini
[Email] [WWW]
 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team