ContentTypes e Outputs

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?

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

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

Sai dai portuga :slight_smile:

Que tal um IFrame?

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?

@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.

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;&quot;image/gif&quot;&#41;; 
OutputStream outStream = response.getOutputStream&#40;&#41;; 

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

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)

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)

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.

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:

[code]import java.io.;
import javax.servlet.
;
import javax.servlet.http.*;

public class ServletTeste extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<img src="" + "/metallum/GifCodeGenerator" + "">"); //Retorna o GIF com um numero
out.println("Number: " + GifCodeGenerator.returnNumber()); //retorna o numero
}
}[/code]
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:

[code]org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 5 in the jsp file: /Teste.jsp

Generated servlet error:
[javac] Compiling 1 source file

C:TomcatworkStandalonelocalhostmetallumTeste_jsp.java:49: cannot resolve symbol
symbol : variable GifCodeGenerator
location: class org.apache.jsp.Teste_jsp
out.println("Number: " + GifCodeGenerator.returnNumber());
^
1 error[/code]

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

Portuga,
metallum
é package?

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…

Tente colocar ele como Bean, talvez funcione

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

Na verdade JSP é um Servlet :slight_smile:

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

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

[code]<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>

<%@ page language="java" %>
<%@ page import="utils.MetallumUtils"%>
<%
out.println("<img src="" + "/metallum/utils.GifCodeGenerator2" + "">");
out.println("Number: " + utils.GifCodeGenerator2.returnNumber());
%>
</BODY>
</HTML>[/code]

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 c:/metallum/web-inf/classes/GifCodeGenerator.class.

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.