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

Struts 2 Java Discussion :

Champ de formulaire avec nom de la forme a[b][c][x]


Sujet :

Struts 2 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Par défaut Champ de formulaire avec nom de la forme a[b][c][x]
    Bonjour,

    J'ai une liste d'éléments de taille inconnue, et j'ai juste leur nom comme relation unique. Chaque élément peut avoir des variables elles aussi nommées, et c'est là que les problèmes arrivent :

    Habitué à PHP, je fais ceci :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="text" name="variables[nom.unique][blah]" />

    (ou <s:text ...> si vous voulez)


    Ce qui quand le formulaire est posté me crée un tableau :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $_POST['variables'] = array(
     'nom.unique' => array(
       'blah' => ...,
     ),
    );

    En Java, les tableaux associatifs n'existent pas, mais on a les Map, et ça marche de la même façon.

    Là où le bas blesse, c'est que je veux que ça fonctionne dans struts2 (quand même!) sans devoir faire une action spécifique pour chacun des éléments (et donc, plus de difficulté à modifier les éléments vu s'il y en a une infinité, etc).

    J'ai une méthode setVariables, mais évidemment ça rate : Struts2 analyse le nom comme une expression OGNL, et le point c'est pour séparer les objets. Bref, il n'aime pas, c'est le moins que je puisse dire.

    Y-a-t'il un moyen de retrouver cet équivalent PHP dans Struts? Et ce sans parser les variables POST à la main?

  2. #2
    Membre Expert Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Ok je veux bien t'aider à supprimer ton probleme mais je ne suis pas sur d'avoir tout bien compris.

    EN gros tu as un tableau, qui peut contenir un autre tableau, qui peut lui meme en contenir un, etc......? C'est ca?


    Deja si tu utilises struts <input:........> (tu OUBLIES). En Struts c'est plutot : <html:text ...>


    Pour iterer sur un tableau (une collection), il y a la balise : <logic:iterate ...>
    qui te permet d'afficher un nombre inconnu d'élément tout en parcourant ta liste.

    Voilà ce sont les seules precisions que je peux t'apporter tant que je ne suis pas très sur de ce que tu souhaites. Et de ce que tu as reussi à faire.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Par défaut
    Citation Envoyé par maxf1
    Ok je veux bien t'aider à supprimer ton probleme mais je ne suis pas sur d'avoir tout bien compris.

    EN gros tu as un tableau, qui peut contenir un autre tableau, qui peut lui meme en contenir un, etc......? C'est ca?
    Non. Mon but c'est d'afficher un formulaire pour des variables dont le nom est inconnu (imprévisible serait plus juste), et de pouvoir le traiter derrière dans struts2.

    Pour être plus explicite : j'ai une liste de N objets de type A, ayant un nom, et un ensemble de propriété de type B. Je veux modifier ces propriétés.

    J'ai deux choix :

    1. Soit je fais une action par objet : là, j'ai plus qu'à déclarer dans mon action tous les setters pour les champs de formulaire. Mais j'ai pas envie de me taper N action struts.

    2. Soit je fais un truc générique. là, j'utilise mes connaissances en PHP où justement ça se résout facilement

    J'utilise aussi une taglib pour mon affichage (je suis obligé de passer par là), et freemarker pour ce qui est de l'affichage, donc les trucs struts2 (voir en dessous) on oublie.

    Maintenant, concrètement, je vais avoir un gros formulaire avec un tas de champ, et je souhaite gérer les variables dans l'action Struts2 quand j'appuie sur le bouton Envoyer.

    Deja si tu utilises struts <input:........> (tu OUBLIES). En Struts c'est plutot : <html:text ...>
    Raté d'où ma remarque (ou <s:text si vous voulez). Ceci dit, je suis dans une taglib qui utilise freemarker, et j'ai pas trop saisi comment faire appel à struts depuis.

    J'ai vu des exemples sur le site de struts pour cela, mais dés lors que je fais assign s = JspTagLib("/struts-blank"); ça plante (logique: il doit pas trouver le TLD qui est dans le jar de struts2, sauf que dans mon cas c'est carrément l'expression/fonction JspTagLib qui n'est pas trouvée).

    Pour iterer sur un tableau (une collection), il y a la balise : <logic:iterate ...>
    qui te permet d'afficher un nombre inconnu d'élément tout en parcourant ta liste..
    Non. Je ne suis pas dans cette logique du tout.

    Dans ma taglib, j'ai à peu près ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <#list variables as variable>
    <#list variable.properties as property>
    <input type="text"
           name="var[${variable.name}][${property.name}]"
           value="..." />
    </#list>
    </#list>
    Qui si tu veux peut se remplacer par du struts, mais on oubliera pour se concentrer sur le fond :

    Je veux savoir comment struts2 (pas le 1, même si ça doit être pareil je suppose) gère les variables de type POST dans ce cas particulier? Car si le nom est par exemple variable[] il va faire appel à : action.setVariables(String[]).

    Je souhaiterais qu'il fasse (dans mon cas) appel à :

    action.setVariables(Map<String, Map<String, String>> map).

    Ou Object à la place de Map<String, String> si on admet qu'on puisse avoir soit une String soit une autre Map<String, String>.

    Ca, à la limite je peux aussi m'amuser à analyser les variables dans la requête (request.getParameter(...)), mais si struts2 le fait déjà, alors inutile de réinventer la roue.

    Sauf que dans la doc de struts2, pas moyen de trouver des informations sur la façon dont il gère les formulaires, et ces cas.

    Note bien que tout ceci, si je le fais en PHP, se fait naturellement : il me créera bien un tableau associatif comme je le souhaite. Mais en JSP et en Struts2, je sais vraiment pas :/

    - Sinon, désolé pour le manque de précision.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Par défaut
    Pour ceux que ça intéresse

    http://struts.apache.org/2.x/docs/ta...h-hashmap.html

    Voilà, je le flag Résolu

  5. #5
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 241
    Par défaut
    Peux-tu indiquer ta solution ?

    Merci.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2004
    Messages : 8
    Par défaut
    Non. Car je suis méchant !

    Plus sérieusement, voir le lien. Alors comme il est pas très clair :

    Si tu as ça dans ta JSP

    <s:text name="a['a']['b']" />

    (Les quotes sont nécessaires sinon struts lira une expression OGNL, et râlera, ce qui n'est pas le cas en PHP, mais passons)

    Il faut que tu ai ça en gros comme action :

    Code java : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
      private Map<Object, Object> a = new HashMap<Object, Object>() {
     
        @Override
        public Object put(Object key, Object value) {
          System.out.println("put " + key + "=" + value);
          return super.put(key, value);
        }
     
        @Override
        public Object get(Object key) {
          if (!containsKey(key)) {
            a.put(key, new HashMap<Object, Object>());
          }
          return super.get(key);
        }
     
     
      };
     
      public Map<Object, Object> getA() {
        return a;
      }
      public String getDada() {
        StringBuilder sb = new StringBuilder();
     
     
     
        for (Map.Entry<Object, Object> entry : a.entrySet()) {
          sb.append("key=").append(entry.getKey()).append("\n");
          if (entry.getKey() != null) {
            sb.append("keyClass=").append(entry.getKey().getClass()).append("\n");
            sb.append("keyClass=").append(
                entry.getKey().getClass().getCanonicalName()).append("\n");
          }
     
          if (entry.getValue() instanceof Object[]) {
            sb.append("value=")
                .append(Arrays.toString((Object[]) entry.getValue())).append("\n");
          } else {
            sb.append("value=").append(entry.getValue()).append("\n");
          }
          if (entry.getValue() != null) {
            sb.append("valueClass=").append(entry.getValue().getClass()).append(
                "\n");
            sb.append("valueClass=").append(
                entry.getValue().getClass().getCanonicalName()).append("\n");
          }
     
          sb.append("--------------------------").append("\n");
        }
     
        return sb.toString();
      }
     
      @Override
      @SuppressWarnings("unchecked")
      public String input() throws Exception {
        ActionContext ctx = ActionContext.getContext();
        Map params = ctx.getParameters();
     
        System.out.println(params);
     
        for (Object entry : params.entrySet()) {
          String key = ((Map.Entry<String, Object>) entry).getKey();
          String[] value = (String[])((Map.Entry<String, Object>) entry).getValue();
          System.out.println(key + "=" + Arrays.toString(value));
        }
        return super.input();
      }
     
      @Override
      public String execute() throws Exception {
        return input();
      }
     
    }

    C'est du 1.5, faut juste changer le type de la clef , et en gros :

    a est une HashMap<String, HashMap<String, String[]>> (bon, bien sûr tu ne peux pas paramétrer avec String[], mais c'est l'idée).

    En gros les valeurs de a, pour une clef donnée, sont soit des Map, soit des tableaux de chaîne.

    J'espère que ça aide, sinon l'exemple donné vous permettra de mieux comprendre.

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

Discussions similaires

  1. comparer un champ de formulaire avec la date systeme
    Par bachboucha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/11/2008, 17h41
  2. Affichage de nouveau champ de formulaire avec une case à cocher
    Par breizhgen dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/09/2006, 21h46
  3. [XHTML] Champ de formulaire avec des *
    Par Hayabusa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 20/06/2006, 20h35
  4. VALUE d'un champ de formulaire avec variable php
    Par shub dans le forum Langage
    Réponses: 5
    Dernier message: 04/04/2006, 12h13
  5. Champ de formulaire avec opérations
    Par Marmouz dans le forum Access
    Réponses: 8
    Dernier message: 30/11/2005, 15h00

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