IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

[JSF 1.2] Chargement dynamique d'images


Sujet :

JSF Java

  1. #1
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut [JSF 1.2] Chargement dynamique d'images
    Bonjour,

    OBJECTIF
    Afficher une image générée dynamiquement sur une page JSF
    J'ai essayé d'aborder le problème de différentes façons mais jusqu'à présent je n'ai toujours pas trouvé de solutions :

    > Essai 1
    J'ai tenté d'insérer grossièrement le flux XML de l'image dans la page JSF. Sans succès pas de reconnaissance de la part du navigateur de l'image SVG.
    Si je charge uniquement le flux XML le navigateur affiche correctement l'image.

    > Essai 2
    Utiliser les balises OBJECT ou EMBED... je n'arrive pas à les combiner avec JSF il n'existe pas de balises JSF équivalentes...

    > Essai 3
    Après avoir généré mon image SVG, je la convertis en PNG. A partir de là je cherche à mettre l'url de la balise graphicImage et là ça pose problème.
    En fait pour obtenir l'image PNG , j'ai été obligé de sauvegarder les fichiers SVG et PNG sur le disque.
    Jusque là ça va, là ou ça flanche c'est à la mise à jour de l'url de l'objet graphicImage. C'est une URL et il le gère à partir de la racine de mon application (serveur J2EE - Glassfish)
    Je pourrais m'amuser à sauvegarder (j'avoue je n'ai pas essayé !!) à l'emplacement de mes pages JSF mais je trouve que c'est trop de bidouille !!
    Il y a -t-il moyen d'affecter à la balise graphicImage juste un flux ?...

    ...
    ...

    Une autre solution possible serait de créer un rendererkit pour le flux XML de mon image. Au départ je trouvais ça trop lourd aujourd'hui je me dis qu'il n'y a peut être que ça qui marcherait. Le hic : je n'ai pas envie de m'y lancer pour rien.

    Voilà, je suis désolé d'avoir été aussi long mais je suis à court d'idées. Je serais intéressé par toutes les propositions que vous aurez à me faire même si je crains de toutes les connaître déjà ; par contre je pense que dans mes différentes tentatives il y a des choses que j'aurais pu mieux faire ou approfondir....

    Merci d'avance,
    Mow

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Bonjour, je vais tenter de répondre point par point sur tes essais:

    > Essai1:
    Très grossier effectivement. Pas tous les navigateurs ne sont capable d'afficher une flux svg imbriquée dans ton xhtml. Tu peux trouver plein d'exemple d'embed dans SVG test suites.

    > essai2:
    Une possibilité, Object, comme tu l'a essayé. Problème, aucun composant standard ne génère une balise Object. T'as là 2 possibilités.

    La première est de créer un composant "object" qui va te générer une balise Object. Créer un composant JSF perso n'est pas bien difficile. Le plus dur est d'oser le pas . Pour créer un composant, il te faut l'objet composant, éventuellement une taglib (si tu utilise JSP, pas besoin avec facelets), définir ton composant en trois lignes de xml dans un META-INF/faces-config.xml, éventuellement, pour faire propre, un renderer, mais c'est pas indispensable, le composant peut se charger du rendering.

    La deuxième possibilité, moins propre, est d'aller à la bourrin avec un <f:verbatim>autour te la partie ouvrante statique de ton Object, puis un h:outputText pour l'output de l'url et finalement un deuxième f:verbatim pour la partie fermante. Ca donnerais un truc dans ce gout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <f:verbatim>
      <object data="
    </f:verbatim>
    <h:outputText value="..."/>
    <f:verbatim>" width="80" height="60" type="image/svg+xml"/></f:verbatim>
    Une variante serait d'utiliser un outputText avec un escape="false" pour créer à l'intérieur la balise Object:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:outputText escape="false" value='&lt;object data="#{...}" width="80" height="60" type="image/svg+xml"/&gt;"/>
    Moche dans les deux cas...

    >essai 3
    h:graphicImage est pour moi probablement le meilleur résultat. Tu pointe le h:graphicImage non pas sur un png comme tu le fais, mais tu peux le pointer directement sur un flux svg (les w3c a défini qu'on pouvait utiliser le tag <image> pour du svg). Comme ton svg c'est du xml, tu peux créer un jsp (jsf) qui ne fait que générer le flux. T'as plus qu'à pointer le h:graphicImage dessus.

    Si tu préfère vraiment la génération png (support des "vieux" browsers), tu peux soit t'orienter vers le composant mediaOutput que fourni la libraire richfaces (attention, grosse tartine d'ajax qui arrive avec) ou alors créer un composant perso qui te balance le flux binaire sur l'outputStream de la requete. T'as alors plus qu'à créer, comme pour du svg, un fichier jsf qui n'inclu que l'output de l'image en utilisant ce composant perso. Exemple:

    fichier machin.jsf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:graphicImage url="/image/picture.jsf" />
    fichier /images/picture.jsf (version svg):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
    <svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  id="svg-root"
     
         width="100%" height="100%" viewBox="0 0 480 360">
    .....
    Fichier images/picture.jsf, version binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <custom:binaryOutput value="#{monBean.fluxPng}" contentType="image/png"/>
    (Cette dernière méthode fonctionne de manière confirmée à mon boulot, 3 fois pas de code pour le faire )

  3. #3
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    tchize_,
    Avant tout merci pour le temps que tu as pris pour me répondre j'ai du attendre longtemps mais cela a fini par intéresser quelqu'un !!!

    Le truc c'est que j'ai pu me débrouiller en partant de l'essai 3.
    Grace à la propriete des "docroot alternatifs", j'ai pu m'en tirer en sauvant le fichier généré en PNG avec Batik. J'ai laissé un post à ce sujet... tu le trouveras ici.

    Par contre, je vais essayer ta méthode j'y avais pensé mais je n'ai pas essayé pensant que le serveur ne me laisserait pas modifier le picture.jsf

    Autre chose ta taglib Custom, elle est proprietaire j'imagine...
    Je vais aussi essayer de suivre ton conseil... franchir le pas en ce qui concerne la création d'un composant JSF....
    Mais bon je promets rien.... Allez on va essayer quand même...

    Je te tiens au courant...

    Merci,
    Mow

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par mow Voir le message
    Autre chose ta taglib Custom, elle est proprietaire j'imagine..
    Juste la taglib dans laquelle to met ton propre composant, tu l'appelle comme tu veux

    J'ai déjà fait au boulot un composant jsf pour faire du rendu binaire. Basiquement, le composant en lui meme fait à peine quelques ligne et doit se résumer à un "encodeBegin()" dans lequel je fait en gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    context.getExternalContext().getResponse().getOutputStream().write(component.getValue());
    context.responseComplete()/*Arrêt là le processus JSF, on a effectué un rendu directement dans le stream*/
    Le truc *chiant* avec un composant perso, si tu utilise pas facelets, c'est qu'il te faut te casser le cul à écrire aussi une taglib. Mais comme au boulot, c'est du facelet, le composant a été écrit en 15 minutes :p

  5. #5
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Ok, vive les trucs chiants - j'utilise pas facelets

    Pour info, je pourrais voiur sur le net mais peux-tu m'en dire plus sur facelets ?
    Que gangne-t-on en plus à l'utiliser ??

    Merci,
    Mow

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    En gros, ce que tu gagne avec facelets:

    Système de templates
    Possibilité sans accro de mélanger sur html et des tags JSF. (En JSP obligé de passer par desu f:verbatim)
    Tu peux mettre des expression language partout
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <head><title>Profil de #{user.name}</title></head>
    <body>
    ....
    Facilité d'ajout de nouveaux tags de composants (suffit de donner dans un fichier xml le type et le renderer, pas besoin de faire plus)
    Création de composant composites (utilisation d'un template facelet comme étant un composant)
    Pas besoin de tag view, tout est une vue
    Utilisation de xml avec namespace au lieu d'un fichier jsp illisible
    Tu peux avoir JSP et facelets en même temps
    Plus rapide que JSP, pas besoin de compilation et de création d'un "servlet" pour chaque JSP

    Ce que tu perd:
    Tous les tags non-jsf ne sont plus disponibles, Facelets n'utilise pas les taglibs standards. La JSTL core est convertie en facelets, donc t'as des bases quand meme.
    Pas de scriptlets possibles

  7. #7
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Tout cela est fort intéressant - J'ai l'impression qu'on y gagne plus à l'utiliser !

    Le seul hic peut être ce serait la "non creation" de servlet je pense que cela peut être embetant de ne pas avoir accès au contexte fourni par la servlet ?

    Mow

  8. #8
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Je ne pense pas. Tu devrais avoir tout ce dont tu as besoin dans le FacesContext...
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut ça ne marche pas : inclure SVG dans JSF
    Salut,
    j'ai essayé la solution 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:outputText escape="false" value='&lt;object data="img/graphe.svg" width="80" height="60" type="image/svg+xml"/&gt;"/>
    Mais ça n'a pas marché et il m'envoie : objet introuvable


    La solution 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:graphicImage url="/image/picture.jsf" />
    ne trouve pas l'image et m'affiche une croix rouge pour indiquer que l'image est introuvable.

    Si j'ajoute le type dans la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jsp:directive.page contentType="image/svg+xml;charset=UTF-8" pageEncoding="UTF-8"/>
    il me demande d'enregistrer la page.

    Il me reste d'essayer de créer le composant mais comme je n'ai jamais fait, j'hésite encore.

    Merci de m'aider pour résoudre mon problème et inclure mon graphe svg dans ma page jsf pour le changer ensuite dynamiquement avec un flux XML.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut SVG, jsf et flux XML
    J'ai reussi à integrer l'image en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <embed  width="550"  height="300" type="image/svg+xml" src="img/graphe.svg" name="tReel"></embed>
    Mais il faut que je réussisse maintenant à envoyer le flux de données pour changer ma courbes dynamiquement.

    Bonne journée

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 46
    Par défaut
    Bonjour,
    Je reviens vers vous de nouveau puisque je ne réussi pas à envoyer un flux XML à partir de ma base de données.

    Plus clairement : dans mon projet jsf, je dois afficher une courbe en temps réel en utilisant le svg. les données sont mises à jours régulièrement dans une base de données.
    Est-ce-que quelqu'un a une idée comment faire?

    Sinon j'ai essayé plusieurs méthodes mais je tourne en boucle et je ne réussi pas à avancer dans mon projet :
    1ère méthode :
    • j'ai inséré le graphe.svg dans ma page jsp comme suit :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      <embed width="550"  height="300" type="image/svg+xml" src="img/graphe.svg" name=""></embed>
      et j'ai intégré du java Script dans ma page jsp pour chercher les coordonnées de la courbe à partir d'un fichier xml :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      <?xml version="1.0" encoding="iso-8859-1"?>
      <SVGrealtime>
      	<text id="hist_0" x="10" y="10.470"></text>
      	<text id="hist_1"  x="15" y="100.470"></text>
      ......
      </SVGrealtime>
      Le problème est que je ne sais pas comment je peux faire pour modifier les données du fichier xml à partir de ma BDD. En d'autres termes, je ne réussi pas à accéder à l'url du fichier.xml à partir de mon bean.
      Si je fais
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
       File SVGOutputFile = new File("web/fichier.xml");
      il va chercher web/fichier.xml dans jboss-4.0.3SP1/bin et non pas dans le war qui est dans jboss-4.0.3SP1\server\default\deploy.

      et si je fais
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
       File SVGOutputFile = new File("web/fichier.xml").toURI();
      il m'envoie une erreur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      cannot resolve symbol
      symbol  : method toURI ()
      [javac] location: class java.net.URL
      Ma question est comment je peux accéder à ce fichier sur le serveur.

    2ème méthode :
    • j'ai essayé d'utiliser le xslt avec saxon.jar mais je n'ai pas réussi à avancer non plus.
      j'ai crée dans le même répertoire un fichier.xsl qui contient un lien vers mon fichier.xml mais c'est tout.
      comment je peux creuser plus dans cette direction?

    3ème méthode :

Discussions similaires

  1. Chargement dynamique des composants JSF
    Par info_plus dans le forum JSF
    Réponses: 5
    Dernier message: 26/02/2009, 10h20
  2. Chargement dynamique d'image et redimensionner.
    Par Boogzz dans le forum ActionScript 3
    Réponses: 8
    Dernier message: 22/05/2008, 10h43
  3. [AS3][Delphi]Chargement dynamique d'images
    Par spg40 dans le forum Flash
    Réponses: 0
    Dernier message: 06/03/2008, 17h01
  4. [FLASH 5] Chargement dynamique d'image
    Par ViveLesQuads dans le forum Flash
    Réponses: 26
    Dernier message: 12/12/2006, 10h59
  5. [CR.NET]Chargement dynamique d'une image
    Par Moah dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 14/12/2004, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo