vc tem o firebug no seu firefox?
se não tiver, instale-o e veja qual url essa função ajax está chamando…
essa url teste talvez esteja errada mesmo…
tenta colocar a url assim:
///teste
vc tem o firebug no seu firefox?
se não tiver, instale-o e veja qual url essa função ajax está chamando…
essa url teste talvez esteja errada mesmo…
tenta colocar a url assim:
///teste
O Firebug mostra o mesmo que está na jsp, cliquei lá em “script” e vi o conteúdo que aparece naquele console do Firebug.
Tentei de várias formas, /imobiliaria/foto/teste, /foto/teste, http://localhost:8080/imobiliaria/foto/teste, e não deu certo.
e a requisição, o que ele tah mostrando?
Opa!
Veja Lucas, ao chamar essa URL no browser ele redireciona para a página de adicionar fotos:
The requested resource (/imobiliaria/foto/adiciona/) is not available.
Conforme o meu método:
public void teste(Long idImovel, Long idFoto) {
result.include("mensagem", "dados recebidos" + idImovel + idFoto);
result.use(Results.logic()).redirectTo(FotoController.class).adiciona(idImovel);
}
Essa parte está certa, mas o ajax não está funcionando, não manda nada pro Controller, e mesmo se mandar os parâmetros, o Controller vai redirecionar pra página que está no Results.logic no método teste()?
Abraço!!
sim, mesmo sem mandar os parâmetros deveria cair no seu método…
a uri tá errada…
habilite o log de debug do vraptor e veja o que aparece na inicialização do servidor… ele lista todas as rotas, vê qual delas eh a que cai nesse método
13:40:25,781 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for FotoController.teste(Long, Long) as [idImovel, idFoto]
13:40:25,781 DEBUG [DefaultParametersControl] For /foto/teste retrieved /foto/teste with {}
13:40:25,782 INFO [RouteBuilder ] /foto/teste [ALL] -> FotoController.teste(Long, Long)
Pelo visto têm que ser /foto/teste né?
Não deu certo não…=/
<script type="text/javascript">
$(document).ready(function() {
$("input[name*='avatar']").click(function() {
// inicio do codigo ajax
$.ajax({
type: "POST",
url: "/foto/teste",
contentType: "application/x-www-form-urlencoded",
async: false,
data: { 'idImovel' : 35, 'idFoto' : 25 },
success: function(){
alert( "Teste do Controller!" );
}
});
// final do ajax
});
});
Nada acontece com esse ajax, tá mortinho da silva.
tenta fazer funcionar digitando a url no browser…
deveria ser //foto/teste
Fiz o teste colocando os dados reais diretos na URL:
http://localhost:8080/imobiliaria/foto/teste?idImovel=69&idFoto=259
E funcionou, o Controller enviou os dados pra JSP na boa, o problema mesmo é a função ajax.
Tá osso hehe, pq a minha função é o que existe na documentação.
troca o $.ajax por:
$.get('/imobiliaria/foto/teste',
{idImovel: 69, idFoto: 259},
function(data) {
alert(data);
});
troque o $.get por $.post se vc quiser fazer um post
Apareceu uma janela com os dados do site, mas na JSP não apareceram os dados, o Controller não recebeu nada.
apareceu um alert com um html?
não passou pelo controller?
Isso, apareceu um alert do html, mas na JSP não imprimiu as id’s.
então tah certo…
não apareceu nada no html do browser pq vc não pediu pra fazer isso!
qdo vc executa o javascript $.get vc não está mais no JSP, está no html gerado… não dá pra fazer mais nada do jsp…
o que o alert mostrou vc pode tratar de algum jeito e colocar na tela, mas vc precisa fazer ocódigo pra isso acontecer…
por exemplo, se vc tiver uma
function(data) {
$('#abc').html(data);
}
daí apareceria na tela
Valeu Lucas!
Deu certo, estava faltando isso mesmo, precisava ter algum alvo para injetar os dados:
Enviando:
$.post('/imobiliaria/foto/teste',
{idImovel: 69, idFoto: 259},
function(data) {
$('.result').html(data);
alert('Dados enviados e recebidos pelo Controller.');
});
Controller recebe os dados e envia para a JSP:
public void teste(Long idImovel, Long idFoto) {
result.include("mensagem", "dados recebidos" + idImovel + idFoto);
result.use(Results.logic()).redirectTo(FotoController.class).adiciona(idImovel);
}
Pegando os dados na JSP:
<h3 class="result">${mensagem}</h3>
Só que o Controller está duplicando a página toda ao responder a requisição. A página adiciona() tá com duas páginas adiciona() em uma JSP. =/
Ele criou dois headers, dois body’s, dois footers, sendo que no primeiro body onde estão os dados os mesmos ficaram em negrito, o segundo body ficou sem os dados enviados para o Controller e normal.
se vc colocou o include-prelude e include-coda, ele vai fazer isso em toda jsp, inlusive essa que foi chamada via ajax…
o que vc pode fazer é colocar um parâmetro na requisição que pode desabilitar o header e o footer:
header.jspf e footer.jspf:
<c:if test="${empty plain}">
o header ou o footer
</c:if>
e nessa lógica que é ajax, vc coloca um:
result.include("plain", true);
Opa! Tô de volta. 0/
Tô quase lá Lucas, a surra agora é numa variável pra armazenar a id da foto, veja:
22:21:49,259 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for FotoController.atualizaAvatar(Long, Foto) as [idImovel, avatar]
22:21:49,259 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: FotoController.atualizaAvatarFotoController.atualizaAvatar(Long, Foto)] are [69, null]
O "avatar tá vindo null, e tô tentando pegar assim:
var avatar = $("input[id*='avatar']").val();
var idImovel = "${imovel.idImovel}";
$.post('/imobiliaria/foto/atualizaAvatar',
{'idImovel': idImovel, 'avatar': avatar},
function(data) {
$('.result').load(data);
alert('Avatar selecionado com sucesso!');
});
No Controller está assim:
public void atualizaAvatar(Long idImovel, Foto avatar) { // o avatar aqui chega null
Imovel imovel = imovelDAO.carrega(idImovel);
imovel.setAvatar(avatar);
imovelDAO.atualiza(imovel);
result.include("mensagem", "Avatar selecionado com sucesso!");
result.use(Results.logic()).redirectTo(FotoController.class).adiciona(imovel.getIdImovel());
}
Deveria ir com a id da foto que está no :
<input type="radio" id="avatar" value="${foto.idFoto}" />Avatar
A id do imóvel pego tranquilo mas essa id da Foto tá osso, pq na classe Imovel avatar é do tipo Foto e não um Long.
Sabe como pego essa id da foto pra dar um setAvatar() ali no imóvel?
Assim que resolver essa e o parâmetro for passado vou ver se o método load() pode ser usado no lugar do html() do jquery.
$('.result').load(data);
Abraço!!
se vc passa o parametro avatar=33 o que você espera que o VRaptor faça?
o que é esse 33?
é o id da foto, não é verdade?
se vc quer setar o id da foto, você precisa colocar o caminho do id da foto (navegando pelos getters e setters):
avatar.idFoto=33
se vc quer, por exemplo, setar o id da foto que está dentro do imóvel :
//modificadores de acesso omitidos
class Imovel {
Long idImovel
Foto avatar;
List<Foto> fotos;
//getters e setters
}
class Foto {
Long idFoto;
//getters e setters
}
e no controller:
public void metodo(Imovel bolinha) {
}
bolinha.avatar.idFoto = 33 seta o id da foto
bolinha.idImovel = 222 seta o id do imovel
bolinha.fotos[0].id = 234 seta o id da primeira foto da lista de fotos
Creio eu que fiz isso, só a parte do ajax que tá pegando, pq eu coloquei:
{'idImovel': idImovel, 'avatar.idFoto': avatar},
Só que eu clico na foto 260 e salva no banco a foto 258 na tabela imovel, se eu clico no 259 salva 258. Não tô entendendo essa não. O.o