Produire une image avec un JSP, de la même manière qu'un servlet - Java - Programmation
Marsh Posté le 07-12-2004 à 21:42:37
Tiens, tu existes encore toi ?
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 ?
Marsh Posté le 07-12-2004 à 22:04:32
Mais qui voilà ?
Marsh Posté le 07-12-2004 à 22:07:40
benou a écrit : |
je retourne du pdf sans probleme, personnellement
(enfin, y'a quand même un IllegalStateException dans les logs, mais personne les lit )
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 ) |
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 ?
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?
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)
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 ... |
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
Marsh Posté le 07-12-2004 à 22:19:42
kadreg a écrit : Tiens, tu existes encore toi ? |
Ben ouais. C'est juste que mon corps change.
benou a écrit : Salut Cherry ! |
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à ? |
lorill a écrit : je retourne du pdf sans probleme, personnellement |
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? |
Sois rassuré. Le JSP que j'avais écrit était un copier-coller aux "<%" et autres "%>" près.
Marsh Posté le 07-12-2004 à 22:22:36
lorill a écrit : non, rien de spécial : |
je suis surpris que ca fonctione ... c'est du tomcat derrière ?
t'as la stacktrace de l'exception ?
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. |
ben c'est peut être l'occasion qu'il comprenne ce qui se passe dans la petite boite magique qui s'apelle tomcat ...
Marsh Posté le 07-12-2004 à 22:26:53
benou a écrit : je suis surpris que ca fonctione ... c'est du tomcat derrière ? |
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é
Marsh Posté le 07-12-2004 à 22:29:41
|
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
Marsh Posté le 07-12-2004 à 22:43:09
lorill a écrit :
|
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 ...
Marsh Posté le 07-12-2004 à 22:52:41
oui mais non, sans le close c'est pire
|
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
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 ...
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
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.
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.
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 ?
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
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.
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?
Marsh Posté le 08-12-2004 à 14:42:42
LeMicky a écrit : Si tu le dis |
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 ...
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?
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 ...
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?
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 ?
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 ? )
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
Marsh Posté le 14-12-2004 à 12:33:46
benou a écrit : oui mais tu ne vois toujours pas le problème : |
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".
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 ?
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 ...
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.
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.
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 ?
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 :
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