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 :

Rendu de composant "Renderer"


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut Rendu de composant "Renderer"
    Salut à tous,

    je souhaiterait avoir plus d'informations sur le renderer de jsf car c'est loin d'être bien expliqué dans les livres et docs, qq1 connait-il comment c'est gérer le rendu de composant de jsf ? merci de m'eclaircir avec des exemples.


    PS: je regarde dans le code source de jsf et y a pas mal de classes mais faut dire qu'on s'y perd vite pour localiser toute es classes nécessaires au renderer des composants.

  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 : 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
    Sur cette page, tu as la liste des composants de base de JSF, avec les classes utilisées pour gérer les composants ainsi que leurs renderers. Ca peut aider !

    Basiquement, un renderer a deux méthodes importantes (héritées de UIComponentBase ou plus exactement de UIComponent) : encodeBegin et encodeEnd.

    Grossièrement, quant JSF veut créer la page HTML, il parcourt l'arbre JSF des composants, et pour chaque composant, va faire appel à son renderer et lui demande de créer son rendu :
    Il appelle d'abord encodeBegin, puis va exécuter le rendu des composants enfants de ce composant, puis une fois ceci fait, il va appeler encodeEnd.

    Est-ce une introduction suffisante ?
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    merci pour ce lien très intéressant,
    si je résume un peu on dispose donc de trois classes pour chaque composant :

    -une pour le tag qui généralement hérite de UIComponentTag et va définir les attributs du tag avec leurs méthodes d'accès.

    -une pour le composant héritant de la classe définissant la famille du composant par exemple UIInput pour un inputText, et dans laquelle on définit de nombreuses méthodes liées au composant telles que setRendered() ...etc et cette méthode processDecodes() dont j'aimerais bien des explications.

    -et enfin une pour le renderer qui hérite de Renderer (indirectement cad par transitivité avec d'autres classes) et dans laquelle on trouve les méthodes
    decode(), encodeBegin(), encodeEnd(), encodeChildren(),

    merci de m'indiquer mes erreurs.

    si vous connaissez d'autres liens intéressants sur le renderer merci de m'en faire part

  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
    Oui et non

    - tout d'abord, pour le tag: c'est vrai si t'as besoin de tags jsp. Si tu utilise facelets, par exemple, un des avantage est qu'il n'est pas nécessaire de définir les tags.


    - ensuite pour le composant et le renderer: Tu as surement remaqué que le renderer et le composant ont des méthodes similaire (encodeBegin, encodeEnd, processDecode, convertValue, etc). En fait, si ton composant hérite de UIComponent et ne surcharge pas ces méthodes, tout le travail de décodage, encodage, conversion de valeur est délégué au renderer si celui-ci existe. Donc, si tu ne veux pas coder de renderer, suffit de coder directement dans les méthodes du composant. Cependant un renderer est plus pratique à utiliser je trouve.

    - En ce qui concerne la méthode processDecode, son role (qu'il soit dans le renderer ou dans le composant même) est de définir la "submitted value" du composant. C'est à de décoder la requete http (récupération par le facesContext des paramètres de requête) pour en extraire ce qui correspond à ton composant. Par exemple, un textfiel aurait une méthode processDecode() qui ressemblerait en simplifié à çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Map request =context.getExternalContext().getRequestParameterMap();
    String clientId = component.getClientId(context);
    if (request.containsKey(clientId))
        component.setSubmittedValue(request.get(clientId));
    Bien sûr, plus ton composant est complexe, plus il aura de bulot à faire

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