[Resolvido] Pegar retorno do result na função Ajax ou javascript

Oi pessoal!
Tô querendo emitir um alerta ao remover um proprietário, a idéia é alertar que existem imóveis cadastrados e se deseja excluir mesmo assim.
Fiz aqui no Controller:

public void loadImoveis(Long idProprietario){
		Integer imoveis = imovelDao.getQtdeImoveis(idProprietario);
		result.include("imoveis", imoveis);
	}

Na JSP tenho:

function alertaComImoveis() {
var idProprietario = "${proprietario.idProprietario}";	
	$.post('/imobiliaria/imovel/loadImoveis', 
		   {'proprietario.idProprietario': idProprietario},   
		        
	function() { 
	var qtde = imoveis; // como capturo a quantidade que vem do result?
	alert('Este proprietário possui'  + qtde + 'imóveis, deseja excluir o proprietário e todos seus imóveis?' );
	});	
	  

<display:column title="Remover"><a onclick="alertaComImoveis()" href="remove?idProprietario=${proprietario.idProprietario}">remover</a></display:column>

}

Como pego a quantidade de imóveis daquele result.include na minha função ajax? Testei aqui e ao clicar em remover passa batido, não mostra a mensagem…=/
Abraço!

function alertaComImoveis() {
var idProprietario = "${proprietario.idProprietario}";	
	$.post('/imobiliaria/imovel/loadImoveis', 
		   {'proprietario.idProprietario': idProprietario},   
		        
	function(data) { 
	var qtde = data.imoveis; // como capturo a quantidade que vem do result?
	alert('Este proprietário possui'  + qtde + 'imóveis, deseja excluir o proprietário e todos seus imóveis?' );
	});	

Se não me engano

Ok

Obrigado pela dica jvds@bol.com.br , mas o proprietário ainda é removido sem emitir o alerta de que existem imóveis cadastrados.

23:59:45,177 DEBUG [DefaultResourceTranslator] trying to access /proprietario/remove
23:59:45,177 DEBUG [DefaultResourceTranslator] found resource [DefaultResourceMethod: ProprietarioController.removeProprietarioController.remove(Long)]
23:59:45,192 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor FlashInterceptor
23:59:45,200 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InterceptorListPriorToExecutionExtractor
23:59:45,204 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor JPATransactionInterceptor
23:59:45,221 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
23:59:45,221 DEBUG [OgnlParametersProvider] Applying idProprietario with [18]
23:59:45,222 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ImovelController.loadImoveis(Long) as [idProprietario]
23:59:45,222 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ImovelController.loadImoveisImovelController.loadImoveis(Long)] are [18]
23:59:45,225 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor NoCacheInterceptor
23:59:45,227 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor InstantiateInterceptor
23:59:45,228 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
23:59:45,238 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
23:59:45,238 DEBUG [ExecuteMethodInterceptor] Invoking ImovelController.loadImoveis(Long)
Hibernate: 
    select
        count(this_.cod_imovel) as y0_ 
    from
        Imovel this_ 
    inner join
        Proprietario p1_ 
            on this_.proprietario_id_proprietario=p1_.id_proprietario 
    where
        p1_.id_proprietario=?
23:59:45,256 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
23:59:45,256 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
23:59:45,267 DEBUG [LazyInterceptorHandler] Invoking interceptor ParametersInstantiatorInterceptor
23:59:45,267 DEBUG [AsmBasedTypeCreator ] Trying to make class for ProprietarioController$remove$944595671$7
23:59:45,268 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProprietarioController.remove(Long) as [idProprietario]
23:59:45,268 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [IdProprietario]
23:59:45,268 DEBUG [AsmBasedTypeCreator ] Method for field 'IdProprietario' being defined for type Ljava/lang/Long;
23:59:45,269 DEBUG [AsmBasedTypeCreator ] Methods: [public java.lang.Long ProprietarioController$remove$944595671$7.getIdProprietario(), public void ProprietarioController$remove$944595671$7.setIdProprietario(java.lang.Long)]
23:59:45,269 DEBUG [AsmBasedTypeCreator ] Fields: [private java.lang.Long ProprietarioController$remove$944595671$7.IdProprietario_]
23:59:45,269 DEBUG [CacheBasedTypeCreator] cached generic type for method [DefaultResourceMethod: ProprietarioController.removeProprietarioController.remove(Long)]
23:59:45,269 DEBUG [OgnlParametersProvider] Applying idProprietario with [18]
23:59:45,271 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for ProprietarioController.remove(Long) as [idProprietario]
23:59:45,271 DEBUG [ParametersInstantiatorInterceptor] Parameter values for [DefaultResourceMethod: ProprietarioController.removeProprietarioController.remove(Long)] are [18]
23:59:45,277 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExceptionHandlerInterceptor
23:59:45,279 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/imovel/loadImoveis.jsp
23:59:45,280 DEBUG [VRaptor             ] VRaptor received a new request
23:59:45,281 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ExecuteMethodInterceptor
23:59:45,282 DEBUG [ExecuteMethodInterceptor] Invoking ProprietarioController.remove(Long)

Estou passando a id pra função por parâmetro desta forma:

function alertaComImoveis(idProprietario) {
	var id = idProprietario;
$.post('/imobiliaria/imovel/loadImoveis', 
	   {'idProprietario': id},   
			        
function(data) { 
	var qtde = data.imoveis;
	alert('Este proprietário possui'  + qtde + 'imóveis, deseja excluir o proprietário e todos seus imóveis?' );
});	  
}

Aparentemente só falta a função capturar os dados vindos do result e mostrar no alerta, essa parte que eu não sei como funciona com o VRaptor…
Abraço!

desculte não havi reparado tenta isso

Controller

