ContentTypes e Outputs

17 respostas
Bruno_Cardoso

Boas!

É assim… ando a tentar fazer um formulario em JSP/Servlets que além dos campos que é normal aparecer, também iria ter um para a pessoa digitar o codigo de confirmação, esse código iria ser visualizado num GIF gerado pela página.

O problema é que parece que não posso usar dois tipos de outputs ao mesmo tempo, ou seja, se enviar texto para a pagina normalmente depois nao irei puder enviar a imagem gerada pelo java.

Se eu fizer:

response.setContentType("text/html"); PrintWriter out = response.getWriter();
Depois já nao posso fazer na mesma pagina:

response.setContentType("image/gif"); OutputStream outStream = response.getOutputStream();

Já alguem tentou fazer alguma coisa do género? como posso ultrapassar este problema?

17 Respostas

Elvis.The.Pelvis

Ué. Pq você não usa <img src=“path da imagem”>? Você quer fazer algo de diferente?

Bruno_Cardoso

O código que gera o numero e a imagem GIF não chega a criar um ficheiro no disco com esse GIF, a ideia era enviar o GIF directamente para a pagina mas senao houver outra alternativa provavelmente será isso q vou ter q fazer, no entanto fico à espera de alternativas se alguem as tiver.

Obrigado

aconstantino

Sai dai portuga :slight_smile:

Que tal um IFrame?

Elvis.The.Pelvis

Entendi. Você vai gerar os gif dinamicamente. Bem, de qualquer forma, após gerá-lo, você pode gravá-los em disco temporariamente e dinamicamente atribuir o src à tag img.

Mais uma coisa. Como é que você gera esses gifs dinamicamente? Através do próprio Java?

Bruno_Cardoso

@dohko: portuga ?! eu ?! :twisted:

@Elvis.The.Pelvis: Já tou a trabalhar nisso, vou fazer com que seja gravado um ficheiro temporario para o disco e depois o html vai lá busca-lo, parece que é mesmo a unica solução. Ou então outra solução pode ser fazer um applet, vou ver. Estive agora a ler a documentação dos servlets e realmente diz lá:

Só não percebo, visto q estes metodos apenas podem ser chamados uma vez no código, porque é que só dá erro a correr o código e não a compilar. Acho q isto foge um bocado ao q o compilador de java deveria fazer, ou seja, prever o maximo de error possiveis antes de correr o programa.

Atenção q isto não é uma critica, EU ADORO JAVA! :D, é apenas um pensamento meu…

PS: O manual de “Core Servlets and JavaServer Pages” tem lá um exemplo de como criar um GIF dinámico, se quiser eu arranjo-lhe isso.

urubatan

gera a página normalmente primeiro com uma tag

<img src=“caminho para o mesmo servlet”>

ai na segunda chamada o servlet gera o gif, na primeira ele gera o texto

na primeira chamada

response.setContentType&#40;&quot;text/html&quot;&#41;; PrintWriter out = response.getWriter&#40;&#41;;
e quando ele for chamado novamente pela TAG <img>

response.setContentType&#40;"image/gif"&#41;; 
OutputStream outStream = response.getOutputStream&#40;&#41;;

você pode passar um parametro para ele indicando que esta sendo chamado pela tag IMG

J2Alex

Que tal usar dois servlets para isso? No primeiro vc monta a página normalmente e nesta página retorna a tag IMG que vai chamar um outro servlet somente pra montar a imagem. Tipo:

<IMG SRC=“Nome do servlet”>

Não sei se fui claro…

Acho que seja uma melhor opção que salvar o arquivo, que na verdade não necessita disso.

Falow!!! 8)

Bruno_Cardoso

Já consegui :smiley: , foi mais fácil do que estava à espera. Fiz um servlet à parte só mesmo para gerar a imagem e returna-la, depois no formulario em JSP só tiver q pôr o tag <img> a chamar o servlet como vcs disseram.

Obrigado a todos! 8)

Elvis.The.Pelvis

Ei morcego, disponibiliza o código ai. É algo novo pra mim e muito interessante. Pode ser? To encucado em como é que diabos você gera gifs dinâmicos a partir do Java.

Bruno_Cardoso

vou ter q vos chatiar mais um bocadinho, há aqui algo que me está a escapar...

