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 :

definition d'une action sur un composant JSF, en java, avec passage de paramètres.


Sujet :

JSF Java

  1. #1
    mx5
    mx5 est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut definition d'une action sur un composant JSF, en java, avec passage de paramètres.
    Bonjour,

    Je réalise un composant JSF personnalisé, qui doit afficher des liens (entre autres).
    Ces liens fonctionnent lorsqu'ils sont décris, via des balises, dans ma page JSF; mais lorsque je veux construire des liens semblable en JAVA, ça bloque !
    La partie qui me pose problème est l'appelle d'une méthode de mon managed bean lors d'un clic : si j'appelle une méthode sans argument en entrée, OK ça fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    linkOk = (HtmlCommandLink)context.getApplication().createComponent(HtmlCommandLink.COMPONENT_TYPE); 
    linkOk.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monBean.maMethodeSansArg}", null, new Class[0]));
     
    form = new HtmlForm();
    this.getChildren().add(form);
    form.getChildren().add(linkOk);
    Par contre si je veux lui passer des arguments... je sais pô faire
    J'ai tenté comme ceci (en fait il y a un seul paramètre en entrée, de type String) :
    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
     
    linkKo = (HtmlCommandLink)context.getApplication().createComponent(HtmlCommandLink.COMPONENT_TYPE); 
    linkKo.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monBean.maMethodeAvecArgString}", null, new Class[] {String.class}));
     
    //Parametre
    UIParameter parameter = (UIParameter)context.getApplication().createComponent(UIParameter.COMPONENT_TYPE);
    parameter.setId("paramId");
    parameter.setTransient(false);
    parameter.setName("paramName");
    parameter.setValue("laValeur");
     
    linkKo.getChildren().add(parameter);
     
    form = new HtmlForm();
    this.getChildren().add(form);
    form.getChildren().add(linkKo);
    J'obtiens un message d'erreur :
    java.lang.IllegalArgumentException: wrong number of arguments
    Lors d'une autre tentative j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    linkKo.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monBean.maMethodeAvecArgString}", null, new Class[] {String.class}));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    linkKo.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monBean.maMethodeAvecArgString}", null, new Class[1]));
    Mais j'obtiens l'erreur :
    javax.faces.el.MethodNotFoundException: java.lang.NullPointerException

    Si quelqu'un peux m'aider ce serait vraiment coooooool !!

  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 : 45
    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
    Tu peux montrer la signature de ta méthode maMethodeAvecArgString de ton bean ?

    Si c'est
    public void maMethodeAvecArgString()
    alors c'est bon, mais si c'est
    public void maMethodeAvecArgString(String s)
    alors ce n'est pas bon
    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
    mx5
    mx5 est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Arrrggh !!
    La signature de ma méthode est la mauvaise :
    public void maMethodeAvecArgString(String s)

    c'est grave docteur ? Est-il impossible de passer un argument ?

    Peut-être faut-il alors que je mette à jour la propriété qui va bien dans mon bean...
    Mais est-il possible de mettre à jour mon bean et d'invoquer sa méthode lors d'un même évènement ?

  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 : 45
    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
    Citation Envoyé par mx5 Voir le message
    Arrrggh !!
    La signature de ma méthode est la mauvaise :
    public void maMethodeAvecArgString(String s)
    Je m'en doutais que c'était là le problème

    Citation Envoyé par mx5 Voir le message
    c'est grave docteur ?
    Oui. Mais ça se soigne !

    Citation Envoyé par mx5 Voir le message
    Est-il impossible de passer un argument ?
    Oui et non.
    Quand une méthode est appelée par un commandButton (ou commandLink) d'une page JSF, cette méthode ne peut avoir d'aguments (hormis un éventuel ActionEvent si tu utilises l'attribut actionListener plutôt qu'action, mais ça ne nous avance pas plus ici).

    Cependant, tu peux utiliser le composant <f:setPropertyActionListener/> pour résoudre ton problème. Comme je suis une faignasse, je te donne juste le lien vers la FAQ, et pas d'exemple...

    A noter que "EL Functor" (moi = faignasse donc pas de lien, mais Google est ton ami) te permet d'appeler des actions avec des paramètres dans les expressions EL (ce que tu mets entre #{...}) mais du coup, ce n'est plus trop standard tout ça...
    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
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    tu peut utiliser les composantes <f:param si disponible pour ta composante lien

  6. #6
    mx5
    mx5 est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 14
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos infos !

    Carinia, le coup des paramètres c'est ce que j'ai tenté avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Parametre
    UIParameter parameter = (UIParameter)context.getApplication().createComponent(UIParameter.COMPONENT_TYPE);
    parameter.setId("paramId");
    parameter.setTransient(false);
    parameter.setName("paramName");
    parameter.setValue("laValeur");
     
    linkKo.getChildren().add(parameter);
    Si je me suis loupé et qu'on peut faire quelque chose dans ce style, je suis preneur !



    Romaintaz, j'ai fais quelques recherches pour créer un <f:setPropertyActionListener> par programmation, mais sans succès...
    J'ai donc utilisé les EL FUNCTOR, et ce coup ci ça fonctionne !

    Merci encore, et pour info, voici un exemple d'appel à ma méthode, qui prend un paramètre de type String en entrée, et ne retourne rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String toto = "maValeur";
    linkOk.setActionExpression(context.getApplication().getExpressionFactory().createMethodExpression(context.getELContext(), "#{monBean.maMethodeAvecArgString$_['"+ toto +"'].action}", null, new Class[0]));

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/03/2011, 12h05
  2. Faire une action sur Control + C
    Par bluecurve dans le forum Langage
    Réponses: 1
    Dernier message: 20/07/2006, 00h19
  3. comment lancer automatiquement 1 script au lieu d'une action sur un boutton
    Par winnie82 dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 13/07/2006, 17h13
  4. une question sur les composants
    Par m14w dans le forum Delphi
    Réponses: 2
    Dernier message: 17/05/2006, 19h26
  5. Faire a un script executer une action sur un signal
    Par vodevil dans le forum Langage
    Réponses: 1
    Dernier message: 13/12/2005, 11h14

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