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 :

Lancer une action lors d'une sélection dans une liste déroulante


Sujet :

JSF Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut Lancer une action lors d'une sélection dans une liste déroulante
    Bonjour à tous,

    Dans une liste déroulante (selectOneMenu), je souhaiterais lancer une action à chaque sélection. JSF propose-t-il un procédé pour arriver à ce résultat? Ou faut-il passer par du javascript ?

    Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    C quoi ton framework de presentation ? RichFaces Ou PrimesFaces etc??? c'est pas du ressort de JSF ta question.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  3. #3
    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
    Points : 7 275
    Points
    7 275
    Par défaut
    Si tu souhaites exécuter une action (Java j'imagine) à chaque sélection, tu devras le faire en Ajax (ou alors en soumettant de force le formulaire, mais c'est un peu plus bourrin).

    Richfaces te le permet avec par exemple le composant <a4j:support>...
    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

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'utilise JSF standard (sans framework présentation complémentaire). J'ai fait des recherches sur le net et rien trouvé, ta réponse (romaintaz) ne me surprend donc pas, je voulais une confirmation. Je vais donc bidouiller avec javascript pour récupérer un bouton invisible et lui appliquer un click.

    Merci à tous les deux

  5. #5
    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
    Points : 7 275
    Points
    7 275
    Par défaut
    Ce n'est pas la peine. Tu peux faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <h:selectOneMenu ... onchange="this.form.submit();" valueChangeListener="#{monBean.monAction}">
        ...
    En gros, au onchange, tu soumets le formulaire. Ensuite, tu mets le code que tu voulais exécuter dans ton monBean.monAction...
    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

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'avais déjà essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:selectOneMenu ... onchange="submit()" valueChangeListener="#{monBean.monAction}">
    Je rentrais bien dans la méthode monAction mais son contenu (appel à une autre méthode) levait l'exception : AbortProcessingException. Ne comprenant pas j'ai fait machine arrière. Tu saurais d'où pourrait venir cette erreur?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    Salut,

    T'as que AbortProcessingException ?
    T'as pas un message indiquant pourquoi le traitement s'est arrêté ?
    Fais nous voir le code ou l'exception est levée et montre nous la pile de l'exception .
    Ils flottent tous en bas

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Le composant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:selectOneMenu value="#{bean.schedule.id}" onchange="submit()" valueChangeListener="#{bean.updateValue}">
                                <f:selectItems value="#{bean.list}"/>
                            </h:selectOneMenu>
    Méthode dans le bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void updateValue(ValueChangeEvent valueChangeEvent) {
            System.out.println(" --- updateValue --- ");
            deduceInformation();
        }
    Et l'erreur levée :
    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
    09:14:13,390 INFO  [STDOUT]  --- updateValue --- 
    09:14:13,390 SEVERE [faces] AbortProcessingException thrown when processing event of type 'javax.faces.event.ValueChangeEvent' during phase 'PROCESS_VALIDATIONS 3' for component with ID or Client ID of 'j_id_jsp_1091133475_168'
    09:14:13,390 SEVERE [faces] javax.faces.event.AbortProcessingException: /declaration/form/HeaderForm.jsp(61,24) '#{bean.updateValue}' java.lang.NullPointerException
    javax.faces.event.AbortProcessingException: /declaration/form/HeaderForm.jsp(61,24) '#{bean.updateValue}' java.lang.NullPointerException
            at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:93)
            at javax.faces.event.ValueChangeEvent.processListener(ValueChangeEvent.java:134)
            at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:771)
            at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:444)
            at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:701)
            at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
            at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
            at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
            at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
            at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
            at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
            at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
            at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
            at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
            at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
            at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.NullPointerException
            at fr.mgi.mcustomsweb.ics.managedbean.beanController.deduceInformation(beanController.java:492)
            at fr.mgi.mcustomsweb.ics.managedbean.beanController.updateValue(beanController.java:658)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.apache.el.parser.AstValue.invoke(AstValue.java:170)
            at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
            at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
            at javax.faces.event.MethodExpressionValueChangeListener.processValueChange(MethodExpressionValueChangeListener.java:91)
            ... 29 more
    Merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Personne ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    Salut,

    Ce n'est pas updateValue() qui pose directement problème.
    Ton exception nullPointerException est levée ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fr.mgi.mcustomsweb.ics.managedbean.beanController.deduceInformation(beanController.java:492)
    En clair, à la ligne 492 de ta classe BeanController, la méthode deduceInformation() a une instruction ou un objet null est sollicité pour un traitement (méthode, cast etc...).
    C'est à la ligne 492 (du code de l'époque en tout cas)que tu dois regarder.
    Ils flottent tous en bas

  11. #11
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    vérifie l'objet qui est null dans la fonction, peu être un objet pas initialisé.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Il me semblait que c'était AbortProcessingException qui provoquait le NullPointerException. Je vais regarder du coup.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    Si ca peut t'aider pour les prochaines fois :

    Lorsque une exception est propagée par une méthode, l'appelant de la méthode qui détecte l'exception peut ajouter à son tour une exception à la pile, on dit qu'il chaine une exception à une autre.
    L'appelant de l'appelant peut faire de même... jusqu'à l'appelant d'origine : le thread applicatif.
    at java.lang.Thread.run(Thread.java:619)
    Comme dans une pile classique, le premier élément ajouté à la pile se trouve tout en bas.
    C'est pareil pour une lire une stacktrace d'exceptions. Tu dois généralement chercher la source du problème dans la pile d'exception tout en bas : soit après le dernier caused by.
    Ils flottent tous en bas

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    Merci à tous les 2.

    D'après mes tests, la méthode updateValue est lancée juste avant que la valeur de la combo change. D'où le NullPointerException : le traitement se fait sur l'ancienne valeur de la combo (qui est null). Comment faire pour lancer un traitement après le changement de valeur?

    Merci

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Points : 595
    Points
    595
    Par défaut
    D'après mes tests, la méthode updateValue est lancée juste avant que la valeur de la combo change.
    Elle est censée être lancé au moment ou la valeur change.

    Dans la méthode proccessValueChange(ValueChangeEvent event) :
    - si tu fais event.getNewValue() tu as la nouvelle valeur choisie
    - si tu fais event.getOldValue(), tu as l'ancienne valeur.
    Ils flottent tous en bas

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 191
    Points : 118
    Points
    118
    Par défaut
    J'aurai dû regarder le contenu du getNewValue() bien avant. Il contient l'Id de l'objet sélectionné comme je voulais. Merci pour ce petit rappel utile sur les exceptions.

    Encore une petite question : Avec ce nouvel Id, je rafraîchi des données dans la page courante. Les dataTable se mettent bien à jour mais pas les combo box. Une idée?

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 17/02/2015, 10h34
  2. Réponses: 1
    Dernier message: 11/10/2011, 22h38
  3. Réponses: 7
    Dernier message: 05/10/2009, 14h43
  4. Réponses: 2
    Dernier message: 29/09/2009, 15h33
  5. Réponses: 5
    Dernier message: 17/10/2007, 18h17

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