VRaptor 3 + JSON

Se $(function() não funcionou é porque o jquery não está sendo carregado. Tente colocar um alert($). Se retornar null ou undefined é porque realmente o jquery não está sendo carregado. Verifique se você tem o arquivo no local que você está importando.

uma forma que eu resolvi, foi usando o metodo de callback open do dialog ui.

Dessa forma eu tenho um include na div container do dialog, e no metodo open eu chamo a function que carrega os dados da tabela.

Tudo certo até aqui, estou usando tambem o plugin Jquery Form, pra fazer chamadas ajax a partir de um formulário já que essa modal é de pesquisa. Se eu chamar a página de pesquisa através da url funciona tudo certo, mais na modal esta dando o erro abaixo:

[quote]
Erro Status 405
14/12/2009 10:57:05 br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor intercept
INFO: Method POST is not allowed for requested URI. Allowed Methods are [GET][/quote]

o javascript:

$(function() {
   // o que está aqui executa no onLoad do body
   // qdo vc faz requisições ajax, esse evento não é disparado, logo o código
   // que está aqui dentro não roda.
});

o que vc pode fazer, é colocar uma função init() e executá-la na mão.

[]'s

mais ai fica a pergunta, porque quando eu chamo a pagina de pesquisa pela url funciona normal, agora quando a modal chama essa pagina não funciona?

sim, é isso mesmo…

não funciona com requisições ajax, pq ele não dispara o evento onLoad…

qdo vc acessa diretamente dispara o onload e funciona normal

hum, entendi…

Tem um exemplo de como eu poderia estar fazendo funçaõ init, já tentei assim e não deu certo:


function init(){

  $(function(){
    //meu codigo aqui
  });

}

Resolvido.

Um colega meu vendo o codigo fonte do jquery viu que a function que retornava o prototype do jquery tinha um var que limitava o escopo das variaveis (no arquivo min, eh a primeira function), ele retirou o var das variaveis e tudo funcionou.

Agora não sei se isso é um bug, mais sei que esta funcionando agora.

O código $(function() {…}) não deve estar dentro da função init, e sim direto dentro de uma tag ou dentro de um arquivo .js importado

Pois é, eu tinha dito que estava resolvido, mais não esta não.

Tem alguma forma de forçar o onload ou algum evento que tenha o mesmo efeito dentro de uma div?

tenta fazer o seguinte: ao inves de usar o load, usa o get, que está nessa página de doc:

http://docs.jquery.com/Ajax/jQuery.get#urldatacallbacktype

seria algo do tipo:

$.get('caminho/da/pagina', {}, function(data) {
  $("#idDaDiv").html(data);
}, "html");

o último parâmetro é o tipo, tente variar ele para todos os que estão na documentação… um dos tipos, se eu não me engano, executa os eventos do cara carregado

[]'s

como esses dados estão sendo carregados dinamicamente, a página que o jquery adiciona ao meu jsp modal, tanto usando o metodo load quanto o get, nenhuma das duas opções dão certo. Pois a pagina adicionada na modal, dentro de $(function(){…}), nem um alert functiona.

[quote]não funciona com requisições ajax, pq ele não dispara o evento onLoad…

qdo vc acessa diretamente dispara o onload e funciona normal[/quote]

Lucas vc já tinha dito que isso era porque o quando adicionado na modal não é executado o evento onload.

Tem alguma forma de fazer forçar o onload ou mesmo fazer algo semelhante?

depende do plugin do JQuery que vc tah usando… se o plugin tem essa opção, vc usa… senão vc tem que chamar os javascripts na mão…
tenta fazer o seguinte:

function init() { //onde estava $(function(){
    //inicialização
}

init();

dentro da página carregada… aí vc testa as opções e vê se alguma executa o init

resolvi criando um iframe e esse iframe tem a uri que vai ser chamado no controller.

Me diz uma coisa, vc importou a biblioteca do jQuery na pagina que esta chamando via load?
Veja o exe:

pagina.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ExtJS Layout Examples</title>


    <script type="text/javascript" src="jquery-1.3.1.min.js"></script>

	<script type="text/javascript">
		$(document).ready(function(){
			$('#start').load('ler.html');
		})
	</script>
</head>
<body>
    <div id="header"><h1>Load</h1></div>
	
        <div id="start" style="border:1px solid #000000; height:200px; width:200px;">
           	
        </div>

</body>
</html>

ler.html

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ExtJS Layout Examples</title>

	<script type="text/javascript">
	
	$(document).ready(function(){
		alert('Teste');
	});
	
	</script>
</head>
<body>
	123
</body>
</html>

veja que não foi importado o jQuery na outra pagina…

Wolmir Garbin

eai galera!

estou tentando fazer uma requisição ajax mas não estou conseguindo…

abaixo o que estou usando para a requisição:

libs:

  • jackson-core-asl-1.5.5.jar
  • jackson-jaxrs-1.5.5.jar
  • jackson-mapper-asl-1.55.jar
  • jackson-xc-1.5.5.jar
  • asm-3.1.jar
  • jersey-core-1.4.jar
  • jersey-json-1.4.jar
  • jersey-server-1.4.jar
  • jsr311-api-1.1.1.jar

web.xml:

... &lt;servlet&gt; &lt;servlet-name&gt;Jersey REST Service&lt;/servlet-name&gt; &lt;servlet-class&gt;com.sun.jersey.spi.container.servlet.ServletContainer&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;com.sun.jersey.config.property.packages&lt;/param-name&gt; &lt;param-value&gt;br.com.website.resources&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;Jersey REST Service&lt;/servlet-name&gt; &lt;url-pattern&gt;/rest/*&lt;/url-pattern&gt; &lt;/servlet-mapping&gt; ...

bean:

[code]package br.com.website.beans;

@Entity
@XmlRootElement
public class Estado implements Serializable {

}[/code]

resource:

[code]package br.com.website.resources;

@Path("/estado")
public class EstadoResource {

@Get @Path("/list/{idPais}")
@Produces(MediaType.APPLICATION_JSON)
public String getListaEstados(@PathParam(“idPais”) Integer idPais) throws Exception {

ObjectMapper mapper = new ObjectMapper();
String response = “”;

/* valores de teste */
Long paisId = Long.parseLong(idPais.toString());

Pais pais = new Pais();
pais.setId(paisId);
pais.setNome(“Brasil”);
pais.setSigla(“BR”);

Estado estado = new Estado();
estado.setId(1L);
estado.setNome(“Alagoas”);
estado.setSigla(“AL”);
estado.setPais(pais);

List<Estado> lsEstado = new ArrayList<Estado>();
lsEstado.add(estado);

response = mapper.writeValueAsString(lsEstado);

return response;
}
}[/code]

