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…
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…
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…
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é?
Não ah como vc fazer isso usando apenas uma requisição:
jsp -> servlet -> 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 = '<div align="center" id="loading"><img ></div>'
function gerarRelatorio() {
var elMsgAguarde = document.getElementById(ID_TELA_MSG_AGUARDE);
elMsgAguarde.innerHTML = MSG_USUARIO;
}
</script>
</head>
<body class="pt_BR">
<div id="msgAguarde">
<H1>Tela anterior da geracao do relatorio</H1>
Aqui vc deve colocar o codigo que estava no seu jsp anterior ... coloque todo o codigo
aqui dentro da tag msgAguarde.
<INPUT type="button" value="Gerar Relatorio" onclick="javascript:gerarRelatorio()">
</div>
</body>
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. :?
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…