[RESOLVIDO]vraptor com jquery validate

8 respostas
danielqaraujo

Aew galera, meu primeiro post aqui no guj!

Estou com um problemao aqui, to usando o vraptor e nao to conseguindo validar duplicidade de login no cadastro de usuário, to usando o jquery validate.
Segue abaixo o codigo:

$("#form").validate({ rules: { "usuario.nome": "required", "usuario.login": { required: true, remote: { url: "<c:url value='/usuario/validate' />", type: post } }, "usuario.senha": { required: true, minlength: 3 }, confirmaSenha: { required: true, equalTo: "#senha" } }, messages: { "usuario.nome": icone + "Por favor, digite o nome", "usuario.login": icone + "Por favor, digite o login", "usuario.senha": { required: icone + "Por favor, digite a senha", minlength: icone + "Por favor, sua senha deve ter pelo menos 3 caracteres" }, confirmaSenha: { required: icone + "Por favor, confirme a senha", equalTo: icone + "As senhas informadas não conferem" } }, errorContainer: "#erros", errorLabelContainer: "#erros ul", wrapper: "li", debug:true, submitHandler: function(form) { form.submit(); } });

Meu metodo java que retorna true se nao for encontrado e false se for encontrado o login.

@Post("/usuario/validate") public boolean validateLogin(Usuario usuario) { return dao.existeUsuario(usuario.getLogin()); }

required, minlength, equalTo estao todos funcionando, somente o remote q nao funciona de forma alguma, nao exibe a mensagem.
Alguem sabe como funciona o remote validate do jquery para validar duplicidade efetuando requisições usando o vraptor???

8 Respostas

Rafael_Guerreiro

O problema é que o VRaptor vai procurar uma JSP para colocar esse valor…
Naquele mesmo padrão de JSP do VRaptor. Quando ele não encontra, ele retorna erro.

Então vc precisa criar a JSP somente com um ${boolean} dentro.

danielqaraujo

Foi o que eu imaginei, ele da o erro de que nao achou o jsp mesmo.
Mas eu quero que permaneça na mesma jsp e que somente exiba a mensagem no errorContainer: “#erros”.
Como eu faria?

Rafael_Guerreiro

Ele vai permanecer naquela página.

Eu acho que JSON é a melhor forma de fazer, existem duas formas:

  1. sem JSP:
@Post("/usuario/validate")  
    public void validateLogin(Usuario usuario) {  
        result.use(Results.json()).withoutRoot().from(dao.existeUsuario(usuario.getLogin())).serialize();  
    }
  1. Com JSP:
// Controller
@Post("/usuario/validate")  
    public boolean validateLogin(Usuario usuario) {  
        return dao.existeUsuario(usuario.getLogin());  
    } 
// JSP. DETALHE: Essa JSP PRECISA ter o seguinte nome: validateLogin.json.jsp
// Se ela não tiver com o .json, o VRaptor não vai tratá-la como JSON.
${boolean}
danielqaraujo

eu tinha testado das duas maneiras que vc disse, mas nao funcionou.
no caso o meu codigo jsp está correto, certo?
o nome do meu jsp é form.jsp onde esta o codigo que exibi acima e o os campos do meu formulario de cadastro de Usuario.
fazendo com qualquer uma das duas maneiras que vc passou eh necessario modificar o nome do meu jsp para form.json.jsp ???

Rafael_Guerreiro

Não não!! Na verdade vc está confundindo as coisas.

Vc tem uma action chamada form. O VRaptor executa essa action e chama a form.jsp.

Quando a form.jsp é mostrada lá no browser, você vai precisar validar o usuário. Ai vc colocou o remote do validator.
O validator vai fazer uma requisição AJAX para o servidor, que vai acionar o VRaptor e este vai executar OUTRA action, a validateLogin.

Depois de executar essa action, você precisa dar algum retorno para o Browser… Seja ele uma página de erro ou um simples JSON.
Se você for fazer com JSP, voce vai ter 2 jsps na sua pasta: a form.jsp e a validateLogin.json.jsp

Me mostra o que você tentou.

danielqaraujo

Kra, não acredito, funcionou!!!
Fui testar pra ver o que tinha feito funcionar e foi um simples comando.
Antes eu tava usando assim no metodo java, e nao exibia a mensagem na tela:

Fiz assim como vc pediu usando o comando withoutRoot() e agora esta aparecendo a mensagem =D:

Nem acredito kra, muito obrigado mesmo pela ajuda, fiquei ontem quebrando a cabeça com isso a noite toda e nao tinha conseguido.
Vlw mesmo!!! =D

Rafael_Guerreiro

A diferença na saída é a seguinte:
Sem withoutRoots

{'boolean':'true'}

Com withoutRoots

'true'
danielqaraujo

Entendi!!!
Exatamente o que precisa ser retornado.
Eu pesquisei muito sobre o assunto e todos mostravam como funciona usando php, e no retorno eh assim:

ou seja, sem o withoutRoot nunca q iria funcionar! =D

Criado 22 de setembro de 2012
Ultima resposta 22 de set. de 2012
Respostas 8
Participantes 2