Duvida sobre Response

Caros,

Estou iniciando em web ainda. Lendo e pesquisando vi q era uma ma pratica escrever codigo java em jsp, entao estou iniciando o desenvolviemnto com servlets e tenho uma duvida:

Eu criei uma servlet, que é chamada pela minha jsp e devolve pra esse jsp um relatorio em .pdf… ok, funciona normalmente e o relatorio é aberto dentro do browser…


... 

bytes = JasperRunManager.runReportToPdf( report, hash, eds );
			
if (bytes != null && bytes.length > 0) {   
               
            response.setContentType("application/pdf");   
             
            response.setContentLength(bytes.length);
	            
            ServletOutputStream ouputStream = response.getOutputStream();
	            
            ouputStream.write(bytes, 0, bytes.length);
            
            ouputStream.flush();
            
            ouputStream.close();
	            
}  

a minha duvida e a seguinte: eu queria antes de devolver esse relatorio, escrever algo na pagina como

window.document.write("

");

pra exibir um gifzinho de carregamento, enqto o processo de geração do relatorio nao termina… entao, como nao possuo experiencia com web começei a tentar coisas loucas como opr exemplo colocar o seguinte, antes do processo de geração do relatorio:

response.getWriter().write("

"); :oops: e claro q nao funcionou heheeh

Mas a minha duvida e como eu faria pra poder exibir esse gif de loading antes do processo…

Agradeço qqer ajuda.

acho q só com ajax mesmo…

hmmm… vlw pela dica do ajax…

alguem sabe um meio de fazer isso sem ser ajax?

Voce pode tentar fazer com javascript…

Poe um div… com a imagem que você quer… e dá um flush…

Aí depois que terminar a geração, você manda um código javascript pra esconder aquele div… e mostra o pdf…

Você pode também fazer com redirect…
escreve a imagem que você quer na tela… e quando terminar, manda um redirect pro endereço do pdf, se ele for ficar armazenado…

o problema mano é q o .pdf nao vai ficar armazenado, vai ser escrito direto na pagina mesmo =/

mas eu nao consegui entender direito como seria desse jeito q vc falou… pq eu xamo a servlet no submit do form…

iii maninho aí trincou… complicado fazer isso…
desencana :slight_smile:

Da sim para fazer, usado prototype você terá que usar duas opções de ajax, quando for “onInteractive” que siguinifica que será processado algo QUANDO a response está sendo gerada, e no evento “onComplete”, que é quando terminou.

Nesse caso você cria o DIV, e deixa ele como default escondido, assim que o servlet estiver gerando o response, “onInteractive” será ativada, e você coloca um efeito, tipo new Effect.BlindDown, ou Effect.Apear para apresentar o div com a msg. Depois em “onComplete” você coloca o efeito de sumir com o div, no caso o Effect.BlindUp pode ser acionado. Legal, né?

muito :wink:

thx a lot, Grinvon

Nada fábio,

tente fazer aí, qualquer coisa poste a dúvida. :slight_smile:

Olá fabiocsi,

Não ah como vc fazer isso usando apenas uma requisição:

jsp -&gt servlet -&gt jsp

E usando AJAX tb vc não vai consseguir… pois AJAX é um conceito
diferente… (não vem ao caso, neste momento).
Uma solução seria no primeiro JSP vc colocar esta imagem assim
que o usuário clicar no botao para gerar o relatório, usando javascript.
Poderia ser da seguinte forma:

   <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Aguarde...</title>
<script type="text/javascript">
var ID_TELA_MSG_AGUARDE = "msgAguarde";
var MSG_USUARIO = '&lt;div align="center" id="loading"&gt;<img >&lt;/div&gt;'
function gerarRelatorio() {
	var elMsgAguarde = document.getElementById(ID_TELA_MSG_AGUARDE);
	elMsgAguarde.innerHTML = MSG_USUARIO;
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body class="pt_BR"&gt;
&lt;div id="msgAguarde"&gt;
&lt;H1&gt;Tela anterior da geracao do relatorio&lt;/H1&gt;
Aqui vc deve colocar o codigo que estava no seu jsp anterior ... coloque todo o codigo 
aqui dentro da tag msgAguarde.
&lt;INPUT type="button" value="Gerar Relatorio"  onclick="javascript:gerarRelatorio()"&gt;
&lt;/div&gt;
&lt;/body&gt;

Outra coisa para vc entender melhor pq nao pode: Quando vc seta response.setContentType(“application/pdf”); o browser sabe e se prepara para receber dados binarios de um arquivo em pdf então com isso ele sabe que deverá direcionar esses bits para o programa responsavél por esse tipo de arquivo… se ele existir… normalmente o Adobe Reader. Essa é a razão principal de vc nao poder escrever na mesma resposta HTTP dados do tipo caracter e dados do tipo binário. A cada requisição HTTP vc poderá retornar uma resposta HTTP.
Existem outras formas de solucionar seu problema… mas se vc quer que esse gif fique mostrando quando o PC ta abrindo o adobe … é simplesmente impossível. :?

Rafael,

Veja: http://www.prototypejs.org/api/ajax/responders

e me diga se não tem como :wink:

nussa gente obrigado mesmo, isso esclareceu muitas duvidas minhas…

Get… sem palavras pra agradecer sua aula rs…

Agora se o grivon ta falando q tem como fazer do jeito q ele me disse q tinha, entao tem heeh…

bom galera, olha o q eu fiz… eu meti no html o meu “loading.gif”, inicialmente com o style.visibility=“hidden”… qdo o cara clica em “btnGerarRelatorio” ele torna o gif visivel, e depois da submit no form pra xamar a servlet, heeh ficou quase perfeito nao fosse um detalhe:

A animação do gif trava… é semelhante ao se tentar exibir uma progressBar em Swing desktop, sem usar threads ou SwingWorker…

como faço isso funfar em web?