Produire une image avec un JSP, de la même manière qu'un servlet

Produire une image avec un JSP, de la même manière qu'un servlet - Java - Programmation

Marsh Posté le 07-12-2004 à 21:33:20    

Salut à tous,
 
Cet après-midi, j'ai écrit un petit code dans un servlet, et je veux faire la même chose dans un JSP. De mémoire, ça donne un truc du genre :
 

Code :
  1. public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
  2.     resp.setContentType("image/gif" );
  3.     BufferedImage image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
  4.     Graphics2D g2D = (Graphics2D) image.getGraphics();
  5.     g2D.drawString(50, 50, "Coucou" );
  6.     ServletOutputStream output = resp.getOutputStream();
  7.     GifEncoder encoder = new GifEncoder(image, output);
  8.     encoder.encode();
  9. }


 
J'ai essayé un truc similaire dans un JSP, mais apparemment, y a un truc qu'il a pas aimé. J'ai l'impression qu'il avait déjà émis des choses sur out, m'empêchant d'émettre sur output.


---------------
Le site de ma maman
Reply

Marsh Posté le 07-12-2004 à 21:33:20   

Reply

Marsh Posté le 07-12-2004 à 21:42:37    

Tiens, tu existes encore toi [:banguy] ?


Message édité par kadreg le 07-12-2004 à 21:42:45

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 07-12-2004 à 21:54:19    

Cherrytree a écrit :

J'ai essayé un truc similaire dans un JSP, mais apparemment, y a un truc qu'il a pas aimé. J'ai l'impression qu'il avait déjà émis des choses sur out, m'empêchant d'émettre sur output.


Salut Cherry ! :)
 
ce que tu veux faire n'est pas possible, d'après moi : une JSP doit retourner du texte. Je pense que c'est obligatoire parce que par exemple, la variable out (disponible dans la JSP) est un Writer obtenue par response.getWriter() ce qui empeche l'appel de response.getOutputStream()  : seule une de ces 2 méthodes peut être appelées (cf la javadoc des méthodes).
 
Y a peut être moyen de bidouiller pour s'en sortir, mais ce sera de la bidouille : une jsp c'est fait pour faire du texte.
 
pkoi tu veux pas laisser ca dans une servlet ?


Message édité par benou le 07-12-2004 à 21:55:08

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 22:04:32    

Mais qui voilà ? [:papatte]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-12-2004 à 22:07:40    

benou a écrit :


ce que tu veux faire n'est pas possible, d'après moi : une JSP doit retourner du texte.  


je retourne du pdf sans probleme, personnellement
 
