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

Tapestry Java Discussion :

Select, loop, problème de récupération de valeur


Sujet :

Tapestry Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Select, loop, problème de récupération de valeur
    Bonjour,

    Voilà, j'utilise depuis peu Tapestry, et je tombe fréquemment sur quelques difficultés. Cette fois-ci c'est avec le select, ou le loop, et je n'arrive pas à trouver de solutions seule.

    Présentation du problème :
    J'ai des données dans une base de données sur des processeurs. La liste des processeurs est variable.
    Je souhaite faire un formulaire qui permet de faire des actions en fonction du processeur choisi. Bref dans ce formulaire je souhaite avoir un select pour choisir parmi la liste des processeurs.

    Voilà pour le moment mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <t:form>
       ...
       <select>
          <t:loop source="processorList" value="processor">
             <option value="processor.idProc">${processor.nameProc}</option>
          </t:loop>
       </select>
    </t:form>
    Et voici mon code java :
    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
     
    private List<Processor> processorList;
     
    private Processor processor;
     
    @Inject
    @Service("processorManager")
    private ProcessorManager processorManager;
     
    public List<Processor> getProcessorList() {
      return this.processorManager.getAllProcessor();
    }
     
    public Processor getProcessor() {
      return this.processor;
    }
     
    public void setProcessor(Processor processor) {
      this.processor = processor;
    }
    Donc voilà, j'ai réussi à afficher correctement ma liste de processeur (ouf, car j'ai cru comprendre qu'avec le select de Tapestry, il fallait faire un type énuméré) mais voilà .... impossible de récupérer le processeur choisi....

    Auriez-vous une idée de comment je pourrais faire pour le récupérer s'il vous plait? (j'ai la version 5.0.5 de Tapestry)

    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Salut !

    A ta place, j'utiliserai plutot le composant select, de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <t:select t:model="processorList" t:value="processor" t:encoder="processorEncoder"/>
    Note bien l'utilisation d'un encoder... Du coup, dans la partie Java, tu ajoutes ce getter:

    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
    	public ValueEncoder<Processor> getProcessorEncoder(){
    		return new ValueEncoder<Processor>(){
     
    			@Override
    			public String toClient(Processor value) {
    				return String.valueOf(value.getIdProc());
    			}
     
    			@Override
    			public Processor toValue(String clientValue) {
    				return processorManager.findProcessor(Integer.valueOf(clientValue));
    			}
     
    		};
    	}
    Ca devrait rouler normalement

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Hum... ce serait cool si ça pouvait tourner en effet!!

    Je me prenais pas mal la tête parce que je pensais que le select de tapestry ne prenait que des String ou des type Enum ... si je peux lui faire prendre des List je suis preneuse!

    Par contre, j'ai bien ajouté ce que tu m'as dit dans ma partie java.
    Soucis : java.lang.String cannot be cast to Processor lorsque je charge la page.

    Le problème vient de la méthode toClient.... et je pense plus précisément du paramètre d'entrée.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Points : 153
    Points
    153
    Par défaut
    Je viens de tester ça chez moi, le tout dans le code Java d'une page Index:
    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
     
    	public class Processor {
    		String name;
    		Integer id;
     
    		public Processor(int id, String name){
    			this.id=id;
    			this.name=name;
    		}
    		public String toString(){
    			return name;
    		}
    	}
     
    	private Processor processor;
     
    	public List<Processor> getProcessorList() {
    		List<Processor> processorList = new ArrayList<Processor>();
    		processorList.add(new Processor(1,"Intel"));
    		processorList.add(new Processor(2,"Athlon"));
    		return processorList;
    	}
     
    	public Processor getProcessor() {
    	  return this.processor;
    	}
     
    	public void setProcessor(Processor processor) {
    	  this.processor = processor;
    	}
     
    	public ValueEncoder<Processor> getProcessorEncoder(){
    		return new ValueEncoder<Processor>(){
     
    			@Override
    			public String toClient(Processor value) {
    				return String.valueOf(value.id);
    			}
     
    			@Override
    			public Processor toValue(String clientValue) {
    				int id= Integer.valueOf(clientValue);
    				for (Processor p : getProcessorList()) {
    					if (p.id == id)
    						return p;
    				}
    				return null;
    			}
     
    		};
    	}

    Et ça marche...

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Je me permets un double post, pour dire que j'ai réussi à résoudre mon problème et expliquer comment j'ai fait pour de potentielles personnes qui auraient pu être dans mon cas.

    Grâce à DeathMaker, j'ai orienté mes recherches sur le net vers les ValueEncoder. Et j'ai trouvé une page où quelqu'un expliquait simplement comment écrire un model. (oui parce que j'avais vu cette page : select tapestry mais sans commentaires, j'ai pas pigé grand chose).

    Donc voilà apparemment le soucis que j'avais après l'aide de DeathMaker venait de mon model.
    Je vous donne le code que j'ai maintenant et qui tourne (indication : j'utilise Hibernate, Spring et Tapestry et ma structure ressemble au tuto fourni par Baptiste Meurant (Tuto)).

    Mon select dans ma page html :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <t:select t:value="processor" t:model="processorModel"  t:encoder="processorEncoder"/>
    Le code java associé à la page html :
    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
     
    private Processor processor;
     
    @Inject
    @Service("processorManager")
    private ProcessorManager processorManager;
     
    public Processor getProcessor() {
      return this.processor;
    }
     
    public void setProcessor(Processor processor) {
      this.processor=processor;
    }
     
    public SelectModel getProcessorModel() {
      return (SelectModel) new ProcessorSelectModel(processorManager);
    }
     
    public ValueEncoder<Processor> getProcessorEncoder(){
      return new ValueEncoder<Processor>(){
     
        @Override
        public String toClient(Processor processor) {
          return String.valueOf(processor.getIdProc());
        }
     
        @Override
        public Processor toValue(String clientProcessor) {
          return processorManager.getProcessor(Integer.valueOf(clientProcessor));
        }
      };
    }
    Le model du processeur pour le select :
    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
     
    import org.apache.tapestry.util.AbstractSelectModel;
    import org.apache.tapestry.OptionGroupModel;
    import org.apache.tapestry.OptionModel;
     
    public class ProcessorSelectModel extends AbstractSelectModel {
     
      private List<OptionModel> options = new ArrayList<OptionModel>();
     
      public ProcessorSelectModel (ProcessorManager proc) {
        List<Processor> procList = proc.getAllProcessor();
        for(int i=0;i<procList.size();i++) {
          this.options.add(new ProcessorOptionModel(procList.get(i)));
        }
      }
     
      public List<OptionGroupModel> getOptionGroups() {
        return null;
      }
     
      public List<OptionModel> getOptions(){
        return this.options;
      }	
    }
    et enfin le ProcessorOptionModel :
    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
     
    import org.apache.tapestry.OptionModel;
     
    public class ProcessorOptionModel implements OptionModel {
     
      private Processor processor;
     
      public ProcessorOptionModel(Processor processor) {
        this.processor = processor;
      }
     
      public Map<String, String> getAttributes() {
        return null;
      }
     
      public String getLabel() {
        return this.processor.getNameProc();
      }
     
      public Object getValue(){
        return this.processor;
      }
     
      public boolean isDisabled() {
        return false;
      }
    }
    Et maintenant je récupère bien le processeur que j'ai choisi.
    Merci

    PS : désolée DeathMaker, je viens de voir ton post après avoir posté ceci :s Mais encore merci d'y avoir réfléchi

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    j'ai suivi les même étape mais je suis bloqué par un problème lié à la méthode public Object getValue() . SVP est qu'il y a quelqu'un qui' a une idé.

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

Discussions similaires

  1. Problème de récupération de valeur d'un select multiple
    Par poissonsoluble dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 30/11/2006, 10h37
  2. [SQL] Problème de récupération des valeurs d'une liste multiple en php
    Par BOLARD dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/05/2006, 01h29
  3. Problème de récupération de valeurs
    Par T'chab dans le forum Access
    Réponses: 3
    Dernier message: 24/04/2006, 11h37
  4. Problème de récupération de valeur de radio button...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/03/2006, 15h19
  5. Nouveau problème de récupération de valeurs.
    Par pmboutteau dans le forum ASP
    Réponses: 4
    Dernier message: 09/03/2005, 11h48

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