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 :

Appeler une méthode à partir d'une variable de datatable


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut Appeler une méthode à partir d'une variable de datatable
    Salut à Tous,

    je dispose d'une datatable qui affiche le contenu d'une liste cars, la liste est de type List<Car> avec Car qui correspond à une classe Car.java et disposant de plusieurs attributs et methodes.

    je voudrais mettre à jours un attribut de l'objet car correspondant à la ligne sachant que la valeur que je dois lui associer doit être le resultat d'une methode définie dans la classe Car.java.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    <t:dataTable value="#{bean.cars}" var="car">
     
        <t:column>
                  <h:outputText value="#{car.property}"
                  <h:commandLink value="monlien" action="#{car.method}"/>
        </t:column>   
     
    </t:datatable>
    le code ci-dessus ne passe pas, il semblerai que #{car.method} ferai reference à un attribut et non une méthode j'ai bien sûre essayer avec #{car.method()} et la ça me dit


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    org.apache.jasper.JasperException: /index.jsp(47,7) The function 'method' must be used with a prefix when a default namespace is not specified
    	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
    	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
    	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:148)
    	org.apache.jasper.compiler.Validator$ValidateVisitor$1FVVisitor.visit(Validator.java:1478)
    	org.apache.jasper.compiler.ELNode$Function.accept(ELNode.java:129)
    	org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:200)
    	org.apache.jasper.compiler.ELNode$Visitor.visit(ELNode.java:242)
    	org.apache.jasper.compiler.ELNode$Root.accept(ELNode.java:56)
    	org.apache.jasper.compiler.ELNode$Nodes.visit(ELNode.java:200)

    comment appeler une méthode à partir d'un objet qui lui même n'est pas un bean mais une variable d'iteration ?


    PS: j'ai essayer de déclarer aussi la variable comme étant un bean mais sans succès !

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Une solution te permettant de contourner ton problème serait d'invoquerr une méthode d'un vrai bean qui elle même va invoquer la méthode de la variable d'itération



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class bean {
      private Car selectedCar;
      //geter et setter de selectedCar
     
      public String action(){
        return selectedCar.action();
      }
    }
    Maintenant, le truc est d'affecter à selectedCar la valeur de la ligne courante:
    Deux méthodes:
    1. En passant par un dataModel et en récupérant le getRowData();
    2. avec un setPropertyActionListener:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <h:commandLink value="monlien" action="#{bean.action}">
    	<f:setPropertyActionListener value="#{car}"
    		target="#{bean.selectedCar}" />
    </h:commandLink>
    Bonne chance.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    Salut djo.mos et merci de ta réponse

    Je connaissait le setPropertyActionListener mais je n'était pas sûre qu'il répondait bien à mon besoin, question néanmoins : est-ce que le fait d'affecter à selectedCar la valeur de la ligne courante et ainsi modifier cet objet va automatiquement mettre à jours la ligne de la datatable ?


    pour la 1ère méthode quer tu a citer
    1. En passant par un dataModel et en récupérant le getRowData();

    J'aurais souhaiter si c'est possible un exemple

    ps: ma datatable utilise pour valeur une List<>

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

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Voici une solution pour ça (avec un actionListener) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void maMethode(ActionEvent event) {
        // On récupère la datatable
        HtmlDataTable datatable = (HtmlDataTable) event.getComponent().findComponent("idForm:idTable");
        // On récupère l'élément affiché sur la ligne où l'utilisateur a cliqué
        Car car = (Car) datatable.getRowData();
        // Traitement sur le client...
    }
    A noter qu'il faut donner un ID à ta datatable mais aussi au form qui la contient. Parce que pour récupérer la datatable il te faut l'ID complet du composant, c'est-à-dire idForm + ":" + idDataTable...

    Edit: Mon findComponent caste un HtmlDataTable. C'est valable pour un <h:dataTable>, or tu utilises le datatable de Tomahawk. Il faut changer la classe du coup...
    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
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,

    Citation Envoyé par Mediii Voir le message
    Je connaissait le setPropertyActionListener mais je n'était pas sûre qu'il répondait bien à mon besoin, question néanmoins : est-ce que le fait d'affecter à selectedCar la valeur de la ligne courante et ainsi modifier cet objet va automatiquement mettre à jours la ligne de la datatable ?
    Je ne sais pas ce que fait ta méthode action, mais si elle modifie l'objet auqyel elle appartient, oui, la ligne correspondante sera mis à jour lors du reRender de la page.

    Citation Envoyé par Mediii Voir le message
    pour la 1ère méthode quer tu a citer
    1. En passant par un dataModel et en récupérant le getRowData();

    J'aurais souhaiter si c'est possible un exemple

    ps: ma datatable utilise pour valeur une List<>
    Il faut attacher l'attribut value du composant dataTable à un javax.faces.model.DataModel au lieu de l'attacher directement à une liste.

    Voici la déclaration d'un DataModel dans un managedBean:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private DataModel dataModel = new ListDataModel();
    DataModel est une interface tout comme List tandis que ListDataModel est une implémentation tout comme ArrayList.
    Il faut ensuite pointer vers dataModel comme value d'une dataTable:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <h:dataTable value="#{monBean.dataModel}" var="x" >
    :
    :
    </h:dataTable>

    Ensuite, suite à un clic sur un commandLink ou un commandButton sur une ligne, et dans l'action appelée, il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object o = dataModel.getRowData();
    pour récupérer l'objet représenté par la ligne active.
    Il faut ensuite le caster vers son type d'origine.

    Pour alimenter un DataModel avec une liste (List), on procède comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataModel.setWrappedData(uneListeQuelquonque);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    Envoyé par romaintaz

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HtmlDataTable datatable = (HtmlDataTable) event.getComponent().findComponent("idForm:idTable");
    j'essaye d'éviter au mieux les appels suivant l'id des composants dans mon code, pour assurer une future généricité de ma page jsf, n'y a t il pas un autre moyen d'appeler le composant à partir de event sans passer par l'id ??



    Envoyé par djo.mos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object o = entityModel.getRowData();
    qu'est-ce que entityModel ?


    Enfin pour mettre à jours la page j'utilise dans ma methode action() qui modifie la ligne correspondante de la datatable le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FacesContext.getCurrentInstance().renderResponse();
    j'essaye les deux méthodes que vous m'avez citer

    merci beaucoup de vos réponses

  7. #7
    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 : 47
    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 Mediii Voir le message
    j'essaye d'éviter au mieux les appels suivant l'id des composants dans mon code, pour assurer une future généricité de ma page jsf, n'y a t il pas un autre moyen d'appeler le composant à partir de event sans passer par l'id ??
    Si :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public HtmlDatatable getDatatableFromEvent(ActionEvent evt) {
        UIComponent c = evt.getSource();
        while (c != null) {
            if (c instanceof HtmlDatatable) {
                return (HtmlDatatable) c;
            }
            c = c.getParent();
        }
        return null;
    }
    En gros, tu récupères l'objet source de l'événement, qui est un HtmlCommandLink ou HtmlCommandButton par ex., et tu remontes les parents de ce composant jusqu'à trouver le composant HtmlDatatable...
    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

  8. #8
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Citation Envoyé par Medii
    qu'est-ce que entityModel ?
    pardon, je parlais de dataModel, le champ de type DataModel.
    J'ai corrigé mon post.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2012, 09h27
  2. Obtenir une valeur à partir d'une méthode
    Par Iori Yagami dans le forum JSF
    Réponses: 1
    Dernier message: 24/08/2011, 13h39
  3. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  4. Appel une méthode à partir d'une ActionForm
    Par barchoui dans le forum Struts 1
    Réponses: 7
    Dernier message: 28/12/2008, 21h03
  5. Appel d'une méthode à partir d'une autre page
    Par mona dans le forum ASP.NET
    Réponses: 9
    Dernier message: 15/09/2007, 23h52

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