Se eu escrever o seguinte codigo não dá problemas:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ServletTeste extends HttpServlet &#123;
   public void doGet&#40;HttpServletRequest request, HttpServletResponse response&#41;
   throws ServletException, IOException &#123;
      response.setContentType&#40;&quot;text/html&quot;&#41;;
      PrintWriter out = response.getWriter&#40;&#41;;
      out.println&#40;&quot;&lt;img src=&quot;&quot; + &quot;/metallum/GifCodeGenerator&quot; + &quot;&quot;&gt;&quot;&#41;; //Retorna o GIF com um numero
      out.println&#40;&quot;Number&#58; &quot; + GifCodeGenerator.returnNumber&#40;&#41;&#41;; //retorna o numero
   &#125;
&#125;
agora se escrever o mesmo agora em JSP já dá problemas...
&lt;HTML&gt;
&lt;HEAD&gt;
    &lt;TITLE&gt;&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;
&lt;%
      out.println&#40;&quot;&lt;img src=&quot;&quot; + &quot;/metallum/GifCodeGenerator&quot; + &quot;&quot;&gt;&quot;&#41;;
      out.println&#40;&quot;Number&#58; &quot; + GifCodeGenerator.returnNumber&#40;&#41;&#41;;
%&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
Não entendo.. se eu comemtar a segunda linha do código JSP ele já dá, o erro é aqui:
out.println&#40;&quot;Number&#58; &quot; + GifCodeGenerator.returnNumber&#40;&#41;&#41;;
A mensagem de erro é a seguinte:
org.apache.jasper.JasperException&#58; Unable to compile class for JSP

An error occurred at line&#58; 5 in the jsp file&#58; /Teste.jsp

Generated servlet error&#58;
    &#91;javac&#93; Compiling 1 source file

C&#58;TomcatworkStandalonelocalhostmetallumTeste_jsp.java&#58;49&#58; cannot resolve symbol
symbol  &#58; variable GifCodeGenerator 
location&#58; class org.apache.jsp.Teste_jsp
      out.println&#40;&quot;Number&#58; &quot; + GifCodeGenerator.returnNumber&#40;&#41;&#41;;
                               ^
1 error

o que estou a fazer de errado? .returnNumber() é um metodo estatico

@Elvis.The.Pelvis: O código é mto extenso, eu envio para o seu e-mail

aconstantino

Portuga,
metallum
é package?

Bruno_Cardoso

Não, o servlet GifCodeGenerator não está dentro de nenhum package. “metallum” é o directorio base do site. O GifCodeGenerator está dentro do directorio classes em: metallum/web-inf/classes

Não entendo…

aconstantino

Tente colocar ele como Bean, talvez funcione

Bruno_Cardoso

Não faz sentido mudar. As JSPs deveriam fazer o q os servlets fazem, certo? Se eu fizer isto num servlet já funciona, mas queria fazer em JSP visto que 90% do código é HTML e não havia necessidade de estar a fazer tantos “out.println”… isto tá dificil :x

aconstantino

Na verdade JSP é um Servlet :slight_smile:

Portuga, tente reiniciar o tomcat… não vejo problemas neste código…

Bruno_Cardoso

hmm.. agora que pus o GifCodeGenerator dentro de um package e chamei o respectivo import no JSP já funcionou..

&lt;HTML&gt;
&lt;HEAD&gt;
    &lt;TITLE&gt;&lt;/TITLE&gt;
&lt;/HEAD&gt;
&lt;BODY&gt;

&lt;%@ page language=&quot;java&quot; %&gt;
&lt;%@ page import=&quot;utils.MetallumUtils&quot;%&gt;
&lt;%
      out.println&#40;&quot;&lt;img src=&quot;&quot; + &quot;/metallum/utils.GifCodeGenerator2&quot; + &quot;&quot;&gt;&quot;&#41;;
      out.println&#40;&quot;Number&#58; &quot; + utils.GifCodeGenerator2.returnNumber&#40;&#41;&#41;;
%&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;

Esquisito... tenho que usar sempre packages? ou será que é algo relacionado com o CLASSPATH? Não tenho a certeza se as JSP precisam dos CLASSPATH das classes q vao ser usadas, já agora, se sim como colocava o classpath? Imaginando q a minha class está em [url]c:/metallum/web-inf/classes/GifCodeGenerator.class[/url].

Elvis.The.Pelvis

O container JSP não procura pela variável de ambiente CLASSPATH não. Suas classes devem estar no web-inf/classes ou web-inf/lib(se for um .jar) da sua aplicação ou do próprio servidor web.

Pelo menos é assim que o Tomcat funciona.

Criado 27 de janeiro de 2003
Ultima resposta 27 de jan. de 2003
Respostas 17
Participantes 5