(enfin, y'a quand même un IllegalStateException dans les logs, mais personne les lit [:joce])

Reply

Marsh Posté le 07-12-2004 à 22:15:18    

lorill a écrit :

(enfin, y'a quand même un IllegalStateException dans les logs, mais personne les lit [:joce])


ouais, c'est un peu le problème ... bizarre que ca fasse pas foirer la génération du pdf ...
t'as du bidouiller la taille du buffer pour que ca marche nan ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 22:17:12    

euh, cherrytree, j'voudrais pas t'prendre pour un con, mais rassure-moi, ton jsp ne fait QUE l'image hein, t'essaie pas d'embedder ça dans de l'html? [:joce]

Reply

Marsh Posté le 07-12-2004 à 22:17:44    

(au fait si ta servlet marche, pq tu dois en faire un jsp? au pire tu mappe ta servlet sur bidule.jsp)

Reply

Marsh Posté le 07-12-2004 à 22:18:58    

benou a écrit :

ouais, c'est un peu le problème ... bizarre que ca fasse pas foirer la génération du pdf ...
t'as du bidouiller la taille du buffer pour que ca marche nan ?

non, rien de spécial :
 
https://opensvn.csie.org/traccgi/lu [...] sp?rev=696
 
et la classe qui fait la conversion :
 
https://opensvn.csie.org/traccgi/lu [...] va?rev=696

Reply

Marsh Posté le 07-12-2004 à 22:19:42    

kadreg a écrit :

Tiens, tu existes encore toi [:banguy] ?


Ben ouais. C'est juste que mon corps change.
 

benou a écrit :

Salut Cherry ! :)
 
ce que tu veux faire n'est pas possible, d'après moi : une JSP doit retourner du texte.
 
[...]
 
pkoi tu veux pas laisser ca dans une servlet ?


Salut Benou,
 
OK, voilà qui est clair et qui met fin à mon ébauche de solution. Pourquoi je veux pas faire ça dans un servlet ? Bon Dieu, ça me pose aucun problème ! C'est juste que je vais former un de ces quatre un programmeur J2EE, qui ignore complètement l'existence des servlets. La perspective de devoir lui expliquer que le descripteur de déploiement, ce n'est pas sale, m'effraie. Voilà pourquoi je voulais lui proposer un contexte qu'il connait : le JSP.
 

Harkonnen a écrit :

Mais qui voilà ? [:papatte]


 :sol:  
 

lorill a écrit :

je retourne du pdf sans probleme, personnellement
 
(enfin, y'a quand même un IllegalStateException dans les logs, mais personne les lit [:joce])


 :sweat:


---------------
Le site de ma maman
Reply

Marsh Posté le 07-12-2004 à 22:19:42   

Reply

Marsh Posté le 07-12-2004 à 22:21:28    

the real moins moins a écrit :

euh, cherrytree, j'voudrais pas t'prendre pour un con, mais rassure-moi, ton jsp ne fait QUE l'image hein, t'essaie pas d'embedder ça dans de l'html? [:joce]


Sois rassuré. Le JSP que j'avais écrit était un copier-coller aux "<%" et autres "%>" près.


---------------
Le site de ma maman
Reply

Marsh Posté le 07-12-2004 à 22:22:36    


je suis surpris que ca fonctione ... c'est du tomcat derrière ?
t'as la stacktrace de l'exception ?


Message édité par benou le 07-12-2004 à 22:23:00

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 22:25:35    

Cherrytree a écrit :

OK, voilà qui est clair et qui met fin à mon ébauche de solution. Pourquoi je veux pas faire ça dans un servlet ? Bon Dieu, ça me pose aucun problème ! C'est juste que je vais former un de ces quatre un programmeur J2EE, qui ignore complètement l'existence des servlets. La perspective de devoir lui expliquer que le descripteur de déploiement, ce n'est pas sale, m'effraie. Voilà pourquoi je voulais lui proposer un contexte qu'il connait : le JSP.


[:sacplastic]
 
ben c'est peut être l'occasion qu'il comprenne ce qui se passe dans la petite boite magique qui s'apelle tomcat ... ;)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 22:26:53    

benou a écrit :

je suis surpris que ca fonctione ... c'est du tomcat derrière ?
t'as la stacktrace de l'exception ?


la c'est du jetty, mais j'ai souvenir d'avoir déja fait le même genre de saloperies sous tomcat.
 
pour la trace, je regarde, mais c'est un simple IllegalState, je pense tout bonnement qu'il veut écrire sur out alors qu'il est fermé

Reply

Marsh Posté le 07-12-2004 à 22:29:41    


ATTENTION: /org.lucane.extensions.pdfbox/convert.jsp:
java.lang.IllegalStateException: Commited
        at org.mortbay.http.HttpResponse.sendRedirect(HttpResponse.java:386)
        at org.mortbay.jetty.servlet.ServletHttpResponse.sendRedirect(ServletHttpResponse.java:445)
        at org.apache.jsp.convert_jsp._jspService(convert_jsp.java:66)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:405)
        at org.mortbay.jetty.servlet.ServletHandler.dispatch(ServletHandler.java:622)
...

Reply

Marsh Posté le 07-12-2004 à 22:30:24    

Cherrytree a écrit :

Sois rassuré. Le JSP que j'avais écrit était un copier-coller aux "<%" et autres "%>" près.

à la limite jpense que t'auras plus vite fait de lui montrer une servlet que de repasser après lui parce qu'il aura laissé un espace dans le jsp ou ce genre de saletés

Reply

Marsh Posté le 07-12-2004 à 22:43:09    

lorill a écrit :


ATTENTION: /org.lucane.extensions.pdfbox/convert.jsp:
java.lang.IllegalStateException: Commited
        at org.mortbay.http.HttpResponse.sendRedirect(HttpResponse.java:386)...




ok, c'est surement à cause du close : tu devrais pas mettre de close dans la JSP : c'est au moteur de servlet de fermer le flux.
 
