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 :

Quand utiliser le actionListener?


Sujet :

JSF Java

  1. #1
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Par défaut Quand utiliser le actionListener?
    Bonjour,
    Est ce qu'on peut m'expliquer s'il vous plaît la différence entre l'attribut action d'un commandButton et l'attribut actionListener?Ceci afin de voir quand est ce que utiliser le actionListener et quand est ce que utiliser le action!
    Je sais bien que l'attribut me servira pour faire des navigations et l'autre non,mais est ce qu'il autre chose qui fait la différence?et si possible un exemple d'utilisation du actionListener.
    Merci d'avance
    Mes articles, Mon Blog

    Rubrique Jasper/iReport :
    ------- Forum Jasper --------
    ----- FAQ Jasper/iReport -----


  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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Hello,

    Une chose est claire : ce que tu peux faire avec un action, tu peux le faire avec un actionListener, et vice-versa (la réciproque étant vraie, comme l'inverse d'ailleurs)...

    Maintenant, je dirais ceci :
    Si tu as besoin de faire une action qui sera suivie d'une navigation, alors l'action est tout à fait adaptée.
    Sinon, l'actionListener peut faire l'affaire.

    L'intérêt principal de l'actionListener est de récupérer l'ActionEvent qui est à l'origine du déclenchement de l'action. C'est pratique pour récupérer par exemple un composant de l'arbre JSF (ce qui peut être fait dans l'action en faisant un FacesContext.getCurrentInstance().getViewRoot().findComponent(...))...

    J'ajoute une question pour le fun : Quand on définit un action et un actionListener, seule l'une des 2 est exécutée je crois. Est-ce le cas ? Est-ce qu'on sait forcément laquelle ? (genre ce sera toujours l'actionListener, et jamais l'action)...
    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
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    Une chose est claire : ce que tu peux faire avec un action, tu peux le faire avec un actionListener, et vice-versa (la réciproque étant vraie, comme l'inverse d'ailleurs)...
    Euuuh t'es sûr?
    voilà ce que je viens de faire :
    dans la page JSF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <html:commandButton value="Login..."
    			action="#{LoginPageBean.navigate}"/>
    		<br>
    <html:commandButton value="Login V2..."
    			actionListener="#{LoginPageBean.navigateListener}"/>
    Dans le Managed-Bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public String navigate(){
     
    		return "ok";
     
    	}
     
    	public String navigateListener(ActionEvent Event){
    		return "ok";
    	}
    Résultat : le 1er bouton(Login...) provoque la navigation vers la page configurée dans le faces-config.xml par contre le 2ème bouton (Login V2...) ne la provoque pas seulement la page est raffraîchie.
    Je ne pense pas que la navigateListener provoque la navigation!
    Mes articles, Mon Blog

    Rubrique Jasper/iReport :
    ------- Forum Jasper --------
    ----- FAQ Jasper/iReport -----


  4. #4
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Citation Envoyé par JauB Voir le message
    ...
    Oui, je suis sûr.
    Ok, j'admets que j'ai été un peu rapide dans mes explications.

    Ce que je voulais dire exactement, c'est que tu peux faire de la navigation en utilisant un actionListener, mais je n'ai pas sous-entendu que tu le faisais de la même façon qu'avec un action, c'est-à-dire en retournant un String représentant l'ID de la navigation rule à appliquer...

    Ce que je voulais dire, c'est que même si tu utilises un actionListener, tu peux très bien décider de réaliser une navigation dans le corps de la méthode, en utilisant par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FacesContext.getCurrentInstance().getExternalContext().redirect("uneURL");
    (j'ai plus le code Java en tête pour faire une redirection en donnant l'ID de la navigation rule, mais grosso modo, c'est le même principe).

    Un actionListener retourne en effet toujours void.

    Est-ce plus clair ?
    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

  5. #5
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Maroc

    Informations professionnelles :
    Activité : Freelancer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Par défaut
    Ah ok merci pour cette explication.
    Donc ça se voit qu'il est propre de passer, en cas de navigation, par une action au lieu de actionListener .
    Résolu
    Mes articles, Mon Blog

    Rubrique Jasper/iReport :
    ------- Forum Jasper --------
    ----- FAQ Jasper/iReport -----


  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 37
    Par défaut
    Salut,

    Je sais le poste date d'un an environ mais j'aimerais rajouter un détail (qui finalement n'en est pas un).

    Pour mes test j'avais besoin de transférer une exception et l'afficher dans une page JSP, j'ai donc un bean "testProjetException" et 2 pages : la première avec un formulaire et la deuxième qui affiche l'exception.

    Dans la première page, j'ai une méthode "public String testClisk()" dans laquelle je crée un bean testProjetException ensuite :

    - Si dans le faces-config.xml je place le bean en session, que j'utilise un attribut "action" et si la méthode testClisck contient le code suivante :
    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
     
            public String testClisk(){//ActionEvent actionEvent) throws IOException {
     
            Exception e = new Exception("erreur");
            StackTraceElement[] stack = new StackTraceElement[2];
            StackTraceElement s1 = new StackTraceElement("Trace 1", "Trace 1",
                    "Trace 1", 1);
            StackTraceElement s2 = new StackTraceElement("Trace 2", "Trace 2",
                    "Trace 2", 2);
            stack[0] = s1;
            stack[1] = s2;
            e.setStackTrace(stack);
     
            String trace = "";
            for (StackTraceElement stackTraceElement : stack) {
                trace += stackTraceElement.toString() + " ";
            }
     
            TestProjetException exception = (TestProjetException) this
                    .getFacesContext().getApplication().getExpressionFactory()
                    .createValueExpression(this.getFacesContext().getELContext(),
                            "#{testProjetException}", TestProjetException.class)
                    .getValue(this.getFacesContext().getELContext());
     
            exception.setException(e.getMessage() + ": " + trace);
          return "erreur";
     
        }
    Dans la page suivante j'ai bien le résultat : erreur: Trace 1.Trace 1(Trace 1:1) Trace 2.Trace 2(Trace 2:2) ==> le bean est bien alimenté dans la session.

    - Si dans le faces-config.xml je place le bean en request, que j'utilise un attribut "action" et si la méthode testClisck contient le même code que précédemment : le résultat est identique donc le bean est bien alimenté dans la requête

    - Si dans le faces-config.xml je place le bean en session, que j'utilise un attribut "actionListener" et si la méthode testClick(ActionEvent actionEvent) contient le code suivant :
    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
     
    public void testClisk(ActionEvent actionEvent) throws IOException {
     
            Exception e = new Exception("erreur");
            StackTraceElement[] stack = new StackTraceElement[2];
            StackTraceElement s1 = new StackTraceElement("Trace 1", "Trace 1",
                    "Trace 1", 1);
            StackTraceElement s2 = new StackTraceElement("Trace 2", "Trace 2",
                    "Trace 2", 2);
            stack[0] = s1;
            stack[1] = s2;
            e.setStackTrace(stack);
     
            String trace = "";
            for (StackTraceElement stackTraceElement : stack) {
                trace += stackTraceElement.toString() + " ";
            }
     
            TestProjetException exception = (TestProjetException) this
                    .getFacesContext().getApplication().getExpressionFactory()
                    .createValueExpression(this.getFacesContext().getELContext(),
                            "#{testProjetException}", TestProjetException.class)
                    .getValue(this.getFacesContext().getELContext());
     
            exception.setException(e.getMessage() + ": " + trace);
     
    String url = this.getExternalContext().encodeActionURL(
                    this.getExternalContext().getRequestContextPath() + "/pages/errorPages.jsf");
            this.getExternalContext().redirect(url);      
     
        }
    Dans la page suivante j'ai bien le résultat : erreur: Trace 1.Trace 1(Trace 1:1) Trace 2.Trace 2(Trace 2:2) ==> le bean est bien alimenté dans la session.

    - Si dans le faces-config.xml je place le bean en request, que j'utilise un attribut "action" et si la méthode testClisck contient le même code que précédemment : le résultat est le suivant "Exception générale" qui est la valeur par défaut définie dans le faces-config.xml

    si je rajoute la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FacesContext.getCurrentInstance().getExternalContext().getRequestMap()
                    .put("testProjetException", exception);
    Rien à faire le bean n'est pas alimenté dans la requête.

    Ma conclusion :
    Si on souhaite manipulé des beans en session et/ou en requête et faire de la navigation, il vaut toujours mieux utiliser l'attribut "action"
    L'attribut "actionListener" est a réservé pour la manipulation de bean ou de composants sur la même page et non pour la navigation sauf si le bean est en session ou que la page d'arrivée ne manipule pas de bean requête issue de la page précédente.

    Voilà, j'espère ne pas vous égarer en étant dans le faux mais j'ai testé tout ça car j'en avais un peu marre de ne pas savoir quand et pourquoi mes beans en requête n'était jamais alimentés, maintenant je sais.

    @+

    Cheachwood

  7. #7
    Invité de passage
    Homme Profil pro
    Urbaniste
    Inscrit en
    Janvier 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Janvier 2012
    Messages : 1
    Par défaut Navigation Avec un ActionListener
    Les méthodes actionListener n'a pas de valeur de retour, qui est utilisé par le moteur de navigation JSF pour naviguer vers une autre page. Donc vous pouvez dire, il n'y a pas moyen de naviguer vers une autre page à partir d'une méthode actionListener.

    http://www.kiefinger.net/jo/index.ph...=article&id=62

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

Discussions similaires

  1. [POO] Quand utiliser une classe ?
    Par Gwipi dans le forum Langage
    Réponses: 8
    Dernier message: 05/05/2006, 14h31
  2. [Jgraph] Utiliser l'actionListener
    Par danje dans le forum 2D
    Réponses: 2
    Dernier message: 29/11/2005, 18h03
  3. Réponses: 10
    Dernier message: 08/02/2005, 10h52
  4. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 22h22
  5. [Procédure Stocké] Quand utiliser ?
    Par touhami dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/03/2004, 09h09

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