Problemas com Ajax - XML não é carregado

6 respostas
davidbuzatto

Bom dia pessoal.

É o seguinte, estou desenvolvendo uma aplicação que devido aos requisitos da mesma eu tenho que usar Servlets... Fui obrigado a isso pois o meu cliente quer assim... Enfim, é um cadastro simples, nada de muito complexo, com upload de arquivos e outras coisas... No cadastro "principal" eu tenho vários combos e listas que trazem os dados dos outros cadastros. O problema é que o cliente quer que possam ser cadastrados novos itens desses subcadastros dentro do formulário principal.

Usei Ajax para isso da seguinte forma. Ao lado da lista ou combo eu tenho um botão "+" que ao ser clicado abre um popUp com o cadastro (somente o formulário de inserção). Quando o usuário cadastra o novo item, é dado um aviso a ele (usando o alert()) e é chamada uma função em Javascript para atualizar a lista/combo correspondente. É aí que entra o Ajax. O estranho que é localmente funciona certinho, mas quando passo o link da minha máquina (com meu ip) p/ o usuário, ele diz que não funciona, que fica travado e não atualiza.

No servidor de produção é estranho pq tem hora que funciona e tem hora que não funciona.

Eu testei duas formas de gerar o XML carregado pelo Ajax.
Primeira - Usei um JSP para cada entidade que ao invés da página, retornava um XML da listagem da entidade;
Segunda - Usei um Servlet para o mesmo propósito.

Ao usar o Servlet eu percebi que a velocidade da atualização melhorou um pouco.

Abaixo estou listando o Javascript que faz a atualização.

function carregarElementosAjax( comboDestino, nomeDoNodoXML, urlDeCargaDoAjax ){
    
    combo = document.getElementById( comboDestino );
    
    while ( comboDestinoDosDados.length > 0 )
        combo.remove( 0 );
    
    ajax = criarAjax();
    
    ajax.onreadystatechange = function() {
        
        if ( ajax.readyState == 4 ) {
            
            xmla = ajax.responseXML;
            
            elementos = xmla.getElementsByTagName( nomeDoNodoXML );
            
            for ( i = 0; i < elementos.length; i++ ) {
                
                elementoDoXML = document.createElement( "option" );
                
                elementoDoXML.text = elementos[ i ].childNodes[ 0 ].nodeValue;
                elementoDoXML.value = elementos[ i ].attributes[ 0 ].value;
                
                combo.options.add( elementoDoXML );
                
            }
            
        }
        
    }
    
    ajax.open( "GET", urlDeCargaDoAjax, true );
    ajax.send( null );
    
}


function criarAjax(){
    
    xmlHttp = null;
    
    try{
        
        // Firefox, Opera 8.0+, Safari
        xmlHttp = new XMLHttpRequest();
        
    } catch ( e ) {
        
        // Internet Explorer
        try {
            
            xmlHttp = new ActiveXObject( "Msxml2.XMLHTTP" );
            
        } catch ( e ) {
            
            try {
                
                xmlHttp = new ActiveXObject( "Microsoft.XMLHTTP" );
                
            } catch ( e ) {
                
                alert( "Seu navegador não suporta Ajax!" );
                
            }
            
        }
        
    }
    
    return xmlHttp;
    
}

O erro apresentado no firebug quando não funciona é "xmla has no properties" (linha 14 do código acima), ou seja, o XML não é gerado.

Uso Hibernate e Spring na minha aplicação. Alguém tem uma idéia do que eu posso fazer?

6 Respostas

nbluis

Ajax Cross-domain…

A melhor/pior coisa da tecnologia.

O browser não libera requisições ajax para fora do domínio da aplicação.

Tem um link aqui que trata isso.

Até.

Pedrosa

Cara de uma olhada em JSON sua performance vai aumentar em relação a XML normal e vale a pena usar uma lib que implemente Ajax.

Prototype com JSON:
http://www.prototypejs.org/learn/json

davidbuzatto

nbluis:
Ajax Cross-domain…

A melhor/pior coisa da tecnologia.

O browser não libera requisições ajax para fora do domínio da aplicação.

Tem um link aqui que trata isso.

Até.

Putz… Não sabia disso…
Obrigado! Vou dar uma olhada e retorno se funcionou!

davidbuzatto

Pedrosa:
Cara de uma olhada em JSON sua performance vai aumentar em relação a XML normal e vale a pena usar uma lib que implemente Ajax.

Prototype com JSON:
http://www.prototypejs.org/learn/json

Valeu! Vou dar uma olhada!
A tarde de hj vai ser dedicada a isso hehehe.

davidbuzatto

Vcs tem algum link de um tutorial um pouco mais completo? Esta notação usada no Javascript eu ainda não conheço pois não usei e o que eu preciso fazer é urgentíssimo… Se tiverem algum link eu agradeço… Eu preciso basicamente preencher um combo quando eu chamar uma função…

davidbuzatto

Isso já me garante o cross-domain vai funcionar?

Código do framework Prototype.

new Ajax.Request('/some_url', { method:'get', requestHeaders: {Accept: 'application/json'}, onSuccess: function(transport){ var json = transport.responseText.evalJSON(true); } });

Como ficaria usando o jquery?

Criado 15 de janeiro de 2008
Ultima resposta 15 de jan. de 2008
Respostas 6
Participantes 3