Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 547
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 547
    Points : 9 910
    Points
    9 910

    Par défaut Références dans mes appels de composant

    Bonjour,

    J'ai écris un petit composant pour mes pages :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <?xml version='1.0' encoding='UTF-8' ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" ...>
     
    	<cc:interface>
    		<cc:attribute name="mavar" required="true" />
    	</cc:interface>
     
    	<!-- IMPLEMENTATION -->
    	<cc:implementation>
     
    		<!-- fait plein de trucs avec mavar -->
     
    	</cc:implementation>
    </html>
    Je l'appelle, une seule fois, comme ça :

    Code :
    1
    2
     
    <mescomp:mycomposant mavar="#{monbean.getTranslation(localeManager.lang)}" ... />
    et dans mon bean, j'ai mis un System.out :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Monbean {
     
    ...
     
    public Trans getTranslation(String lang) {
      System.out.println("coucou");
    ...
    }
    Le problème, tout con, que j'ai avec ça, c'est que j'appelle mon composant une seule fois, mais que lui il utilise mavar (ie. la translation) plein de fois. Et en fait il appelle getTranslation autant de fois. En gros, j'ai 20 fois "coucou" dans les traces. Or getTranslation, ça coûte cher...

    Comment je peux faire pour que ça n'appelle getTranslation() que la fois où j'appelle mon composant et que ça transmette la valeur direct ?

    Th.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche
    Test DISC gratuit : http://www.profil4.com

  2. #2
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 597
    Points : 38 488
    Points
    38 488

    Par défaut

    Tu dois t'arranger pour que getTranslation garde la valeur en cache.

    Par exemple, rendre monbean est requestScope et stoker dans un champ la réponse à getTranslation.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Monbean {
     
    private Map<String,Trans> cache = ...;
     
    public Trans getTranslation(String lang) {
      if (!cache.contains(lang)){
      System.out.println("coucou");
      ... 
      cache.put(lang,...);
      }
      return cache.get(lang);
    }

    Ton composant appelera l'EL autant de fois qu'il en a besoin. Autrement dit, pour récupérer la valeur par défaut, pour stocker les valeur, à chaque fois qu'il boucle en interne, etc. Pourquoi? Parce qu'il ne peux pas être certains que la donnée n'a pas changé entre deux appels.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  3. #3
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 547
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 547
    Points : 9 910
    Points
    9 910

    Par défaut

    En fait, j'avais aussi pensé à faire du immediate/delayed evaluation (ie dollar/diese) mais sans plus de résultat.

    D'ailleurs j'ai simplifié mon cas de test à des includes simples :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    				xmlns:ui="http://java.sun.com/jsf/facelets"
    				xmlns:f="http://java.sun.com/jsf/core"
    				xmlns:h="http://java.sun.com/jsf/html"
    				xmlns:c="http://java.sun.com/jsp/jstl/core"
    				xmlns:pretty="http://ocpsoft.com/prettyfaces"
    				xmlns:c4comp="http://java.sun.com/jsf/composite/c4comp">
     
     	<h:panelGroup layout="block" id="zone-logo-site">
     
     		<ui:include src="logo-site_aux.xhtml" >
     			<ui:param name="mavar" value="${monbean.ariane.getTranslation(localeManager.lang)}"   />
    			...
    		</ui:include>
     
    	</h:panelGroup>
     
    </ui:composition>
    Et :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="UTF-8"?>
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"... >
     
     	<h:panelGroup layout="block" id="zone-logo-site_aux">
     		#{mavar.label}
     		#{mavar.label}
     
    	</h:panelGroup>
     
    </ui:composition>
    Je précise que mon "println" est dans la méthode "getAriane()"...

    Encore, pour cet exemple, je peux m'en sortir avec une pirouette mais mes pages sont remplies de ça :-(

    Je me demande si ça peut venir de jboss-el que j'utilise uniquement pour passer des param comme dans getTranslation(localeManager.lang)...
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche
    Test DISC gratuit : http://www.profil4.com

  4. #4
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 597
    Points : 38 488
    Points
    38 488

    Par défaut

    Ca viens de la manière dont les templates sont géré dans facelets là.

    Quand tu associer mavar à une expression, tu n'associer pas la valeur de l'expression, mais l'expression elle même. Du coup, #{mavar.label} consiste à aller chercher la valeur de "label" dans mavar.getValue(), avec ma var un objet de type Expression. Ca a ses avantages, (mavar peux changer de valeur au cours du cycle jsf) et aussi ses inconvénient (nombres d'accès).

    Je ne pense pas que tu aie d'autre solution que de rendre getTranslation plus performant. ou de récupérer tes données via d'autres bean qui contienent déjà le résultat du calcul.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro Thierry Leriche-Dessirier
    Inscrit en
    octobre 2007
    Messages
    3 547
    Détails du profil
    Informations personnelles :
    Nom : Homme Thierry Leriche-Dessirier
    Localisation : France

    Informations forums :
    Inscription : octobre 2007
    Messages : 3 547
    Points : 9 910
    Points
    9 910

    Par défaut

    Aie... Je l'ai dans l'os... C'était le cas simple la...
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche
    Test DISC gratuit : http://www.profil4.com

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •