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

Développement Web en Java Discussion :

Références dans mes appels de composant


Sujet :

Développement Web en Java

  1. #1
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut Références dans mes appels de composant
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <mescomp:mycomposant mavar="#{monbean.getTranslation(localeManager.lang)}" ... />
    et dans mon bean, j'ai mis un System.out :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    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.

  5. #5
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    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

Discussions similaires

  1. [PHP 5.4] Passage par référence dans un appel de méthode
    Par Feneck91 dans le forum Langage
    Réponses: 8
    Dernier message: 06/06/2014, 14h49
  2. Recuperer des références dans mes mails
    Par pascal_macro dans le forum VBA Outlook
    Réponses: 11
    Dernier message: 29/01/2008, 14h33
  3. Référence manquante dans mes imports
    Par zooffy dans le forum Visual Studio
    Réponses: 2
    Dernier message: 14/08/2007, 09h49
  4. Réponses: 4
    Dernier message: 28/07/2007, 23h45
  5. Je ne trouve pas TabSheet dans mes composants.
    Par heider dans le forum EDI
    Réponses: 7
    Dernier message: 20/01/2006, 22h59

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