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.