Você precisa entender o que você está fazendo antes de mais nada.
Problema: Você tem uma tela pra enviar uma imagem e deseja exibir nesta mesma tela a imagem enviada.
Solução:
- Criar um JSP para enviar e exibir a imagem
- Criar uma Action Struts que recebe e processa a imagem
- Criar um mecanismo para exibir a imagem recebida/processada
No ambiente web/http, você envia dados via uma requisição HTTP, utilizando, por exemplo, um formulário html. Para exibir uma imagem numa página HTML vc deve usar a tag <img>.
Esta tag img exibe uma imagem a partir de uma URL, que pode mapear um arquivo em disco no servidor, ná área publica na web.
No seu caso você não tem esta imagem em disco. Você terá de carregá-la ao servidor e exibi-la.
Para isso você poderia:
- Gravar a imagem recebida no disco (numa área web) e pegar a URL pra exibi-la
ou
- Guardar a imagem no disco (área restrita p/ web), ou BD ou mesmo em memória. Para exibir você precisa de um mecanismo para pegar os dados (bytes) da imagem e enviar via protocolo HTTP para o navegador/cliente.
Como o seu caso é o segundo, temos:
A sua Action recebe a imagem e coloca na sessão os BYTES dessa imagem carrega. Então você armazenou a sua img na sessão (embora não seja uma estratégia muito legal). Mas enfim.
Então você retorna (forward) o processamento para o seu JSP original, que tem a tag IMG que vai exibir a imagem que está em memória. Só que esta tag IMG aponta para um JSP e não para uma URL de uma imagem.
PORQUE???
Porque esse JSP vai carregar os bytes da imagem (que está na sessão) e vai gravar os bytes na saída HTTP dele. Ou seja, seu JSP será um “GERADOR” de imagem.
ENTENDEU???
Por isso o seu JSP ok.jsp pega os bytes da sessão e grava os bytes na saída.
Para melhorar, o seu ok.jsp pode fornecer o mime type (content type) mais adequado e fica assim:
<%@ page contentType="image/jpeg" %><%
byte[] img = (byte[]) session.getAttribute("imagem");
for( int i=0; i<img.length; i ++ ) out.print( img[i] );
%>