là ton close() fait un commit => au 2e commit qui est fait par jetty, ca plante ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 22:52:41    

oui mais non, sans le close c'est pire
 


ATTENTION: /org.lucane.extensions.pdfbox/convert.jsp:
java.lang.IllegalStateException
        at org.mortbay.jetty.servlet.ServletHttpResponse.getWriter(ServletHttpResponse.java:547)
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:122)
        at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
        at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:190)
        at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
        at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
        at org.apache.jsp.convert_jsp._jspService(convert_jsp.java:77)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:405)
        at org.mortbay.jetty.servlet.ServletHandler.dispatch(ServletHandler.java:622)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:525)
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1457)
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1409)


 
parce que comme j'ai ecris dans l'output stream, il peut plus accéder au writer. Faudrait que j'essaye avec un return  dans la jsp, mais je crois avoir déja joué a ca

Reply

Marsh Posté le 07-12-2004 à 22:57:34    

pkoi il fait un getWriter après l'execution de la jsp ce con de jetty :/
 
enfin, c'est là qu'on voit que c'est quand même vachement container-dependant comme truc ... bref, pas une bonne idée ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-12-2004 à 23:05:24    

c'est sur que dans le cas général, il vaut mieux éviter.
maintenant dans mon cas particulier, je vais laisser tel quel en attendant de trouver un moyen d'ajouter le support des servlets a mon brol

Reply

Marsh Posté le 07-12-2004 à 23:19:20    

the real moins moins a écrit :

à la limite jpense que t'auras plus vite fait de lui montrer une servlet que de repasser après lui parce qu'il aura laissé un espace dans le jsp ou ce genre de saletés


C'est ce que je vais faire. J'aime pas faire des trucs crados.


---------------
Le site de ma maman
Reply

Marsh Posté le 07-12-2004 à 23:22:36    

[:bien] :o

Reply

Marsh Posté le 08-12-2004 à 11:45:54    

Salut,
 
1) assure toi que dans tes <% @page import...%> soient tous sur une et même ligne!! et de manière générale, qu'il n'y ait pas de retour à la ligne entre une fin de code java %> et une ouverture <%
2) le code devrait être :
response.setContentType("image/gif" );  
BufferedImage image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);  
   Graphics2D g2D = (Graphics2D) image.getGraphics();  
    g2D.drawString(50, 50, "Coucou" );    
    GifEncoder encoder = new GifEncoder(image, out);  
    encoder.encode();  
 
et ça devrait fonctionner très bien.

Reply

Marsh Posté le 08-12-2004 à 11:49:04    

LeMicky a écrit :

et ça devrait fonctionner très bien.


moi je dis qu'il y a rien de garantis ... t'as lu ce que j'ai dis sur le getWriter ? tu en penses quoi ?

Reply

Marsh Posté le 08-12-2004 à 12:01:51    

Heu, je n'ai pas tout tout lu :)
Mais je pense (et mon petit doigt en est persuadé) qu'il faut écrire tout sur ton "out" qui de toute façon écrira des choses (c'est pour ça qu'il faut bien virer tous les sauts de lignes entre les blocs java) => en fait, il ne faut pas perdre de vue que le jsp est transformé en .java avant d'être compilé => je te conseille de regarder le .java généré, tu comprendras comment il écrit sur ton out (qui est de toute façon la sortie du jsp). Doit y avoir un micmaque sur tes deux sorties de response.
Du coup, ce qui sort effectivement de ton jsp n'est pas un format gif correct et ça doit foirer là.
 
Moi, j'ai eu le même pb avec un XML (à la différence que le XML ça reste du texte, donc ça s'ouvrait bien qd même sauf que j'avais toujours des lignes blanches en tête de mon XML, du coup format XML foireux => supression des sauts de ligne entre les blocs java => ça a fonctionné)
 
Enfin "Ca devrait fonctionner" : conditionnel , donc effectivement, rien de garanti :)

Reply

Marsh Posté le 08-12-2004 à 14:04:03    

je te parle pas de ca, bien sûr qu'il faut pas laisser de caractère en dehors des <% %> ...
 
