[Resolvido] Recarregar página com ajax no Vraptor

Boa noite.É o seguinte , tenho um campo que o usuario digita o código do usuário e gostaria que quando o campo perdesse o foco carregasse o usuario correspondente ao código.Tentei fazer o seguinte:

@Post("/usr/existe/{usr.id}")
	public void existe(Usr usr) {
		usr = repository.loadById(usr.getId());	
		if (usr != null){
			System.out.println("Usuário encontrado");				
			result.include("usr", usr);
		}else{
			System.out.println("Usuário não encontrado");	
			result.nothing();	
		}		
         }

E no jsp esta assim :

function existe(id){
	$.post('existe/' + $("#id").attr('value'), function call_back(data){
    	$(document);		             
		    });
         }

O meu controller esta conseguindo pegar o valor digitado pelo usuário , e no console do eclipse não aparece erro algum , mas no console do firefox aparece o erro 404 not found.

ao invés de result.nothing() vc poderia usar result.notFound();

será que o problema não está na url que vc está passando no post? tenta fazer a url absoluta //usr/existe/

Ainda nada , o maior problema é que eu não sei se o que eu quero é assim que se faz e se é possivel.Por exemplo numa jsp comum passar um código para um controller e se este código existe eu só quero enviar os dados de um list para o jsp , populando os inputs . Não to achando um exemplo que faça o mesmo , teria algum para passar ,só o esquema básico.

vc colocou o caminho absoluto, começando com / no $.post?

se vc usar o result.notFound() qdo o cara não existe, a function que vc passou pro $.post não será executada, então faz o que vc quer.

Esta assim agora >:

function existe(id){	    		    	
		    $.post("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){
		    	$(document);		    	
		    });
		}

O controller:

@Post("/usr/existe/{usr.id}")
	public void existe(Usr usr) {
		usr = repository.loadById(usr.getId());	
		if (usr != null){
			System.out.println("Usuário encontrado");				
			result.include("usr", usr);
		}else{
			System.out.println("Usuário não encontrado");	
			result.notFound();
		}	
	}

O controller chega a achar o usuário e agora parou de aparecer o erro 404 no console do firefox , aparecendo o status 200 ok .Só não esta retornando os dados.

aonde está: $(document);

vc precisa fazer algo com o data que veio da função de callback… tipo colocar isso dentro de algum div. Ex:

$('#id_do_div').html(data);

outra coisa: isso poderia ser um $.get, já que vc não está modificando o servidor.

Funciona , obrigado ! Porem ele duplica o formulario , não tem como só alimentar os input text não ?

tem… o retorno html desse método traz só o form, ou uma página completa…

se for só o form, é só mudar o html de uma div (ou qqer elemento) que esteja em volta do form da página anterior

Resolvido !Só para finalizar , o código ficou assim :
Controller:

@Get("/usr/existe/{usr.id}")
	public void existe(Usr usr) {
		usr = repository.loadById(usr.getId());	
		if (usr != null){
			System.out.println("Usuário encontrado");				
			result.include("usr", usr);
		}else{
			System.out.println("Usuário não encontrado");	
			result.notFound();
		}	
	}

Script:

function existe(id){	    		    	
		    $.get("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){		    	  
		    	$('body').html(data);		    	
		    });
		}

Obrigado Lucas !

Eu coloquei como resolvido , mas não esta .Quando a requisição volta para a jsp ele volta sem a funcionalidade inclusive sem o código javascript que chama a requisição ! Resumindo só funciona na 1° vez que é executado !Deve ser algo bem simples que não estou achando ! Será que o problema é com o sitemesh que estou usando ?

a falta de funcionalidade da segunda vez não tem nada a ver com o sitemesh.
O problema é que vc substituiu o html da página inteira, mas o javascript não é executado novamente.

Então se vc fez algo do tipo:

$('#elemento').click(function() {
   //faz algo
});

qdo vc substituiu o html o novo #elemento não vai estar com esse callback configurado.

