Bom eu estou desenvolvendo um projeto pequeno aonde eu faço faculdade e comecei a utilizar o VRaptor + Hibernate.
Eu gostaria de saber qual a melhor forma de validação utilizando esses dois frameworks.
Por exemplo
Quero adicionar um produto no banco.
Tenho as validações na página normalmente mas preciso validar tbm no camada de negócio, se por exemplo, existe algum produto com o mesmo nome.
Qual a melhor forma de realizar isso? Caso o usuário tenha digitado um nome que já existe deve aparecer um alert na página informando isso.
Agradeço a paciẽncia !
nesse caso… vc faz um ajax e verifica apenas se o nome está igual…
da pra fazer logo quando ele sai do input, instantâneo.
se vc tiver dificuldade grita que eu te dou as coordenadas
V
vitor.morales
Opa!
Eu li a documentação sim… até acompanho ela.
Mas queria saber se existe modo melhor do que aquelas regras no controle.
Essa validação Ajax como é? Tem como da um exemplo ou indicar um link?
Abraços
Vitor Morales
K
kadu.m.lino
vc pode fazer a sua!
de qualquer forma vc terá que fazer no controller… ou delegar pra uma outra camada que vai ter que retornar pro controller!
mas qual o problema de fazer no controller?
por ajax vc faria assim
vc manda o objeto e verifica no controller… vc faria + - assim
um jeito bom é usar as anotações do bean validations… tipo @NotNull, @NotEmpty, @Length, etc… e no VRaptor usar só:
validator.validate(objeto);
V
vitor.morales
Pessoal.
Acho que esse modo vai resolver meu problema. Mas gostaria que fosse algo assim.
Ao enviar o formulário eu faço um monte de validação via javascript como se os campos estão no formato válido etc …
Gostaria uma requisição ajax que chamasse o método pra adicionar o produto e neste método tem as validações do tipo se já existe.
Caso tenha sucesso ou erro eu devo retornar uma mensagem específica pra tela e mostrar num alert por exemplo sem que seja necessário recarregar a página.
Como faria isso de um modo limpo ?
Eu implemento no .submit() do formulário umas validações javascript mesmo, mas necessito dessa lógica de validação também na camada da aplicação.
Agradeço a paciência ai !
Caso puderem dar um exemplo simples ou enviar alguma página que contenha um exemplo melhor ainda !
Abraços !
Vitor Morales
K
kadu.m.lino
Eai vitor!
vc pode fazer por ajax msm! o exemplo que te dei funciona para o seu caso! ou não?
por exemplo… se vc quer validar se o login de um usuário já foi cadastrado… no envento onblur do seu input vc teria um evento
e nele teria uma função ajax que bateria no controller e o controller te retornaria uma resposta de que achou ou não esse nome no banco! ou qualquer outra lógica de validação que vc precisar!
qual o problema que vc está tendo?
V
vitor.morales
É mais ou menos isso …
Mas como eu faço pra retornar um mensagem de erro do controlador pra página ?
Do tipo … dentro do método de adição possui alguns validações e pra cada validação eu preciso retornar uma mensagem diferente.
Como faço isso ?
e eu tenho essas validações javascript que não foram feitas por mim … como integraria isso dentro da função ajax submit ?
$('#newNetworkForm').submit(function(){//Validaçõesantesdeexecutarocomandofinalif($("#nomeRede").val()==""){$('#nomeRede').css('border','red solid 1px');alert("Digite um nome");$('#nomeRede').focus();returnfalse;}
elseif($("#localRede").val()==""){
$('#localRede').css('border','red solid 1px');alert("Digite um Local");$('#localRede').focus();returnfalse;}
elseif($("#ipRede").val()==""){
$('#ipRede').css('border','red solid 1px');alert("Digite um IP");$('#ipRede').focus();returnfalse;}
elseif($("#mascaraRede").val()==""){
$('#mascaraRede').css('border','red solid 1px');alert("Digite uma Máscara");$('#mascaraRede').focus();returnfalse;}
else//ValidaçãodeIpeMaskif(validarIP($("#ipRede").val())==false){
alert("Digite um IP válido");$("#ipRede").val("");$("#ipRede").focus();returnfalse;}
elseif(validarIP($("#mascaraRede").val())==false){
alert("Digite uma Máscara válida");$("#mascaraRede").val("");$("#mascaraRede").focus();returnfalse;}
elseif((validarIP($("#gatewayRede").val())==false)){
alert("Digite um Gateway válido.");$("#gatewayRede").val("");$("#gatewayRede").focus();returnfalse;}
$("#ipRede").val(ip2long($("#ipRede").val())); $("#mascaraRede").val(ip2long($("#mascaraRede").val())); $("#gatewayRede").val(ip2long($("#gatewayRede").val()));});
Sem que eu precise redirecionar ou recarregar a página até pq a navegação tbm ta via ajax.
Ao clicar num item do menu ele carregar uma outra página dentro de um div na página principal
L
Lucas_Cavalcanti
se vc quiser fazer isso batendo no servidor, vc pode fazer algo do tipo:
O meu formulário agora envio via ajax e faço as validações dentro do metodo addNetwork.
Mas como eu retorno uma mensagem de erro dessa forma pra ser exibido no error: do ajax ?
@Restrict@Post("/network/add")publicvoidaddNetwork(Networkp_network){if(NETWORK_SERVICE.checkExistentNetwork(p_network.getName())){VALIDATOR.add(newValidationMessage("Nome de rede existente.","error"));}else{RESULT.nothing();}}
Ta imprimindo o object como faço pra pegar a mensagem que coloquei ali ? Essa era a pergunta.
Tem algo de errado nisso ?
K
kadu.m.lino
Ficaria assim o seu controller:
if (NETWORK_SERVICE.checkExistentNetwork(p_network.getName())) {
validator.add(new ValidationMessage("Nome de rede existente.", "error"));
}
validator.onErrorSendBadRequest();
result.nothing();
@Restrict@Post("/network/add")publicvoidaddNetwork(Networkp_network){if(NETWORK_SERVICE.checkExistentNetwork(p_network.getName())){VALIDATOR.add(newValidationMessage("Nome de rede existente.","error"));}VALIDATOR.onErrorSendBadRequest();RESULT.nothing;//...
L
Lucas_Cavalcanti
ele chega a passar pelo controller?
V
vitor.morales
Ta passando sim .
Tive que alterar só o endereço no ajax de “/network/add” para "network/add"
Mas ainda a mensagem não ta sendo exibida.
o formulário tem que ser @Post, mas nesse caso vc tá fazendo um ajax ANTES de submeter o formulário, só pra verificar se a validação está correta. Como esse ajax não modifica nada no servidor, pode ser @Get sem problemas.
V
vitor.morales
entendi ali em cima …
Mas nesse caso cara
Eu vou fazer essa validação na hora que enviar o formulário e se caso existir algum registro com o mesmo nome eu retorno o erro senão já faço o cadastro no banco
Então deveria nesse caso enviar por post mesmo … tem alguma forma ?
L
Lucas_Cavalcanti
o ideal é vc no success fazer um form.submit() de verdade… algo como isso:
assim se a requisição ajax deu tudo certo vc faz o submit de tudo.
L
Lucas_Cavalcanti
faltou uma coisa, tem que dar um return false no final desse callback de submit
V
vitor.morales
Entendi … mas como eu faço para não realizar o submit no caso de erro ?
E no caso de sucesso eu não gostaria de retornar pra nenhuma outra página … mas só enviar de volta uma mensagem de sucesso que vai aparecer num alert do tipo "Cadastro realizado’.
L
Lucas_Cavalcanti
então o que vc quer é mais parecido com esse plugin do jquery:
mas como no caso eu faço pra caso caia no error … ele retornar falso e cancelar o submit ?
$.getJSON("network/validate",
{
"p_network.name" : $("#nomeRede").val()
})
.error(function(data) {
alert("Existe rede com o mesmo nome");
return false;
}) ;
L
Lucas_Cavalcanti
se vc vai fazer um ajaxForm já, faz a validação já no método que recebe o post do form, não precisa criar um método a mais…
daí vc consegue tratar o erro já no showError
V
vitor.morales
Ok …
E no showError como receber a mensagem do validator ? To procurando aqui no console mas não to conseguindo.
Na variavel err vem o valor Not Found não a mensagem
L
Lucas_Cavalcanti
a variavel responseText deveria ter o json, se passou por aquele onErrorSendBadRequest…
na verdade vc pode mudar esse onErrorSendBadRequest por: