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 1 Java Discussion :

Récupération de valeurs d'un formulaire dynamique


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Récupération de valeurs d'un formulaire dynamique
    Salut,
    j'ai un formulaire dynamique sur ma JSP. En fait, mon formulaire doit pouvoir envoyer un nombre de pièces jointes au serveur qui est inconnu au chargement de la page. Pour faire ça, j'ai inséré un bout de Javascript qui ajoute un champ input de type file lors du clic sur un bouton.
    Le code généré est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <li><a href="#piecesjointes" onclick="$(this).parent().remove();"><img src="image/remove.png"></a><input name="piecejointe[1]" value="" class="piecejointe" id="1" type="file"></li>
    <li><a href="#piecesjointes" onclick="$(this).parent().remove();"><img src="image/remove.png"></a><input name="piecejointe[2]" value="" class="piecejointe" id="2" type="file"></li>
    <li><a href="#piecesjointes" onclick="$(this).parent().remove();"><img src="image/remove.png"></a><input name="piecejointe[3]" value="" class="piecejointe" id="3" type="file"></li>
    Dans mon bean associé à ce formulaire, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private FormFile[] piecejointe;
     
    	public FormFile[] getPiecejointe() {
    		return piecejointe;
    	}
     
    	public void setPiecejointe(FormFile[] piecejointe) {
    		this.piecejointe = piecejointe;
    	}
    Et lors de la soumission du formulaire, j'obtiens cette exception :

    javax.servlet.ServletException: BeanUtils.populate
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    cause mère

    java.lang.NullPointerException
    org.apache.commons.beanutils.PropertyUtilsBean.setIndexedProperty(PropertyUtilsBean.java:1414)
    org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1016)
    org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    J'ai aussi essayé, comme déjà vu sur le net, de générer des champs input avec le même attribut name (et non pas avec un indice qui s'incrémente. J'obtiens alors :

    javax.servlet.ServletException: BeanUtils.populate
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

    cause mère

    java.lang.IllegalArgumentException: Cannot invoke logica.forms.DemandeForm.setPiecejointe - argument type mismatch
    org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
    org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
    org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
    org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
    org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
    org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    Est ce que ça vient du fait que ce ne soit pas un type String simple, mais un champ file ?
    Dernière modification par c_nvy ; 17/04/2009 à 11h40. Motif: Balises [CODE] remplacée par balises [QUOTE]

  2. #2
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Cela fonctionne-t'il mieux en ajoutant getter et setter indexé dans le form-bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void setPiecejointe(int index, FormFile formFile)
    {   
      this.piecejointe[index] = formFile;   
    }   
     
    public FormFile getPiecejointe(int index)
    {   
      return this.piecejointe[index];   
    }
    EDIT : Il faut aussi initialiser le tableau de FormFile au nombre voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private FormFile[] piecejointe= new FormFile[3];

  3. #3
    Invité
    Invité(e)
    Par défaut
    A priori avec ta solution j'arrive sur une autre exception :

    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
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:495)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
     
    cause mère
     
    java.lang.reflect.InvocationTargetException
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	java.lang.reflect.Method.invoke(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773)
    	org.apache.commons.beanutils.PropertyUtilsBean.setIndexedProperty(PropertyUtilsBean.java:1391)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1016)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
     
    cause mère
     
    java.lang.NullPointerException
    	logica.forms.DemandeForm.setPiecejointe(DemandeForm.java:53)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    	java.lang.reflect.Method.invoke(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1773)
    	org.apache.commons.beanutils.PropertyUtilsBean.setIndexedProperty(PropertyUtilsBean.java:1391)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1016)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
    	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:816)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    Mais d'après ce que je comprends ça viendrait du fait que le tableau soit null lors du set. Je vais élaborer un peu ton set pour vérifier ça

  4. #4
    Invité
    Invité(e)
    Par défaut
    Comme je le pensais il suffisait d'élaborer le set pour étendre le tableau lorsque l'index à setter est en dehors du tableau. Voici les fonctions réécrites :

    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
    public void setPiecejointe(int index, FormFile formFile)
    	{
    		if(this.piecejointe == null)
    			this.piecejointe = new FormFile[1];
     
    		//tableau trop petit, on réalloue
    		if(this.piecejointe.length < index)
    		{
    			FormFile[] temp = new FormFile[index+1];
    			for(int i = 0 ; i < piecejointe.length ; i++)
    				temp[i] = piecejointe[i];
    			piecejointe = temp;
    		}
     
    		this.piecejointe[index] = formFile;
    	}
     
    	public FormFile getPiecejointe(int index)
    	{
    	  return this.piecejointe[index];
    	}
    Il y a peut être une manière plus classe de le faire, mais ça marche bien comme ça. Encore merci c_nvy

  5. #5
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Effectivement, il fallait prévoir le cas où l'index est supérieur à la taille du tableau.

    Ne connaissant pas la taille initiale du tableau, tu aurais pu utiliser une List de FormFile plutôt qu'un tableau, ce qui aurait été plus simple à gérer :
    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
    private List piecejointe = new ArrayList() ;
     
    public void setPiecejointe(int index, FormFile formFile)
    {   
      this.piecejointe.add(formFile);   
    }
    public FormFile getPiecejointe(int index)
    {
       if ( piecejointe == null ) this.piecejointe = new ArrayList() ;
       while (index >= this.piecejointe.size())
       {
           this.piecejointe.add(new FormFile());
       }
       return (FormFile) this.piecejointe.get(index);
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Exact, c'était la solution plus classe !
    je ne connaissais pas le principe des get / set indexés. J'aurai appris quelque chose !

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

Discussions similaires

  1. [MySQL] Récupération valeurs issues de formulaire dynamique
    Par stefsas dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/02/2010, 16h37
  2. Récupération de variable d'un formulaire dynamique
    Par The metalhorseman dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/02/2007, 11h29
  3. Récupérer valeur champs de formulaire dynamique
    Par antillejj dans le forum ASP
    Réponses: 1
    Dernier message: 22/12/2006, 07h17
  4. Réponses: 4
    Dernier message: 22/06/2006, 10h42
  5. récupération de valeur d'un formulaire
    Par greg64 dans le forum Langage
    Réponses: 5
    Dernier message: 18/10/2005, 17h03

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