je te parle du fait que la méthode getWriter() est automatiquement appelée par la JSP et que tu n'as pas le droit d'appeler getWriter() et getOuputStream() sur le même objet response.

Reply

Marsh Posté le 08-12-2004 à 14:29:18    

Si tu le dis :)
Moi ce que je dis, c'est juste que je ne vois pas pourquoi tu fais un getOutputStream dans ton jsp... pour le reste, je n'ai jamais eu de pb, donc je ne me suis absolument pas penché sur la question de savoir s'il était ou non impossible de faire un getWriter() et un getOutputStream() sur le même objet response, et encore moins sur le fait que jetty (que je ne connais pas à priori) appelle getWriter sur response.
Cela repond-t'il à ta question? :)

Reply

Marsh Posté le 08-12-2004 à 14:42:42    

LeMicky a écrit :

Si tu le dis :)
Moi ce que je dis, c'est juste que je ne vois pas pourquoi tu fais un getOutputStream dans ton jsp...


parce que la variable jsp "out" est un JspWriter qui est un Writer donc lequel tu ne peux pas écrire de flux binaire, uniquement des flux texte.
 
donc je vois pas comment tu peux te servir de cette variable out pour générer une image ou n'importe quel autre format de fichier non textuel ...

Reply

Marsh Posté le 08-12-2004 à 14:53:45    

hummm... Je ne m'y connais pas assez pour être sûr de ce que je vais raconter :) , ça va plus être une réflexion à haute voix (ou plutôt en écrivant), mais le response.setContentType("image/gif" ); indique justement que ce qu'il va recevoir, il doit le considérer comme du GIF, d'autre part, si tu ouvres un gif avec notepad ça fonctionne, je veux dire par là que ton binaire peut toujours être vu comme du texte (de toute façon du texte, c'est du binaire, comme tout ce qui est numérique), donc peut-être que ça ne pose pas de pb d'envoyer ça sur ton JspWriter tout en lui disant, fais gaffe ce que je t'envoie c'est une gif, donc le flux que je t'envoie, tu ne le traites pas comme du texte mais tu en fais bien un gif (format reconnu par ton navigateur).
 
Ca ne me paraît pas délirant comme raisonnement, qu'en penses-tu?

Reply

Marsh Posté le 08-12-2004 à 15:21:43    

LeMicky a écrit :

qu'en penses-tu?


qu'il n'y a pas de méthode dans un JspWriter permettant d'écrire des octets ... et que donc tu ne peux pas utiliser cet objet pour écrire des octets et que donc tu es obligé de faire un response.getOutputStream() pour obtenir un OutputStream sur lequel tu peux écrire des octets, et que donc ca risque de te cracher un IllegalStateException bien mérité ...
 
La seule façon que je vois pour s'en sortir c'est si le container n'associe pas tout de suite le JspWriter à la réponse, c'est à dire qu'il attend de VRAIMENT devoir écrire (quand le buffer du JspWriter est plein) pour appeler la méthode getWriter() et décharger son buffer, ET qu'il n'essaye pas de commiter la réponse l'execution de la JSP (ou qu'il catch l'IllegalStateException).  Dans ce cas, c'est possible d'appeler getOuputStream et de s'en servir dans la JSP. Mais ca fait beaucoup de "si" :/
 
sinon, pour ta remarque concernant le fait que tu lui indique le type de retour, c'est un peu tard une fois que tu es dans le code. A la rigueur, en l'indiquant avec un <%@ page contentType="..." %>, ca a plus de chance de marcher, mais je n'y parirais pas ma chemise ...
 
puis bon, c'est pas fait pour ca une JSP ...

Reply

Marsh Posté le 08-12-2004 à 15:47:50    

ok ok, merci pour cette explication :)
et je suis entièrement d'accord avec ton dernier point!
 
