dÚvida ajax com servlets

6 respostas
C

Boa Noite Pessoal, tenho uma dúvida na utilização do ajax com meu servlets, sempre quando uso ajax eu devolvo alguma resposta, para o response do ajax, agora estou na seguinte situação e não estou conseguindo fazer funcionar minha logica.

Tenho uma pagina JSP com um <form method=“post” action=“relat/myservlet” id=“frm_tst”>

Meu servlet recebe os parametro do formulario e em tempo de execução já monta um excel para o usuário com os dados, então quando o usuário clica no submit demora uns 20 segundos que é o tempo de fazer a consulta no banco e e criar o excel e aparecer na tela do cliente pedindo para salvar ou arquivo ou abrir o mesmo. Isso tudo funciona perfeitamente, gostaria de colocar um LOADING, uma animação logo quando o usuário clica no botão e ao terminar de executar e criar o excel ele fecha o LOADING, nada melhor fazer isso usando o ajax, bom até tentar usar ele pessoal, trave na parte do response…como posso saber que terminou o processo para eu terminar o loading, já que meu servlet ele executar e cria o excel em tempo de execução, alguem tem uma ideia, consigo utilizar com ajax.
Obrigado
Cristian

6 Respostas

Naruffy
Seria algo assim =D
var ajax = null;
 function carrega() {
     // Mostra o loading
     document.getElementById("loading").style.display = "none"; 
     if (ajax == null) {
       if (window.XMLHttpRequest) {
         ajax = new XMLHttpRequest();
       } else if (window.ActiveXObject) {
         ajax = new ActiveXObject('Microsoft.XMLHTTP');
       }
     }
     ajax.open('GET', "seuservlet", true);
     ajax.onreadystatechange = processaAjax;
     ajax.send();
 }

function processaAjax() {
      if (ajax.readyState == 4) {
         if (ajax.status == 200) {
		      // Esconde o loading
		      document.getElementById("loading").style.display = "none"; 
         }
      }
}

Att

TeiTei

Pode usar o prototype tbm ficaria mais ou menos assim:

function : resgatar(){

var url = "URL QUE VC DESEJAR"
var pars= {
         pars1: "1",
         pars2: "2"

}

var request = new Ajax.Request(url, {
				method :'post',
				parameters :pars,
				onComplete :doList
			});

$("MinhaDiv").innerHTML = "RESGATANDO.....";

function doList(request) {
$("MinhaDiv").innerHTML = "COMPLETO.....";

			}
}

Ele fara uma requisição e ficara aguardando o retorno para chamara a funcao dolist perceba que tem algo na requsição como nome de oncomplete, esta sera executada somente quando concluida a requisição.

vlw

C
Naruffy:
Seria algo assim =D
var ajax = null;
 function carrega() {
     // Mostra o loading
     document.getElementById("loading").style.display = "none"; 
     if (ajax == null) {
       if (window.XMLHttpRequest) {
         ajax = new XMLHttpRequest();
       } else if (window.ActiveXObject) {
         ajax = new ActiveXObject('Microsoft.XMLHTTP');
       }
     }
     ajax.open('GET', "seuservlet", true);
     ajax.onreadystatechange = processaAjax;
     ajax.send();
 }

function processaAjax() {
      if (ajax.readyState == 4) {
         if (ajax.status == 200) {
		      // Esconde o loading
		      document.getElementById("loading").style.display = "none"; 
         }
      }
}

Att

Boa Tarde colega,
Então o ajax estou utilizando no mesmo esquema que você informou, ate ai não tem segredo, ele roda sem problema.
Quando eu executo meu servlets abaixo direto pela barra de endereço ele gera o xls tranquilo, agora quando eu passo meu servlet no ajax.open('POST', "mysrv", true); , meu loading executa ok porem meu excel não gera na tela. Efetuei um teste para saber se o ajax estava executando o servlet, coloquei antes de gerar o excel um FOR com um loop extenso, meu loading demorou mais tempo para sumir, então tiver certeza que ele executou o servlet, porem não criou o xls.

public class mysrv extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, WriteException {
        response.setContentType("text/html;charset=UTF-8");

        String fileName = "TESTE_" + System.currentTimeMillis();

        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName+ ".xls");

        WritableWorkbook w = Workbook.createWorkbook(response.getOutputStream());
        WritableSheet s = w.createSheet(fileName, 0);

        WritableFont wf = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD);
        WritableCellFormat cf = new WritableCellFormat(wf);
}