retorno do método getListaEstados:

requisição ajax:

[code]getJSON = function(url, data, dt, bs, s, e){
$.ajax({
type:“get”,
url:url,
data:data,
dataType:dt,
beforeSend:bs,
success:s,
error:e
});
});

getJSON(
’/website/rest/estado/list/1’,
null,
“json”,
function(xhr, settings){},
function(data, textStatus, xhr){},
function(xhr, textStatus, errorThrown){}
);[/code]

O que acontece é o seguinte:

  • em outro projeto meu tudo isto funciona perfeitamente (neste projeto não uso vRaptor).
  • neste projeto ‘website’ tudo funciona até o momento de retornar os dados para o browser (neste projeto estou usando vRaptor).
  • a requisição ajax é executada e, no EstadoResource, o método getListaEstados(idPais) recebe o parametro idPais, os dados são setados para uma lista de Estado, a lista é convertida em String e essa String deveria ser retornada ao browser… …mas não é!
  • ao receber o retorno no browser temos o seguinte: “HTTP Status 405 - Method Not Allowed” “description - The specified HTTP method is not allowed for the requested resource (Method Not Allowed).”

Alguém já teve este problema?

Em minha última tentativa desesperada de fazer funcionar minha aplicação antes tentar de dormir, encontrei a solução para este problema que já estava me dando insônia:

no resourse EstadoResource.java apenas troquei o import da anotação @Get de br.com.caelum.vraptor.Get para javax.ws.rs.GET e funcionou!

agora posso dormir feliz… hauhauhauahah

colocar o @GET do jax-rs é a mesma coisa que deixar sem anotação :wink:

alguem estava mandando POST nesse método, ou qqer outro diferente de GET, por isso o erro.