Précédent   Forum du club des développeurs et IT Pro > Java > Développement Web en Java
Développement Web en Java Forum d'entraide sur les technologies Web de Java (JSP/Servlets, Portlets, Applets, frameworks Web, etc.) Avant de poster -> FAQ Java EE
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/10/2012, 11h52   #1
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 259
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 259
Points : 6 112
Points : 6 112
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
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 16h43   #2
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 421
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

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

Informations forums :
Inscription : avril 2007
Messages : 18 421
Points : 33 169
Points : 33 169
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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.
__________________
⥀⥁ Чиз 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.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 16h51   #3
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 259
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 259
Points : 6 112
Points : 6 112
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
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 17h34   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 421
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

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

Informations forums :
Inscription : avril 2007
Messages : 18 421
Points : 33 169
Points : 33 169
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
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.
__________________
⥀⥁ Чиз 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.
tchize_ est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2012, 18h25   #5
thierryler
Rédacteur
 
Avatar de thierryler
 
Homme Thierry Leriche-Dessirier
Inscription : octobre 2007
Messages : 2 259
Détails du profil
Informations personnelles :
Nom : Homme Thierry Leriche-Dessirier
Localisation : France

Informations forums :
Inscription : octobre 2007
Messages : 2 259
Points : 6 112
Points : 6 112
Aie... Je l'ai dans l'os... C'était le cas simple la...
__________________
Thierry Leriche-Dessirier
Ingénieur Architecte JEE Freelance
Rédacteur pour Developpez
Professeur de Génie Logiciel à l'ESIEA

Page sur Developpez : http://thierry-leriche-dessirier.developpez.com
Site : http://www.icauda.com
Linked'in : http://www.linkedin.com/in/thierryler
Twitter : http://www.twitter.com/thierryleriche
thierryler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h41.


 
 
 
 
Partenaires

Hébergement Web