Dá pra resolver isso trocando o .click(funcao) por .live(“click”, funcao), e a mesma coisa pros outros eventos.

[quote=Lucas Cavalcanti]a falta de funcionalidade da segunda vez não tem nada a ver com o sitemesh.
O problema é que vc substituiu o html da página inteira, mas o javascript não é executado novamente.

Então se vc fez algo do tipo:

$('#elemento').click(function() {
   //faz algo
});

qdo vc substituiu o html o novo #elemento não vai estar com esse callback configurado.

Dá pra resolver isso trocando o .click(funcao) por .live(“click”, funcao), e a mesma coisa pros outros eventos.[/quote]

Assim ? Mesma coisa !

 $('#existe').live("click",function() {
			existe($("#id").attr('value'));  
	    });

Tentei tambem estas funções :

function existe(id){	    		    	
	$.get("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){
		$('#usrForm2').html(data);	    			    	
	});
}
	
function existe2(id){	    		    	
	$.get("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){
		$('#usrForm').html(data);	    			    	
	});
}
	
function existe3(id){	    		    	
	$.get("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){
		$('#usrForm').load(data);	    			    	
	});
}
	
function existe4(id){	    		    	
	$.get("${pageContext.request.contextPath}/usr/existe/" + $("#id").attr('value'), function call_back(data){
		$('pre').load('existe/1  #usrForm' );	    			    	
	});
}

function existe5(id) {  
    $  
    .ajax({  
        method : 'get',  
        url : "existe/" + id,  
            dataType : 'html',  
            beforeSend : function() {  
                $('#carregando').show(100);  
            },  
            complete : function() {  
                $('#carregando').hide(100);  
            },  
            success : function(retorno) {  
                console.log(retorno);  
                $('#usrForm').html(retorno);                  
            },  
            error : function(retorno) {  
                console.log(retorno);  
                if (retorno.status == 404) {  
                    $('#usrForm').html(  
                            'Houve um erro: ' + retorno.status + ' '  
                            + retorno.statusText);  
                } else {  
                    $('#usrForm')  
                    .html(  
                    'Houve um erro desconhecido entre em contato com o administrador.');  
                }  
            }  
    });  
}

function existe6(id){	    		    	
	jQuery.ajax({
		 url: "existe2/1", //URL de destino
		 dataType: "json", //Tipo de Retorno
		 success: function(json){ //Se ocorrer tudo certo
			console.log(json); 	            
		  $('#usrnome').val(json.usr.usrnome);
		  .......            
		 }
	});		
}  

Com nenhuma delas tive o resultado esperado , menos o ultimo que recebe json , mas não é o que eu queria pois teria que tratar campo a campo.Uma outra possibilidade que estava pensando é em separar o campo que é digitado o código num form diferente do restante .

Agora realmente esta resolvido.Eu pensava que o problema era com os script do Jquery , mas na verdade eu estava ertornando o resultado errado para a página.E re solvi com :

result.include("dusr", dusr).redirectTo(this).novo(); em vez de result.include("dusr", dusr);.E só fui perceber porque alterei todo o visual do formulário e o ajax estava me retornando o visual antigo.Mas não faço a mínima ideia da onde ele estava guardando o html antigo !

Pessoal estou com um problema, criei uma função de comentários em ajax, listar, adicionar e excluir. Os método estão funcionando normal, o problema está apenas no método result.nothing(); . Pelo que sei ele entende o sucess da requisição ajax, mas ele está parando na url do meu método Delete, e não indo para a página onde “tudo começou”. O que estou fazendo de errado ?

@Delete("/comentario/{id}/delete") public void deletar(int id){ Comentario comentario = dao.buscar(id); dao.deletar(comentario); result.nothing();

function onComentarioDelete() { $.ajax({ url: $(this).parent("form").attr("action"), type: 'DELETE', context: $('.lista-comentario'), sucess: $(this).parent('#coment').hide('slow').remove() }); };

Ou seja, quando o método é executado, ele para nesta url /comentario/{id}/delete, e não retorna a página onde fiz essa requisição.