Mais bon, je poursuis mon raisonnement, tu peux écrire des octets (un char peut-être sur un octet, en UTF-8 par exemple), après dans un cas tu considères que c'est effectivement un caratère (par exemple "A" ), dans l'autre un bout de la gif, non?
tu vois ce que je veux dire? car un char, c'est une suite de 0 et de 1, donc une String c'est une suite de 0 et de 1, tout comme une GIF. A priori une même suite de 0 et de 1, donne dans un cas une String (avec un charset particulier), dans un autre cas, notre GIF (bon là on sort un peu du sujet, c'est plus conceptuel). Le seul truc que je vois qui n'irait pas c'est que pour une gif, je ne sais pas si la longueur en bytes est un multiple de 8 (ce qui serait le cas pour n'importe quelle String avec un charset d'un octet, style UTF-8), auquel cas effectivement ça n'irait pas.
Suis-je clair dans ce que je veux exprimer?


Message édité par LeMicky le 08-12-2004 à 15:58:00
Reply

Marsh Posté le 08-12-2004 à 17:41:46    

LeMicky a écrit :

Suis-je clair dans ce que je veux exprimer?


oui mais tu ne vois toujours pas le problème :  
 
Comment veux-tu transférer une gif (binaire) dans un flux textuel ?
La seule façon : transformer le flux binaire de ton gif en charactères que tu envoies dans le flux textuel. Ben ca, ca a des chances de planter : prends le cas où ton gif se termine par un octet qui représente le début d'un caractère stocké sur 2 octets (dans le charset que tu as choisi, peut importe lequel). Pour cet octet là, la transformation en char va planté => ton gif ne sera pas transférable.
 
ok ?

Reply

Marsh Posté le 08-12-2004 à 17:44:40    

(qui se fend d'un mini article pour expliquer la difference entre InputStream/OutputStream et Reader/Writer ? [:itm])


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 08-12-2004 à 23:05:22    

juste pour faire chier mon monde : j'ai modifié ma jsp pour virer tous les caractères transformés par jasper, et j'ai plus d'erreur [:joce]

Reply

Marsh Posté le 14-12-2004 à 12:33:46    

benou a écrit :

oui mais tu ne vois toujours pas le problème :  
 
Comment veux-tu transférer une gif (binaire) dans un flux textuel ?
La seule façon : transformer le flux binaire de ton gif en charactères que tu envoies dans le flux textuel. Ben ca, ca a des chances de planter : prends le cas où ton gif se termine par un octet qui représente le début d'un caractère stocké sur 2 octets (dans le charset que tu as choisi, peut importe lequel). Pour cet octet là, la transformation en char va planté => ton gif ne sera pas transférable.
 
ok ?


Vi vi, c'était le fin de mon message précédent.
Enfin, un char en UTF-8 c'est sur un octet  ;)  ok ok, j'ai compris, c'était juste pour taquiner.
Les reader/writer ce sont pour le texte, les streams pour le byte raw ou en français dans le texte : les bits "non-structurés".

Reply

Marsh Posté le 18-12-2004 à 17:22:08    

Yo, finalement, j'ai rien présenté à mon développeur adoré. En revanche le sujet m'intéressant encore un poil, je me permets de vous soumettre une question de plus.
 
Supposons que le servlet générant l'image soit inclus dans une JSP. Supposons que l'image dépendent de paramètres transmis (par exemple) par la JSP. Quel autre moyen qu'en bidouillant la query string derrière l'url du servlet ai-je ? Comment passer un objet complexe à mon servlet ?


---------------
Le site de ma maman
Reply

Marsh Posté le 18-12-2004 à 17:25:39    

on dit "une" servlet nan ?  :??:  
 
quand tu dis une servlet inclu, tu veut juste dure que la jsp génêre une page avec une image qui a son src qui est mappé par la servlet qui génère l'image, c'est ca ? pas un include dans la jsp ?
 
si c'est ca ben t'as pas trop le choix : soit la querrystring, soit la session ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 18-12-2004 à 17:33:18    

Ouais, comme tu dis, l'attribut src pointe sur l'adresse mappée.
 
Bon, ben query string, parce que session, ça le fait vraiment pas.
 
Un/une servlet ? Houlà ça peut partir en troll c't'affaire.
-> Ne se prononce pas.


---------------
Le site de ma maman
Reply

Marsh Posté le 18-12-2004 à 17:54:08    

N'empêche ça me fait chier d'utiliser la query string, ça fait désordre.


---------------
Le site de ma maman
Reply

Marsh Posté le 18-12-2004 à 18:06:19    

Cherrytree a écrit :

N'empêche ça me fait chier d'utiliser la query string, ça fait désordre.


c'est quoi comme donnée à passer ?
 
en quoi ca te fait chier ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed