[RESOLVIDO] Resposta do JSP para AJAX

Uma dúvida, estou com um sistema aqui que funciona da seguinte maneira.

Tenho um form que envia os dados para meu controller com um método autentica (/login), o método processa a informação e precisa devolver, para minha página JSP onde está meu código ajax, uma resposta de sucesso ou erro.

Eu estou usando o result para dar a resposta. Meu problema é que o login dando errado ou verdadeiro, ele sempre cai em “success” em meu ajax.
Por parâmetro, o ajax recebe uma página inteira html. Gostaria de saber, como posso passar apenas uma variável de resposta, é possível?

Meu método autentica:

@Post ("/autenticar") public void autenticar(Usuario usuario) { Usuario user = dao.logar(usuario); if (user != null) { System.out.print("\nLogado!"); result.include("msg", "success").redirectTo(this).login(); } else { System.out.print("\nNão logado!"); result.include("msg", "error").redirectTo(this).login(); } }

Meu ajax:

$.ajax({ type: 'post', url: '${pageContext.request.contextPath}/autenticar', data: form, beforeSend: function(){ alert("init login"); }, success: function(data){ alert("resposta - " + data); }, error: function(erro){ alert("resposta - " + erro); } });

Obrigado.

Amigo,

Sempre vai cair no success, pois é uma resposta http com sucesso (200-OK).
Se quiser que caia em erro, uma forma é disparar uma excessão.
Ou senão fazer o parser do resultado em javascript, o que costuma dar um pouco de trabalho.

Neste tipo de caso eu gosto de utilizar o DWR (http://directwebremoting.org)
Ele facilita demais o trabalho fazendo a parte suja do AJAX… desta forma você pode voltar o objeto todo para o Javascript e facilitar o tratamento. Faça um teste.

Boa sorte

jmmenezes, estava dando uma pesquisada e vi dois métodos da classe Result, nothing() e notFound().

Testei aqui e deu certo, ele envia para success ou para error. O problema é que no firebug ele mostra a seguinte mensagem:

[quote]POST http://localhost:8090/taskertest/autenticar
200 OK
1.15s
jquery…min.js (line 4)
POST http://localhost:8090/taskertest/autenticar

404 Not Found
1.01s
jquery…min.js (line 4)
“NetworkError: 404 Not Found - http://localhost:8090/taskertest/autenticar”[/quote]

O erro acontece pois eu forço o mesmo, isso é uma prática terrível né? hehehe
Estou vendo aqui sobre o DWR.

[quote=italoborges]jmmenezes, estava dando uma pesquisada e vi dois métodos da classe Result, nothing() e notFound().

Testei aqui e deu certo, ele envia para success ou para error. O problema é que no firebug ele mostra a seguinte mensagem:

[quote]POST http://localhost:8090/taskertest/autenticar
200 OK
1.15s
jquery…min.js (line 4)
POST http://localhost:8090/taskertest/autenticar

404 Not Found
1.01s
jquery…min.js (line 4)
“NetworkError: 404 Not Found - http://localhost:8090/taskertest/autenticar”[/quote]

O erro acontece pois eu forço o mesmo, isso é uma prática terrível né? hehehe
Estou vendo aqui sobre o DWR.[/quote]

Então… se você forçar o not found virá um 404… se forçar uma exception provavelmente um erro 500… Não acho legal em nenhum dos casos, pois este erro do ajax seria um erro da requisição, tipo problemas com a requisição, que é diferente de um tratamento de erro especifico, você digitou uma senha e não aceitou é bem diferente de deu um erro estranho no servidor pois falta arquivo ou não conseguiu se conectar no banco de dados por problemas na rede. Não sei se conseguiu entender a diferença.

Por isto que acho que o erro de não conseguiu se logar deve voltar em uma mensagem e ser tratado fazendo o parser da resposta. O erro do Ajax deve ser usado apenas para problemas inesperados (por exemplo, erro no servidor, erro de rede, etc). Mas fazer este tratamento com DWR fica muito mais facil…

Valeu jmenezes, foi testar esse DWR.

Consegui achar uma solução, usar o result para enviar uma resposta:

this.result.use(Results.json()).from(retorno).serialize();

Desse jeito eu consigo pegar o valor do retorno no meu JSP. Achei mais simples e fácil para tratar valores true ou false.