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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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