Tem alguma coisa errada com meu servlet para excutar pelo ajax, já que executando ele pela barra de endereço ele rola de boa.

abraço,
Cristian

Naruffy

Bom dia,

Bom amigo estive pesquisando aqui nos meus códigos e não consegui achar nenhum bom exemplo, pois todos os arquivos que eu abro eu não uso ajax.

Mas eu lembrei que tinha um caso em que eu usava AJAX e ocorria uns problemas parecidos com o seu, é alguma coisa relacionada com cache
tente colocar essas linhas no começo do seu servlet, a ultima que está comentada creio eu que não seja necessária pelo fato de você estar usando um arquivo excel.

Outra coisa que eu pensei tb, tente mudar a sua requisição ajax para GET ao invés de POST.

response.setDateHeader("expires", 1);
	    response.setHeader("cache-control", "no-cache");
	    //response.setHeader("content-type", "text/plain; charset=iso-8859-1");

Att

wellsantos

Bom, o que parece é que vc não está exibindo o conteúdo da resposta AJAX, certo?
Se o seu servlet retornasse HTML vc poderia fazer isso em JavaScript para exibí-lo na tela:

var doc = window.document;
doc.open();
doc.write(ajax.responseText);
doc.close();

Não sei se com documentos do excel irá funcionar porque não há como o browser saber o content-type.

O que vc poderá fazer é criar um IFrame oculto para chamar o seu servlet.
E no evento OnLoad do IFrame você poderá exibí-lo e esconder o icone de Loading que vc fez.

&lt;html&gt;
	&lt;!-- Autor: Wellington Tadeu dos Santos --&gt;
    &lt;head&gt;
        &lt;style type="text/css"&gt;
            iframe { width: 100%; height: 100%; opacity: 0; filter: alpha('opacity=0'); }
            .Pronto iframe { opacity: 1; filter: none; }
            .Pronto img { display: none; }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;!-- Imagem de Loading --&gt;
        <img  />
        
        &lt;!-- Carrega o conteúdo do servlet --&gt;
        &lt;iframe src="meuServlet" frameborder="0"
        		onload="document.body.className='Pronto';"&gt;
        &lt;/iframe&gt;
    &lt;/body&gt;
&lt;/html&gt;

Veja só que bonito! Só precisou de uma linha de JavaScript… e a chamada HTTP continua assíncrona
assim como se estivesse usando o AJAX via XMLHttpRequest.

[]'s

R

wellsantos:
Bom, o que parece é que vc não está exibindo o conteúdo da resposta AJAX, certo?
Se o seu servlet retornasse HTML vc poderia fazer isso em JavaScript para exibí-lo na tela:

var doc = window.document;
doc.open();
doc.write(ajax.responseText);
doc.close();

Não sei se com documentos do excel irá funcionar porque não há como o browser saber o content-type.

O que vc poderá fazer é criar um IFrame oculto para chamar o seu servlet.
E no evento OnLoad do IFrame você poderá exibí-lo e esconder o icone de Loading que vc fez.

&lt;html&gt;
	&lt;!-- Autor: Wellington Tadeu dos Santos --&gt;
    &lt;head&gt;
        &lt;style type="text/css"&gt;
            iframe { width: 100%; height: 100%; opacity: 0; filter: alpha('opacity=0'); }
            .Pronto iframe { opacity: 1; filter: none; }
            .Pronto img { display: none; }
        &lt;/style&gt;
    &lt;/head&gt;
    &lt;body&gt;
    	&lt;!-- Imagem de Loading --&gt;
        <img  />
        
        &lt;!-- Carrega o conteúdo do servlet --&gt;
        &lt;iframe src="meuServlet" frameborder="0"
        		onload="document.body.className='Pronto';"&gt;
        &lt;/iframe&gt;
    &lt;/body&gt;
&lt;/html&gt;

Veja só que bonito! Só precisou de uma linha de JavaScript… e a chamada HTTP continua assíncrona
assim como se estivesse usando o AJAX via XMLHttpRequest.

[]'s

Caramba kra quebro mo galhão meu!!!
Estava tentando atualizar a foto na pagina do cliente e não estava tendo sucesso… dai coloquei esse iframe e o negocio funcionou do nada!!! huahaau
viva ao POG!

Criado 15 de junho de 2009
Ultima resposta 28 de jan. de 2010
Respostas 6
Participantes 5