Exibir várias imagens em um JSP

Pessoal, estou com um problema e gostaria de tirar umas dúvidas ou obter algumas sugestões

Tenho uma aplicação que exibe no browser imagens em formato TIF.

for(intAux=0;intAux<Processo.intQtdImagens[intIndice];intAux++){
Imagem.strImgTif = Imagem.IndicarImagem(nomedoarquivo);
out.println("<img name=imagem src=ShowImg?arquivo=" + imagem.strImgTif + " WIDTH=140>");
out.println("&lt;/th&gt;");     
}

Para executar esta operação, utilizo um servlet que converte a imagem do formato TIF para JPG, retornando a mesma para o meu JSP.

response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
arquivo = request.getParameter("arquivo");
RenderedOp src = JAI.create("fileload", arquivo);
ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG",sos, null);
encoder.encode(src);  
sos.close();

O problema que estou enfrentando é que faço essa “chamada” para o servlet diversas vezes, pois carrego mais de uma imagem na tela ao mesmo tempo, e por algum motivo, nem todas as imagens são carregadas corretamente, em algumas, no local que a imagem seria carregada, aparece um X vermelho.

Pensei em alguma forma de controlar a cada imagem, se a mesma foi carregada com sucesso, para só carregar uma proxima imagem na tela após essa confirmação. Porém não tenho idéia de como isso pode ser implementado.
Alguém tem alguma ideia ou sugestão de como esse problema pode ser contornado?

Obrigado!

Ahn, acho um pouco difícil, porque na verdade o que ocorre é o seguinte:

  • O browser recebe a página e vai interpretando os tags < img src= > à medida que vai recebendo a página.
  • O browser tenta abrir várias conexões simultâneas para carregar as imagens (tipicamente 2 ou 3; você pode investigar isso usando “netstat”), e pode ser que umas acabem antes de outras. Não é que o browser carregue as imagens na ordem estritamente seqüencial que aparece na página HTML.
  • Então se você tentar fazer algo seqüencial (até daria para fazer, mas não é trivial, porque exige um controle ao nível de “session” que não existe pronto na API de servlets), você na verdade vai ter grandes problemas, acho até que iriam aparecer mais imagens que não seriam carregadas com sucesso.

Só para você ter uma idéia de como isso ocorre: você já não pegou uma página cheia de imagens estáticas, onde algumas delas nem chegam a carregar, e os “image placeholders” para imagens que não são carregadas aparecem aleatoriamente dentro da página? Todas as imagens já estão geradas, e a ordem que o browser usou para pegar as imagens na verdade depende não só de como elas estão declaradas no html, como também dos seus tamanhos e da quantidade de sockets que ele usou para se conectar ao seu servidor. Se isso ocorre para imagens estáticas (0% de uso de CPU para gerar as imagens) imagine quando você precisa gerá-las.

Talvez seja necessário ter um “cache” de imagens, dependendo do seu aplicativo.

Será que seu servlet tem problemas de threading? Talvez você precise de checar se JAI pode ser acessado por várias threads simultaneamente. (Você pode fazer seu servlet implementar javax.servlet.SingleThreadModel, mas acho que isso vai piorar mais ainda seu problema).

Obrigado pelas explicações Thingol, deu para entender porque acontece o problema.

Mas, vc poderia me esclarecer como eu poderia implementar cache de imagem em um servlet ?

Estou disposto também a tentar utilizar os dois outros caminhos citados por vc: Thread e Session. Você poderia me dar mais detalhes ou indicar onde eu poderia estudar esses dois assuntos ?

Valeu !