[RESOLVIDO] VRaptor + Ajax

Pessoal tudo blz ?
Estou com um problema que faz um bom tempo, depois de pesquisa e várias tentativas diferentes não conseguir resolver. Talvez exista algum caminho melhor ou mais prático. Mas ai vai.

Tenho uma página com um formulário e o seguinte código:

jQuery(document).ready( function() { $('#userRegisterForm').submit(function(){ $(this).ajaxForm(); $(this).ajaxSubmit({ success: function(){ alert('Sucesso'); }, error: function(){ alert('Erro'); } }); return false; }); É uma página de cadastro de usuário qualquer. A ideia é que deve existir uma validação se o login do usuário já está sendo utilizado. Para isso criei um método no controlador com o seguinte código. public void saveUser(Users pUser) { if (!mUserService.existsUser(pUser)) { mUserService.saveUser(pUser); mResult.nothing(); } else { mResult.notFound(); } } De acordo com minhas pesquisas isso apenas deveria funcionar. NotFound para erro e nothing para sucesso. Mas quando ocorre o caso de erro - NotFound - ele me redireciona para uma página com erro 404 idicando que não há nenhum resource. Essa é a maneira correta de utilizar Ajax com o VRaptor pra esse tipo de validação ? Existe alguma maneira mais prática ? Como fazer que esse modo que implementei funcione? Já tentei de várias maneiras diferentes, procurei erros bobos e nada. Agradeço desde já a paciência ! Estou dando alguns primeiros passos com VRaptor num projeto de faculdade. Qualquer indicação de leitura - não sendo a documentação oficial - é bem vinda ! Abraços e boa noite

Primeiro, dá uma lida nesse tópico para que você consiga postar melhor aqui no GUJ, assim a gente consegue entender melhor o que você está precisando:
http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor

Eu achei estranho ele te redirecionar para o 404, já que você fez o return false;…
Tenta acrescentar o event.preventDefault(); no submit do form:

$('#userRegisterForm').submit(function(event){ 
// Seu ajax aqui
event.preventDefault();
return false;
});

Acho que isso deve resolver…

e verifica se a url está correta, com o context path na frente de tudo

Opa ! Ok … nos proximos posts vou utilizar a formatação correta. Perdão pelo desleixo.

Bom cara, fiz isso que me disse e ainda sou redirecionado pra página de erro 404. O erro é "The requested resource () is not available."
A URL que ele me envia é a específica pra esse método saveUser() que no caso é “/user/new”.

Não deveria ser a url da página de cadastro - no caso “/user/register”? Nem deveria recarrega-la não é ?

Obrigado !

Abraços

a action do form tem que ser uma url com /user/register se essa é a lógica que salva o usuário… e essa lógica precisa ter uma chamada a:

result.redirectTo( <<<alguma coisa >>> );

ou precisa existir o jsp correspondente (/WEB-INF/jsp/user/register.jsp)
de preferencia a primeira opção.

Ainda não entendi.

Existe um página que chama register.jsp. O meu controlador esta assim.

package ccc.webopine.controllers;

import ccc.webopine.business.UserService;

import br.com.caelum.vraptor.*;
import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results.*;
import ccc.webopine.business.interfaces.IUser;
import ccc.webopine.model.Users;
import java.util.ArrayList;
import java.util.List;

@Resource
public class UserController 
{
    private final IUser mUserService;
    private final Result mResult;

    public UserController(IUser pUserService, Result pResult) 
    {
        this.mUserService = pUserService;
        this.mResult = pResult;
    }
    

    public void register()
    {     
    };

    public void saveUser(Users pUser)
    {      
        if (!mUserService.existsUser(pUser)) 
        {
            mUserService.saveUser(pUser);
            mResult.nothing();
        }
        else        
        {     
            
            mResult.notFound();             
        }
    }
}

O action do form está redirecionando para esse método saveUser() que tem a URL “/user/new”.
Isso ta errado ? Qual a forma mais correta pra isso ?
Estou usando o CustomRoutes tbm que esta assim.

package ccc.webopine.infra;

import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.http.route.RoutesConfiguration;
import br.com.caelum.vraptor.http.route.Rules;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import ccc.webopine.controllers.HostController;
import ccc.webopine.controllers.LoginController;
import ccc.webopine.controllers.UserController;
import ccc.webopine.model.Users;


@Component
@ApplicationScoped
public class CustomRoutes implements RoutesConfiguration {

    @Override
    public void config(Router pRouter) {
        new Rules(pRouter) {
            @Override
            public void routes() { 
                
                routeFor("/user/new").is(UserController.class).saveUser(null);


            }
        };
    }
}

Qual é a maneira correta de fazer isso ?

Obrigado !

eu geralmente prefiro usar:

@Post("/user/new")
 public void saveUser(Users pUser)   {...}

@Get("/user/register")
 public void register(Users pUser)   {...}

do que criar o CustomRoutes

se ainda tá dando 404, tenta ver se o action do form está certo:

<form action="<c:url value="/user/new"/>">
...

Ok,

Vou começar dessa maneira. Achei mais legível também. Mas porém ainda não entendi. Qual lógica que pode estar inserida dentro do método register() ? E pq ele ta com parâmetro ?
O action seria isso mesmo né ? /user/new ?

@Post
@Path("/user/new")
public void saveUser(Users pUser)
    {      
        if (!mUserService.existsUser(pUser)) 
        {
            mUserService.saveUser(pUser);
            mResult.nothing();
        }
        else        
        {     
            
            mResult.notFound();             
        }
    }

Seria só isso ?
Desculpe pela ignorância. Acho que não entendi então. Tinha lido a documentação sobre essa parte.

Abraços !

A função saveUser() é chamada. Os métodos de negócio são executados com sucesso.
Só quando é retornado notFound() é direcionado pra pagina de erro 404 com a url “/user/new”.

Alguma ideia ?

se tá passando no .notFound() ele vai pra página do 404 mesmo… é isso que esse método faz.

o parametro pUser será populado com dados do formulário…

<input name="pUser.nome" value="..."/>
<input name="pUser.email" value="..."/>

dá uma olhada na doc completa:
http://caelum.github.com/vraptor/docs/guia-de-um-minuto/

Mas eu queria retornar um erro pra página e na função do ajaxSubmit ele pegar o erro e imprimir um alert na tela. Não ir pra outra página.

blz, vc pode colocar o notFound() ou qqer outro status… o problema é que seu javascript não tá funcionando…

vc tem que bloquear o submit default do form… vc colocou o código que o rafael falou?

Sim … já coloquei. Mas ainda não está funcionando. Pode ser o javascript msm. To procurando algum que funciona mas tudo a msm coisa.

vc tá com o Firefox com firebug?

tent ver se não tem algum erro no javascript (ele te mostra os erros)…

mova o event.preventDefault(); pra primeira linha também:

.....submit(function(e) {
   e.preventDefault();
   //chamada ajax aqui
   return false;
});

Nada cara. Sem erros e ainda assim envia pra pagina 404. Se eu colocar esse código antes o submit não é executado.

cola aqui de novo o javascript que vc tá usando

[code]$(document).ready(function() {
$(’#userRegisterForm’).submit(function(e){

        $(this).ajaxForm();
        $(this).ajaxSubmit({
            
            success: function(){
                
                alert('Sucesso');
            },
            error: function(){
                
                alert('Erro');
            }
        });
        e.preventDefault();
        return false;
    });
});  [/code]

mude pra isso:

    $(document).ready(function() {          
            $('#userRegisterForm').submit(function(e){  
                    e.preventDefault();
                $(this).ajaxSubmit({  
                      
                    success: function(){  
                          
                        alert('Sucesso');  
                    },  
                    error: function(){  
                          
                        alert('Erro');  
                    }  
                });  
              
                return false;  
            });  
        });    

Agora o método nem ta sendo chamado. O formulário me parece não ta sendo submetido.