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 :

[IceFaces] Modifier une composnte


Sujet :

JSF Java

  1. #1
    Membre éclairé Avatar de pmartin8
    Inscrit en
    Novembre 2003
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 306
    Par défaut [IceFaces] Modifier une composnte
    Bonjour,

    Je tente depuis 2 jours de créer une composante qui hérite de "InputText" de IceFaces. Ma composante ajoutera un attribut au <ice:inputText> normal.

    ex:<my:superInput myAttribute="banane">

    Ma composante utilisera la valeur de cet attribut (banane) pour "par exemple" changer le style de mon <input type="text" />.

    Maintenant, je ne suis plus trop certain ce que je dois faire. Est-ce que je dois faire un tagHandler ET un un renderer?

    Mes nouvelles classes hériteront de quelle classes de IceFaces?

    Je ne vois pas comment tout ca sera mis en place dans mon fichier qui contient mes custom tags (<facelet-taglib>)

    J'ai trouvé quelques sites qui expliquent comment créer ses custom tags... mais jamais un qui réutilise des composantes qui existent deja.

    J'utilises IceFaces 1.8.2 et JSF 1.2

    Un coupe de main serait apprécié !

  2. #2
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Bonjour,

    Je l'ai fait, même si c'était pour étendre des composants de Richfaces.

    Dans mon fichier de taglib, je définis mon propre namespace, avec les composants adéquats (je montre un exemple étendant un commandButton) :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <facelet-taglib>
        <namespace>http://ma.librairie/jsf</namespace>
        <tag>
            <tag-name>button</tag-name>
            <component>
                <component-type>my.component.button</component-type>
                <renderer-type>my.renderkit.button</renderer-type>
            </component>
        </tag>
        ...
    </facelet-taglib>

    Ensuite, j'ai un faces-config.xml propres à ma librairie de composants. C'est ici que le lien entre les component-type et renderer-type et les classes Java correspondantes sera fait.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <faces-config>
        <component>
            <component-type>my.component.button</component-type>
            <component-class>my.company.component.MyHtmlButton</component-class>
        </component>
        <render-kit>
            <render-kit-id>HTML_BASIC</render-kit-id>
            <renderer>
                <component-family>javax.faces.Command</component-family>
                <renderer-type>my.renderkit.button</renderer-type>
                <renderer-class>my.company.web.component.renderkit.MyButtonRenderer</renderer-class>
            </renderer>
        </render-kit>
        ...
    </faces-config>

    Et après, mes deux classes étendent les classes de HtmlCommandButton. Attention d'ailleurs à bien surcharger, dans la classe du composant, les méthodes saveState et restoreState. Par exemple, si tu as un attribut "banane" en plus des autres, il te faudra faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        @Override
        public void restoreState(FacesContext context, Object state) {
            Object[] values = (Object[]) (Object[]) state;
            super.restoreState(context, values[0]);
            this.banane = (String) values[1];
        }
     
        @Override
        public Object saveState(FacesContext context) {
            Object[] values = new Object[2];
            values[0] = super.saveState(context);
            values[1] = this.banane;
            return (Object) values;
        }
    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

  3. #3
    Membre éclairé Avatar de pmartin8
    Inscrit en
    Novembre 2003
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 306
    Par défaut
    Wow Merci!

    Donc si je comprends bien, il n'y a pas de Handler?

    Est-ce que je pourrais voir le contenu de ton MyHtmlButton.java et peut etre aussi MyButtonRenderer.java

    Merci pour ton aide! tres apprécié!

  4. #4
    Membre éclairé Avatar de pmartin8
    Inscrit en
    Novembre 2003
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 306
    Par défaut
    Et après, mes deux classes étendent les classes de HtmlCommandButton
    Je ne comprends pas comment t'es 2 classes étendent du meme parent... pourquoi est-ce que ton renderer devrait étende de cette classes-la!

    Je crois que je ne comprends pas exactement l,utilité de tes 2 classes...

  5. #5
    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 : 46
    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 me suis mal exprimé pardon. Je voulais dire que mes 2 classes étendent les 2 classes correspondantes du composant <h:commandButton> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MyHtmlButton extends javax.faces.component.html.HtmlCommandButton {
        ...
    }
     
    public class MyButtonRenderer extends com.sun.faces.renderkit.html_basic.ButtonRenderer {
        ...
    }
    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

  6. #6
    Membre éclairé Avatar de pmartin8
    Inscrit en
    Novembre 2003
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 306
    Par défaut
    ok ca fait plus de sens effectivement!


    Par contre, je remarque que la classe javax.faces.component.html.HtmlCommandButton définie la méthode "encodeStart" et "encodeEnd". Si je comprends bien, c'est ici que le code HTML sera généré pour le tag.

    Si ce que j'ai dit est vrai, je ne comprends pas l'utilité d'un renderer ....

    Merci encore

  7. #7
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Bon, les méthodes s'appellent encodeBegin et encodeEnd. Et oui, elles apparaissent dans les 2 classes
    Elles sont en fait héritées de UIComponentBase.

    Toutefois, la classe de composant (HtmlCommandButton) ne va pas créer de code HTML. Si on regarde le code de la méthode encodeBegin de UIComponentBase, on a grosso-modo ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public void encodeBegin(FacesContext context) throws IOException {
            if (context == null)
                throw new NullPointerException();
            if (!isRendered())
                return;
            String rendererType = getRendererType();
            if (rendererType != null) {
                Renderer renderer = getRenderer(context);
                if (renderer != null)
                    renderer.encodeBegin(context, this);
                else
                    log.fine((new StringBuilder()).append("Can't get Renderer for type ").append(rendererType).toString());
            }
        }
    Là où c'est important, c'est que l'on récupère le RendererType, autrement la classe de renderer, puis c'est à elle que l'on donne la tâche de créer le code HTML en appelant son encodeBegin().

    C'est plus clair ?
    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

  8. #8
    Membre éclairé Avatar de pmartin8
    Inscrit en
    Novembre 2003
    Messages
    306
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 306
    Par défaut
    ahhh ok !! Je vois maintenant! Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/01/2005, 13h43
  2. Modifier une partie de la source
    Par Sékiltoyai dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/10/2004, 21h52
  3. comment modifier une texture?
    Par tibyann dans le forum DirectX
    Réponses: 6
    Dernier message: 16/06/2004, 15h27
  4. [C#] Modifier une base de donnée
    Par Macintoc dans le forum Accès aux données
    Réponses: 15
    Dernier message: 03/06/2004, 11h49
  5. Modifier une partion ntfs avec Disk druid
    Par Sébastien dans le forum Administration système
    Réponses: 5
    Dernier message: 24/09/2003, 14h58

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