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 :

Réinitialisation des données dans une page - Pb de cycle de vie JSF ?


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Par défaut Réinitialisation des données dans une page - Pb de cycle de vie JSF ?
    Bonjour,

    Je travaille sur une application utilisant JSF avec Wildfly 8 comme conteneur et PrimeFaces pour l'aspect graphique,
    Je bloque sur un point particulier, je souhaite que l'utilisateur puisse sélectionner un 'jeu de scénario' parmi une liste de jeux de scénarios tirée de la base de données puis afficher des éléments de ce jeu de scénario (données de temps ou réseau), leur associer du texte pour afficher comme légende sur un graphique à créer.

    Le problème vient du fait que la méthode init() de ma classe (utilisée avec @PostConstruct) est appelée à différents moments du traitement ce qui me réinitialise mes données et je termine alors avec un NullPointerException.
    Je ne sais pas si c'est un problème de cycle de vie JSF, d'une mauvaise utilisation de Primefaces et d'ajax ou encore autre chose.

    Traitement
    Dans une classe MBStatistics associée une page statistics.xhtml, je crée ma liste de jeux de scénarios dans une nouvelle fenêtre avec une classe MBStatView associée la page statView.xhtml (utilisation d'un Listener). L'utilisateur sélectionne une des lignes de la liste ce qui retourne un jeu de scenario 'jeuscen'.
    A partir de là une liste d'objets DataToPost 'listScenData' est mise à jour avec les valeurs du Jeu de Scenario (toujours dans la page statistics)
    L'utilisateur peut en sélectionner plusieurs parmi les 8 valeurs ce qui renvoie une nouvelle liste d'objets DataToPost 'selectedData'.
    Et des que l'utilisateur clique sur le bouton permettant de générer des graphes, la méthode init() est rappelée (entre autre) et tous mes objets réinitialisés.
    A noter que mon objet 'jeuscen' est aussi réinitialisé alors qu'il n'est pas présent dans cette méthode ce qui me fait croire que tous les objets sont réinitialisés lors d'un rechargement de la page.

    J'utilise dans ma page statistics.xhtml de l'ajax avec une option update sur un commandButton pour mettre à jour ma liste d'objets DataToPost
    http://www.primefaces.org/showcase/ui/df/data.xhtml


    MBStatistics
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    @ManagedBean
    @RequestScoped
    public class MBStatistics implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
            private Jeuscenario jeuscen;
     
    	  private DataToPost dtp1 = new DataToPost(1, "No Data", "Result Time", "");
    	private DataToPost dtp2 = new DataToPost(2, "No Data", "Result Time", "");
            ...
    	private DataToPost dtp8 = new DataToPost(8, "No Data", "Network Time", "");
     
    	private List <DataToPost>  listScenData = new ArrayList<DataToPost> ();  
     
     
    	@PostConstruct
    	private void initMBStat() {
                             ....
     
    			listScenData.add(dtp1);
    			listScenData.add(dtp2);
    			listScenData.add(dtp3);
    			listScenData.add(dtp4);
    			listScenData.add(dtp5);
    			listScenData.add(dtp6);
    			listScenData.add(dtp7);
    			listScenData.add(dtp8);
    		System.out.println("MBStatistics : initMBStat finish");
    	}
     
    //////////////////////////////////////////////////////////////
        public void chooseJeuscen() {
            Map<String,Object> options = new HashMap<String, Object>();
            options.put("resizable", false);
            options.put("draggable", false);
            options.put("modal", true);
            RequestContext.getCurrentInstance().openDialog("statView", options, null);
        }
     
    //////////////////////////////////////////////////////////////
      public void onJeuscenChosen(SelectEvent event) {
            jeuscen = (Jeuscenario) event.getObject();
            System.out.println("jeuscen Choosen : " +jeuscen.getName());
     
     
     
            // attribution des données temps et réseau pour affichage
             f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime1());
    		dtp1=listScenData.get(0);
    		dtp1.setName(jeuscen.getScenarios().get(0).getResultimes().getNametime1());
    		listScenData.remove(0);
    		listScenData.add(0,dtp1);
     
     
        	f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime2());
     
            if (jeuscen.getScenarios().get(0).getResultimes().getNametime2()==null)
       		{}
            else 
            {
    			dtp2=listScenData.get(1);
    			dtp2.setName(jeuscen.getScenarios().get(0).getResultimes().getNametime2());
    			listScenData.remove(1);
    			listScenData.add(1,dtp2);
     
                            f_listData.add(jeuscen.getScenarios().get(0).getResultimes().getNametime2());
            }
     
           ....
     
            if (jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4()==null)
       		{}
    	   else
    	   {
    			dtp8=listScenData.get(7);
    			dtp8.setName(jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4());
    			listScenData.remove(7);
    			listScenData.add(7,dtp8);
    	         f_listData.add(jeuscen.getScenarios().get(0).getBdbnetwork().getNamenetw4());
    	   }    
     
     
     
            f_listData.add("<var parameter>");
     
            varParameter=jeuscen.getVarparameter();
     
     
    		System.out.println("onJeuscenChosen finish");
        }
     
     
    //////////////////////////////////////////////////////////////
    		public String createChart(){
     
    		// Build lists of String for time and network for create chart
    		int cptResultimes=0;
    		int cptBdbnetworks=0;
     
    		/// TEST		
    		for (DataToPost dtp : listScenData)
    		{
    			System.out.println("listScenData : data n°"+dtp.getId()+", name :"+dtp.getName()+", legend"+dtp.getLegend());
    		}
     
    		for (DataToPost dtp : selectedData)
    		{
    			System.out.println("selectedData : data n°"+dtp.getId()+", name :"+dtp.getName()+", legend"+dtp.getLegend());
    		}
     
    		System.out.println("nb de DataToPost "+selectedData.size());
    		System.out.println(dtp1.getName() +" "+ dtp2.getName()+" "+ dtp3.getName()+" "+ dtp4.getName());
     
                    ...
     
    		for (int i=0; i<jeuscen.getNbscen();i++)
    		{
    			listScenFinal.add(jeuscen.getScenarios().get(i));
    		 }
     
    		 ...
            }
    statistics.xhtml
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    <h:form id="formToUpdate" target="_blank">
    		<div class="ui-grid ui-grid-responsive">
    			<div class="ui-grid-row">
    				<div class="ui-grid-col-12">
     
     
     
     
     
    						    <p:commandButton value="Select Set Scenario" icon="ui-icon-extlink" actionListener="#{mBStatistics.chooseJeuscen()}">
    						        <p:ajax event="dialogReturn" listener="#{mBStatistics.onJeuscenChosen}" update="ckb_DataPost" />
    						    </p:commandButton>
     
     
     
    					</div>
    				</div>
    			</div>
     
     
    	<br />
    	<br />
     
    			<div class="ui-grid ui-grid-responsive">
    				<div class="ui-grid-row">
    					<div class="ui-grid-col-6">				
    						<h3>Build Chart</h3>
    						<div >
     
     
    						    <p:dataTable id="ckb_DataPost" var="dataToPost" value="#{mBStatistics.listScenData}" selection="#{mBStatistics.selectedData}" rowKey="#{dataToPost.id}" style="margin-bottom:0">
    						        <f:facet name="header">
    						            Checkbox
    						        </f:facet>
    						        <p:column selectionMode="multiple" style="width:16px;text-align:center"/>
    						        <p:column headerText="Id">
    						            <h:outputText value="#{dataToPost.id}" />
    						        </p:column>
    						        <p:column headerText="Name">
    						            <h:outputText value="#{dataToPost.name}" />
    						        </p:column>
    						        <p:column headerText="Type">
    						            <h:outputText value="#{dataToPost.timeOrNet}" />
    						        </p:column>
    						        <p:column headerText="Legend">
    						            <h:inputText value="#{dataToPost.legend}" />
    						        </p:column>
     
    						    </p:dataTable>
     
    					 </div>
    On voit sur le résultat en console que dès que le bouton de génération de graphes est cliqué (default task-35) la méthode init() est de nouveau appelée.

    Résultat en console
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    10:20:36,389 INFO  [stdout] (default task-11) MBStatistics : initMBStat finish
    10:20:39,976 INFO  [stdout] (default task-22) MBStatistics : initMBStat finish
    10:20:40,149 INFO  [stdout] (default task-24) --Select all jeuscenarios order by id 
    10:20:40,362 INFO  [stdout] (default task-24) --Select all scenarios order by id 
    10:20:40,783 INFO  [stdout] (default task-24) MBStatView : init finish
    10:20:42,751 INFO  [stdout] (default task-33) MBStatistics : initMBStat finish
    10:20:42,752 INFO  [stdout] (default task-33) jeuscen Choosen : SDU16-F9900
    10:20:42,756 INFO  [stdout] (default task-33) Resultimes :Java Time | Elap. Time | SqlnetMsgFromDblink | SqlnetMoreDataDblink
    10:20:42,757 INFO  [stdout] (default task-33) Network :Nb Fetch | MsgFromDblinkPckts | MoreDataDblinkPckts | null
    10:20:42,757 INFO  [stdout] (default task-33) listScenData :data n°1, name :Java Time, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°2, name :Elap. Time, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°3, name :SqlnetMsgFromDblink, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°4, name :SqlnetMoreDataDblink, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°5, name :Nb Fetch, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°6, name :MsgFromDblinkPckts, legend
    10:20:42,758 INFO  [stdout] (default task-33) listScenData :data n°7, name :MoreDataDblinkPckts, legend
    10:20:42,759 INFO  [stdout] (default task-33) listScenData :data n°8, name :No Data, legend
    10:20:42,759 INFO  [stdout] (default task-33) nb de DataToPost 8
    10:20:42,759 INFO  [stdout] (default task-33) Java Time Elap. Time SqlnetMsgFromDblink SqlnetMoreDataDblink
    10:20:42,759 INFO  [stdout] (default task-33) onJeuscenChosen finish
    10:21:02,602 INFO  [stdout] (default task-35) MBStatistics : initMBStat finish
    10:21:02,620 INFO  [stdout] (default task-35) listScenData : data n°1, name :No Data, legende
    10:21:02,621 INFO  [stdout] (default task-35) listScenData : data n°2, name :No Data, legend
    10:21:02,621 INFO  [stdout] (default task-35) listScenData : data n°3, name :No Data, legend
    10:21:02,621 INFO  [stdout] (default task-35) listScenData : data n°4, name :No Data, legend
    10:21:02,621 INFO  [stdout] (default task-35) listScenData : data n°5, name :No Data, legendf
    10:21:02,621 INFO  [stdout] (default task-35) listScenData : data n°6, name :No Data, legend
    10:21:02,622 INFO  [stdout] (default task-35) listScenData : data n°7, name :No Data, legend
    10:21:02,622 INFO  [stdout] (default task-35) listScenData : data n°8, name :No Data, legend
    10:21:02,622 INFO  [stdout] (default task-35) selectedData : data n°1, name :No Data, legende
    10:21:02,622 INFO  [stdout] (default task-35) selectedData : data n°5, name :No Data, legendf
    10:21:02,622 INFO  [stdout] (default task-35) nb de DataToPost 2
    10:21:02,623 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-35) #{mBStatistics.createChart()}: java.lang.NullPointerException
    Si vous avez une solution ou une idée pour contourner le problème, cela m'aiderait beaucoup.
    J'ai du mal à identifier la cause de cette régénération.

    Merci !

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Le comportement est normal compte tenu du scope @RequestScoped.
    L'instance de l'objet ne survivant pas à la requête http, il le recréé à chaque demande.

    Comme tu utilises l'injection JSF plutôt que CDI, je te suggère d'utiliser le scope @ViewScoped.
    Là, tant que tu restes sur la page, l'objet existe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Par défaut
    Merci OButterlin de ton aide.

    Il y a du mieux et il faut aussi que je modifie cette option sur la classe de résultat pour ne pas avoir de réinitialisation ??

    Du coup, j'ai d'autres erreurs qui apparaissent sur ma page de résultat.

    J'utilise dans ma page de génération de graphiques MBAnalVar

    @ManagedProperty("#{mBStatistics}")
    private MBStatistics mBstat;

    pour récupérer des éléments

    listScen = new ArrayList<Scenario>();
    listScen = mBstat.getListScenFinal();

    listResultimes=mBstat.getListSelResultimes();
    listNetworks=mBstat.getListSelNetwork();
    varyingParam=mBstat.getVarParameter();

    legend = mBstat.getLegend();

    et cela a pour effet de me relancer la méthode init() de MBStatistics.

    Donc là, ma méthode createChart de MBStatistics s'effectue complètement mais, j'ai encore une réinitialisation de la page à la fin.

    MBAnalVar
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    @ManagedBean
    @ViewScoped
    public class MBAnalVar implements Serializable {
     
    	private static final long serialVersionUID = 1L;
     
    	 ...
     
    	///////////////////////////////////////////////////////////
    	// List of Scenarios and list of times and networks results 
    	// retrieved from MBVariation, the varying parameter too
    	private List<Scenario> listScen;
    	private List<String> listResultimes;
    	private List<String> listNetworks;
    	private String varyingParam;
     
            ...
     
    	@ManagedProperty("#{mBStatistics}")
    	private MBStatistics mBstat;
     
    	@PostConstruct
    	public void init() {
     
     
    		listScen = new ArrayList<Scenario>();
    		listScen = mBstat.getListScenFinal();
     
    		listResultimes=mBstat.getListSelResultimes();
    		listNetworks=mBstat.getListSelNetwork();
    		varyingParam=mBstat.getVarParameter();
     
    		legend = mBstat.getLegend();
     
     
    		///////////////// TEST
    		System.out.println("TEST recup mBStat");
    		System.out.println("Var param "+varyingParam);
    		System.out.println("Resultimes nb :"+listResultimes.size());
    		System.out.println("Netwqork nb :"+listNetworks.size());
    		System.out.println("ListScenFinal nb :"+listScen.size());

    En console :
    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
     
    11:37:07,570 INFO  [stdout] (default task-9) Jeuscen SDU16-F99000
    11:37:07,570 INFO  [stdout] (default task-9) varParameter : fetch
    11:37:07,570 INFO  [stdout] (default task-9) X axis :<varying parameter>
    11:37:07,570 INFO  [stdout] (default task-9) listScenFinal nb scen 9
    11:37:07,571 INFO  [stdout] (default task-9) MBStatistics : createChart finish
    11:37:07,611 INFO  [stdout] (default task-9) MBStatistics : initMBStat finish
    11:37:07,613 INFO  [stdout] (default task-9) TEST recup mBStat
    11:37:07,613 INFO  [stdout] (default task-9) Var param null
    11:37:07,613 INFO  [stdout] (default task-9) Resultimes nb :0
    11:37:07,613 INFO  [stdout] (default task-9) Netwqork nb :0
    11:37:07,613 INFO  [stdout] (default task-9) ListScenFinal nb :0
    11:37:07,613 INFO  [stdout] (default task-9) MBAnalVar : Recup de MBStatistics OK
    11:37:07,613 INFO  [stdout] (default task-9) MBAnalVar : varyingParam null
    ...
    Merci

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Normalement, il ne devrait le faire qu'une fois si ton autre bean est lui aussi en @ViewScoped...
    Ceci dit, l'injection de dépendance va te faire la création de l'objet et tout ce qui s'en suit, je te suggère de récupérer une référence sur l'objet cible par son nom.
    J'utilise ce mécanisme (qui a en plus l'avantage d'autoriser des dépendances circulaires)
    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 Object managedBeanResolver(String name)
    {
        try
        {
            FacesContext facesContext = FacesContext.getCurrentInstance(); 
            ELContext elContext = facesContext.getELContext();
            return facesContext.getApplication().getELResolver().getValue(elContext, null, name);
        }
        catch (Exception e)
        {
            getLogger().log(Level.SEVERE, e.toString());
        }
        return null;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2014
    Messages : 16
    Par défaut
    OK, c'est tout nouveau pour moi mais je vais essayer de comprendre comment ce code fonctionne (je suis débutant sans formation "classique" ...)

    Je mettrais le code si j'y arrive.

    Merci

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    A vrai dire, c'est très simple à mettre en œuvre.
    Tu avais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ManagedProperty("#{mBStatistics}")private MBStatistics mBstat;
    avec le getter/setter associé...
    Tu pourras supprimer la propriété de ta classe et il te restera (si tu isoles ma méthode dans une méthode à part)
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ...
    public void laMethodeQueTuExposesPartiellement()
    {
        ...
        MBStatistics mBstat = managedBeanResolver("mBStatistics");
    
        listScen = new ArrayList<Scenario>();
        listScen = mBstat.getListScenFinal();
    
        listResultimes=mBstat.getListSelResultimes();
        listNetworks=mBstat.getListSelNetwork();
        varyingParam=mBstat.getVarParameter();
    
        legend = mBstat.getLegend();
        ...
    }
    ...
    public Object managedBeanResolver(String name)
    {
        try
        {
            FacesContext facesContext = FacesContext.getCurrentInstance(); 
            ELContext elContext = facesContext.getELContext();
            return facesContext.getApplication().getELResolver().getValue(elContext, null, name);
        }
        catch (Exception e)
        {
            getLogger().log(Level.SEVERE, e.toString());
        }
        return null;
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Transmettre des données dans une même page
    Par Detere dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/04/2008, 12h05
  2. [RegEx] Récupérer des données dans une page Web
    Par Pragmateek dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2006, 19h44
  3. [Formulaires] Traitement des données dans une autre page...
    Par sekiryou dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/03/2006, 09h08
  4. [PHP-JS] Traitement des données dans une autre page...
    Par sekiryou dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2006, 09h06
  5. Récupérer des données dans une page HTML
    Par newdelirium dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2005, 19h18

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