public void loadImoveis(Long idProprietario){
		Integer imoveis = imovelDao.getQtdeImoveis(idProprietario);
		result.use(Results.json()).from(imoveis, "imoveis").serialize();
	}

no JSP

function alertaComImoveis() {
var idProprietario = "${proprietario.idProprietario}";	
	$.post('/imobiliaria/imovel/loadImoveis', 
		   {'proprietario.idProprietario': idProprietario},   
		        
	function(data) { 
	var qtde = data.imoveis; // como capturo a quantidade que vem do result?
	alert('Este proprietário possui'  + qtde + 'imóveis, deseja excluir o proprietário e todos seus imóveis?' );
	});	
	  

<display:column title="Remover"><a onclick="alertaComImoveis()" href="remove?idProprietario=${proprietario.idProprietario}">remover</a></display:column>

}

Tente fazer isso acho que agora vai funcionar.

Uma opcao:

 public void loadImoveis(Long idProprietario){  
         result.use(Results.json()).from(imovelDao.getQtdeImoveis(idProprietario)).serialize();  
} 

viw:

	$.getJSON("../imobiliaria/loadImoveis", { 'idProprietario':idProprietario }, function(data) {  
      $.each(data,function(index, optionData){
            alert("Quantidade: " + optionData);  

Guevara

Você precisa trazer toda a lista via ajax?

Não é só trazer a quantidade?

Oi pessoal!
Tentei as últimas dicas postadas mas o alerta não aparece, tá removendo direto. A id do proprietário chega no Controller, o Hibernate executa a Criteria mas na volta o alerta não é invocado.
Tô contando os imóveis do proprietário com esta Criteria e retornando um Integer:

public Integer getQtdeImoveis(Long idProprietario) {		
		Criteria crit = session.createCriteria(Imovel.class, "i");
		crit.createAlias("proprietario", "p")
		.add(Restrictions.eq("p.idProprietario", idProprietario));
		crit.setProjection(Projections.count("i.codImovel"));
		int count = ((Long) crit.uniqueResult()).intValue();
		return count;
	}

Eu não tinha usado o serialize do json pq o retorno é um número inteiro, mesmo assim tentei com ele agora e não invoca o alerta.
A id do proprietario é mandada pra função ao clicar em remover:

<display:column title="Remover"><a onclick="alertaComImoveis(${proprietario.idProprietario})" href="remove?idProprietario=${proprietario.idProprietario}">remover</a></display:column>

Dentro do alerta coloco a id e está chegando na função, é só na hora do result que não funciona o resto dela. Deve ter algum detalhe que passou despercebido…
Abraço!!

CONTROLLER

public void loadImoveis(Long idProprietario){
		Integer imoveis = imovelDao.getQtdeImoveis(idProprietario);
		result.use(Results.json()).from(imoveis, "imoveis").serialize();
	}

JSP

function alertaComImoveis(idProprietario) {
	$.getJSON("../imobiliaria/loadImoveis", { 'idProprietario':idProprietario }, function(data) {  
	var qtde = data.imoveis; // como capturo a quantidade que vem do result?
	alert('Este proprietário possui'  + qtde + 'imóveis, deseja excluir o proprietário e todos seus imóveis?' );
        });
}

<display:column title="Remover"><a onclick="alertaComImoveis(${proprietario.idProprietario})" href="#">remover</a></display:column>

tenta fazer desta forma então para testar com href="#" desabilitado.

Ok

Valeu jvds@bol.com.br , agora ele mostra o alerta e no lugar da quantidade de imóveis está “undefined”. Tá quase…

Olha ve se esta indo para metodo de seu controlador “loadImoveis” e se valor idProprietario esta chegando com valor ok.

Se estiver troque data.imoveis > data ok no seu jsp.

Fiz isso e funcionou, deixei apenas “data” na JSP, mas o alerta só tá funcionando com o remover desabilitado, se eu colocar o método de remoção lá, o proprietário é removido sem mostrar o alerta.
Assim o alerta funciona:

<display:column title="Remover"><a onclick="alertaComImoveis(${proprietario.idProprietario})" href="#">remover</a></display:column>

Desta forma o proprietário é removido sem emissão do alerta:

<display:column title="Remover"><a onclick="alertaComImoveis(${proprietario.idProprietario})" href="remove?idProprietario=${proprietario.idProprietario}">remover</a></display:column>

Pelo que eu tô vendo, o alerta não interrompe o método remove(). =/
Vlw!

Com esta função consigo passar a id do proprietário e mostrar a tela de confirmação, mas não sei como posso impedir a remoção do proprietário ao clicar em “cancelar” na janela.

function alertaComImoveis(idProprietario) {	
	$.ajax({
	    type: 'post',
	    url: '/imobiliaria/proprietario/loadImoveis',
	    dataType: 'json',
	    data: {'idProprietario':idProprietario},
	    success: function(data) {confirm('Este proprietário possui '  + data + ' imóveis, deseja excluir o proprietário e todos seus imóveis?' ); },
	    async: false
	});
	  
}

Alguém sabe como posso evitar a exclusão? =)
Abraço!!

Oi pessoal! Obrigado pela ajuda!
O Bronx me passou uma dica melhor que a que eu estava tentando fazer, criar um método na classe Proprietario que retorna a quantidade de imóveis do proprietario:

public int getQuantidadeImoveis() {
		return this.getImoveis().size();
	}

E na JSP o remover ficou assim:

<display:column title="Remover"><a onclick="return confirm('O proprietário(a) ${proprietario.pessoa.nome} possui ${proprietario.quantidadeImoveis} imóvel(eis) cadastrados, deseja excluir o proprietário(a) e todos os seus imóveis?')" href="remove?idProprietario=${proprietario.idProprietario}">remover</a></display:column>

Resolvido.