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 :

[Struts 1.3.5] BeanUtils.populate


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut [Struts 1.3.5] BeanUtils.populate
    Bonsoir,

    Ça faisait longtemps que je n'avais pas vu cette erreur :
    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
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:453)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.NullPointerException
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:427)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:340)
    	org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:684)
    	org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:884)
    	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:451)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Je me rappelle qu'il s'agit d'un bean supposé être en scope session, mais je ne me souviens plus comment faire.

    Alors, pour mon cas, il s'agit d'un bean déjà initialisé en base de données qui sera modifié.

    Le bean est le suivant :
    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
     
    public class JourneeForm extends ActionForm {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private RencontreForm[] liste;
     
    	public void setListe(RencontreForm[] liste) {
    		this.liste = liste;
    	}
    	public RencontreForm[] getListe() {
    		return liste;
    	}
    }
    Stockage du bean avant appel du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		request.getSession().setAttribute(Constantes.AttribJourneeModifiee, j);
    		request.setAttribute(Constantes.AttribNumeroJournee, f.getAction());
    		return mapping.findForward("JOURNEE_MODIFIEE");
    Formulaire :
    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
     
    <%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="h" %>
    <%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="b" %>
    <%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="l" %>
    <%@ taglib uri="/WEB-INF/tld/struts-nested.tld" prefix="n" %>
    <b:define id="JOURNEE_MODIFIEE" name="JOURNEE_MODIFIEE" type="presentation.bean.JourneeForm" scope="session"/>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <h:html>
    <head>
    	<title><b:message key="application.nom"/></title>
    	<link type="text/css" rel="stylesheet" href="<b:message key="application.path"/>/css/style.css">
    </head>
    <body>
    	<h1>Modifier une journée</h1>
    	<h:form action="/validJournee.do">
    	<table class="match">
    		<tr>
    			<th colspan="4" class="centre">Journée <b:write name="NUMERO_JOURNEE"/></th>
    		<tr>
    		<n:iterate name="JOURNEE_MODIFIEE" property="liste">
    		<tr>
    			<td class="droite"><n:write property="labelEquipeR"/></td>
    			<td class="centre"><n:text property="scoreR" maxlength="2" styleClass="score"/></td>
    			<td class="centre"><n:text property="scoreV" maxlength="2" styleClass="score"/></td>
    			<td class="gauche"><n:write  property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>
    		<tr>
    			<td colspan="4" class="centre"><h:submit styleClass="vert" value="Valider"/></td>
    		</tr>
    	</table>
    	</h:form>
    </body>
    </h:html>
    Quand j'appuie sur le bouton submit, l'exception se produit...

    Merci à toute personne qui pourrait m'aider.

  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
    Tout d'abord, pour que la mise à jour fonctionne correctement avec les tags nested, il faut remplacer le tableau d'objets par une collection, une ArrayList par exemple.

    Ensuite, pour pouvoir mettre à jour les éléments de la collection via le formulaire, il faut initialiser la propriété liste de l'ActionForm via le setter.
    Il faut donc remplacer ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().setAttribute(Constantes.AttribJourneeModifiee, j);
    par celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    JourneeForm journeeForm=(JourneeForm) form ;
    journeeForm.setListe(j) ;
    Ceci suppose que le form-bean est référencé dans le mapping de l'Action dans laquelle tu mets ce code d'initialisation du formulaire.
    Et il faut mettre le scope du form-bean à session dans le mapping de cette Action et dans celui de l'Action qui s'exécute au submit du formulaire.

    Et enfin, il faut modifier le nested:iterate comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    		<n:iterate property="liste">
    		<tr>
    			<td class="droite"><n:write property="labelEquipeR"/></td>
    			<td class="centre"><n:text property="scoreR" maxlength="2" styleClass="score"/></td>
    			<td class="centre"><n:text property="scoreV" maxlength="2" styleClass="score"/></td>
    			<td class="gauche"><n:write  property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Bonjour ma chère c_nvy,

    Merci pour ta réponse.

    J'ai donc transformé le tableau en ArrayList<RencontreForm>, je n'ai plus d'exception, cependant, le formulaire attendu est vide. Comme quoi il y a déjà un très net progrès.

    Cela dit, je pense que je vais apporter de grosses modifications à ce projet car au niveau de Struts, il n'y a que des tableaux. De plus, je crois savoir pourquoi le tableau à afficher est vide : en outre, l'action est appelée avec un autre bean (SimpleForm, labellisé "simpleBean" dans struts-config.xml) et non JourneeForm (labellisé "journeeBean").

    L'instanciation et l'initialisation de JourneeForm ne changent rien au problème.

    Contenu partiel de struts-config.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        <form-beans>
    		<form-bean name="simpleBean" type="presentation.bean.SimpleForm"/>
    		<form-bean name="journeeBean" type="presentation.bean.JourneeForm"/>
        </form-beans>
     
     
        <action-mappings>
    		<action path="/modifJournee" name="simpleBean" type="presentation.accueil.ModifJournee" scope="session"/>
    		<action path="/validJournee" name="journeeBean" type="presentation.accueil.ValidJournee" scope="session"/>
        </action-mappings>
    SimpleForm ne contient qu'un simple entier (int), restituant le numéro de la structure JourneeForm.

    Dans l'action execute(...) de la classe ModifJournee, j'initialise JourneeForm, la JSP reste vide.

    J'ai l'impression que l'utilisation de ces deux beans provoque un conflit. J'ai donc créé une autre classe intermédiaire, ça ne change rien.

    Je vais essayer autre chose, mais si entre-temps quelqu'un avait une suggestion, je suis preneur ;-).

  4. #4
    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
    Salut DomIII

    Alors, dans l'Action ModifJournee, tu peux créer une instance de l'ActionForm JourneeForm, initialiser la propriété liste, et mettre cette instance dans le scope session sous le même nom que celui définit dans le struts-config.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    JourneeForm journeeBean= new JourneeForm();
    journeeBean.setListe(j) ;
    session.setAttribute("journeeBean",journeeBean);

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Merci !

    Je suis en train de modifier tous les tableaux en ArrayList, j'ai un peu cassé le projet Du coup je ne peux pas atteindre pour le moment cette portion de code.

    Ce projet, depuis deux semaines, m'aura bien épuisé !

    Je reviens dès que possible.

  6. #6
    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
    En fait, ça peut fonctionner avec des tableaux mais l'inconvénient des tableaux c'est que tu dois fixer leur taille, ce qui est contraignant.
    De plus, les tags Struts sont plus adaptés à des collections qu'à des tableaux.

    Sinon, si tu remplaces tous les tableaux en ArrayList, je te conseille d'y faire référence en utilisant l'interface List comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<RencontreForm> liste = new ArrayList<RencontreForm>();
    Pour plus d'informations, voir le chapitre Comment bien utiliser les collections de la FAQ Java.

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Pffff... si j'arrive à faire fonctionner ce fichu projet, je pense que j'aurai accompli LA mission de ma vie

    Il est vrai que j'ai omis de dire de quoi il s'agit. Une fédération sportive régionale a demandé de moderniser une application de près de 10 ans d'âge, visiblement faite à la va vite.

    Plusieurs championnats sont gérés, mais au cours d'une journée, les utilisateurs sont obligés de saisir les résultats match par match. L'idée est donc de pouvoir saisir tous les matches sur une seule page.

    Au début de chaque saison, un algorithme de calcul génère un championnat. Chaque journée est représentée (donc mappée) par un bean en base, Journee et JourneeForm au niveau Struts. La principale propriété est une liste (donc un tableau jusqu'ici) du bean Rencontre (RencontreForm en Struts).

    Donc, j'ai créé un service qui remonte tous les matches d'un championnat identifié. Le besoin du client est d'avoir un écran contenant toutes les journées classées sous forme de tables, puis un bouton sur chaque de ces tables qui affiche tous les matches de la journée sélectionnée.

    La difficulté du projet est la gestion de listes de journées, puis des listes de matches : d'une saison à une autre, le nombre d'équipes par championnat peut évoluer.

    J'ai alors créé un nouveau bean pour Struts qui n'a aucune représentation en base : CalendrierForm

    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 class CalendrierForm extends ActionForm {
     
    	private static final long serialVersionUID = 1L;
    	private List<JourneeForm> liste = new ArrayList<JourneeForm>();
     
    	public List<JourneeForm> getListe() {
    		return liste;
    	}
    	public void setListe(List<JourneeForm> liste) {
    		this.liste = liste;
    	}
     
    // A l'instanciation, pour créer le nombre de journées
    	public void creerItems(int index) {
    		for (int i = 0; i < index; i ++) {
    			liste.add(new JourneeForm());
    		}
    	}
     
    }
    Ensuite, le bean JourneeForm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class JourneeForm extends ActionForm {
     
    	private static final long serialVersionUID = 1L;
    	ArrayList<RencontreForm> liste = new ArrayList<RencontreForm>();
     
    	public ArrayList<RencontreForm> getListe() {
    		return liste;
    	}
    	public void setListe(ArrayList<RencontreForm> liste) {
    		this.liste = liste;
    	}
     
    }
    J'instancie un CalendrierForm et le remplit. J'appelle la JSP suivante afin d'afficher tous les matches. A chaque table, j'essaie de mettre un formulaire (avec bean JourneeForm)

    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
     
    <%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="h" %>
    <%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="b" %>
    <%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="l" %>
    <%@ taglib uri="/WEB-INF/tld/struts-nested.tld" prefix="n" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <h:html>
    <head>
    	<title><b:message key="application.nom"/></title>
    	<link type="text/css" rel="stylesheet" href="<b:message key="application.path"/>/css/style.css">
    	<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
    	<h1>Liste des journées</h1>
    	<n:iterate  property="liste" name="calendrierBean">
    	<table class="match">
    		<h:form action="/modifJournee.do">
    		<tr>
    			<th colspan="4" class="centre">Journée <%--b:write name="IDX"/--%></th>
    		<tr>
    		<n:iterate property="liste">
    		<tr>
    			<td class="droite"><n:text readonly="true" property="labelEquipeR"/></td>
    			<td class="centre"><n:text readonly="true" property="scoreR"/></td>
    			<td class="centre"><n:text readonly="true" property="scoreV"/></td>
    			<td class="gauche"><n:text readonly="true" property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>
    		<tr>
    			<td colspan="4" class="centre">
    				<n:submit styleClass="vert" value="Modifier"/>
    			</td>
    		</tr>
    		</h:form>
    	</table>
    	<br>
    	</n:iterate>
    </body>
    </h:html>
    Quand j'appuie sur un des boutons submit, j'ai droit à une jolie 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
    50
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:453)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    	java.util.ArrayList.RangeCheck(Unknown Source)
    	java.util.ArrayList.get(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:433)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:340)
    	org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:664)
    	org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:884)
    	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:451)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Donc, je dois ajouter des méthodes get et set, mais où ?...

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Ça progresse , ça progresse

    En témoigne le code HTML généré :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    	<table class="match">
    		<form name="journeeBean" method="post" action="/Champ5/modifJournee.do">
    		<tr>
    			<th colspan="4" class="centre">Journée 0</th>
    		<tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[0].labelEquipeR" value="BREUILLET" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[0].scoreR" value="3" readonly="readonly"></td>
     
    			<td class="centre"><input type="text" name="liste[0].liste[0].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[0].labelEquipeV" value="VERRIÔRE-LE-BUISSON" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[1].labelEquipeR" value="BR?TIGNY-SUR-ORGE" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[1].scoreR" value="3" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[1].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[1].labelEquipeV" value="MORSANG-SUR-ORGE" readonly="readonly"></td>
    		</tr>
     
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[2].labelEquipeR" value="COURCOURONNES" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[2].scoreR" value="3" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[2].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[2].labelEquipeV" value="MONTGERON" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[3].labelEquipeR" value="DOURDAN" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[3].scoreR" value="3" readonly="readonly"></td>
     
    			<td class="centre"><input type="text" name="liste[0].liste[3].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[3].labelEquipeV" value="LISSES" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[4].labelEquipeR" value="EGLY" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[4].scoreR" value="3" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[4].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[4].labelEquipeV" value="ITTEVILLE" readonly="readonly"></td>
    		</tr>
     
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[5].labelEquipeR" value="FLEURY-M?ROGIS" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[5].scoreR" value="3" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[5].scoreV" value="3" readonly="readonly"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[5].labelEquipeV" value="IGNY-VAUHALLAN" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td colspan="4" class="centre">
    				<input type="submit" name="liste[0]" value="Modifier" class="vert">
     
    			</td>
    		</tr>
    		</form>
    	</table>
    Bonjour les imbrications, je crois voir où les getters et setters s'avèrent nécessaires.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Par pitié, aidez-moi Je sens que je vais craquer. Une semaine pour afficher un bête formulaire et récupérer les données saisies, rien à faire. Le formulaire reste vide, malgré le scope à session, j'ai essayé toutes les librairies tag... Et toujours pas d'explication.

    Je perds patience, je dois être nul à Struts...

    Mais ***où*** est l'erreur ?!

    struts-config.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        <action-mappings>
    		<action path="/accueil" name="calendrierBean" type="presentation.accueil.Accueil"/>
    		<action path="/modifJournee" name="journeeBean" type="presentation.accueil.ModifJournee" scope="session"/>
        </action-mappings>
    La JSP qui affiche bien les champs mais dont les formulaires ressortent vides, malgré le scope en session (que je prenne les nested ou autres), ça ne change rien :
    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
     
    <%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="h" %>
    <%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="b" %>
    <%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="l" %>
    <%@ taglib uri="/WEB-INF/tld/struts-nested.tld" prefix="n" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <h:html>
    <head>
    	<title><b:message key="application.nom"/></title>
    	<link type="text/css" rel="stylesheet" href="<b:message key="application.path"/>/css/style.css">
    	<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
    </head>
    <body>
    	<h1>Liste des journées</h1>
     
    	<n:iterate property="liste" name="calendrierBean" indexId="IDX">
    	<table class="match">
    		<h:form action="/modifJournee.do">
    		<tr>
    			<th colspan="4" class="centre">Journée <n:write name="IDX"/></th>
    		<tr>
    		<n:iterate property="liste">
    		<tr>
    			<td class="droite"><n:text readonly="true" property="labelEquipeR"/></td>
    			<td class="centre"><n:text readonly="true" property="scoreR" styleClass="score"/></td>
    			<td class="centre"><n:text readonly="true" property="scoreV" styleClass="score"/></td>
    			<td class="gauche"><n:text readonly="true" property="labelEquipeV"/></td>
    		</tr>
    		</n:iterate>
    		<tr>
    			<td colspan="4" class="centre">
    				<h:submit styleClass="vert" value="Modifier"/>
    			</td>
    		</tr>
    		</h:form>
    	</table>
    	<br>
    	</n:iterate>
    </body>
    </h:html>
    Une partie du code HTML généré :
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
    	<table class="match">
    		<form name="journeeBean" method="post" action="/Champ5/modifJournee.do">
    		<tr>
    			<th colspan="4" class="centre">Journée 0</th>
    		<tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[0].labelEquipeR" value="BREUILLET" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[0].scoreR" value="3" readonly="readonly" class="score"></td>
     
    			<td class="centre"><input type="text" name="liste[0].liste[0].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[0].labelEquipeV" value="VERRIÔRE-LE-BUISSON" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[1].labelEquipeR" value="BR?TIGNY-SUR-ORGE" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[1].scoreR" value="3" readonly="readonly" class="score"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[1].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[1].labelEquipeV" value="MORSANG-SUR-ORGE" readonly="readonly"></td>
    		</tr>
     
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[2].labelEquipeR" value="COURCOURONNES" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[2].scoreR" value="3" readonly="readonly" class="score"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[2].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[2].labelEquipeV" value="MONTGERON" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[3].labelEquipeR" value="DOURDAN" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[3].scoreR" value="3" readonly="readonly" class="score"></td>
     
    			<td class="centre"><input type="text" name="liste[0].liste[3].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[3].labelEquipeV" value="LISSES" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[4].labelEquipeR" value="EGLY" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[4].scoreR" value="3" readonly="readonly" class="score"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[4].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[4].labelEquipeV" value="ITTEVILLE" readonly="readonly"></td>
    		</tr>
     
     
    		<tr>
    			<td class="droite"><input type="text" name="liste[0].liste[5].labelEquipeR" value="FLEURY-M?ROGIS" readonly="readonly"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[5].scoreR" value="3" readonly="readonly" class="score"></td>
    			<td class="centre"><input type="text" name="liste[0].liste[5].scoreV" value="3" readonly="readonly" class="score"></td>
    			<td class="gauche"><input type="text" name="liste[0].liste[5].labelEquipeV" value="IGNY-VAUHALLAN" readonly="readonly"></td>
    		</tr>
     
    		<tr>
    			<td colspan="4" class="centre">
    				<input type="submit" value="Modifier" class="vert">
     
    			</td>
    		</tr>
    		</form>
    	</table>

    Les beans :
    CalendrierForm
    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
     
    public class CalendrierForm extends ActionForm {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private List<JourneeForm> liste = new ArrayList<JourneeForm>();
     
    	public List<JourneeForm> getListe() {
    		return liste;
    	}
    	public void setListe(List<JourneeForm> liste) {
    		this.liste = liste;
    	}
    	public ArrayList<RencontreForm> getListe(int index) {
    		if (liste == null || liste.size() < index)
    			return null;
    		return liste.get(index).getListe();
    	}
    	public void creerItems(int index) {
    		for (int i = 0; i < index; i ++) {
    			liste.add(new JourneeForm());
    		}
    	}
    }
    JourneeForm
    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 class JourneeForm extends ActionForm {
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	ArrayList<RencontreForm> liste = new ArrayList<RencontreForm>();
     
    	public ArrayList<RencontreForm> getListe() {
    		return liste;
    	}
    	public void setListe(ArrayList<RencontreForm> liste) {
    		this.liste = liste;
    	}
    }
    RencontreForm
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    public class RencontreForm extends ActionForm {
     
    	/**
             * 
             */
    	private static final long serialVersionUID = 1L;
    	private String labelEquipeR;
    	private String labelEquipeV;
    	private int scoreR;
    	private int scoreV;
    	private Date date_match;
    	private int journee;
    	private PersonneForm arbitre;
     
    	public String getLabelEquipeR() {
    		return labelEquipeR;
    	}
    	public void setLabelEquipeR(String labelEquipeR) {
    		this.labelEquipeR = labelEquipeR;
    	}
    	public String getLabelEquipeV() {
    		return labelEquipeV;
    	}
    	public void setLabelEquipeV(String labelEquipeV) {
    		this.labelEquipeV = labelEquipeV;
    	}
    	public int getScoreR() {
    		return scoreR;
    	}
    	public void setScoreR(int scoreR) {
    		this.scoreR = scoreR;
    	}
    	public int getScoreV() {
    		return scoreV;
    	}
    	public void setScoreV(int scoreV) {
    		this.scoreV = scoreV;
    	}
    	public Date getDate_match() {
    		return date_match;
    	}
    	public void setDate_match(Date date_match) {
    		this.date_match = date_match;
    	}
    	public int getJournee() {
    		return journee;
    	}
    	public void setJournee(int journee) {
    		this.journee = journee;
    	}
    	public PersonneForm getArbitre() {
    		return arbitre;
    	}
    	public void setArbitre(PersonneForm arbitre) {
    		this.arbitre = arbitre;
    	}
     
    	public String toString() {
    		return labelEquipeR  + " " + scoreR + "/" + scoreV + " " + labelEquipeV;
    	}
    }
    Là, j'ai vraiment besoin d'aide, je suis dessus depuis une semaine, j'y ai passé tout mon weekend...

    Merci par avance

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Maintenant, une exception se produit...

    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
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:453)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    	java.util.ArrayList.RangeCheck(Unknown Source)
    	java.util.ArrayList.get(Unknown Source)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:433)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:340)
    	org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:664)
    	org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:715)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:884)
    	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:451)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:45)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:57)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:48)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:280)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Merci de votre aide, je ne sais plus quoi faire sinon jeter mon ordi par la fenêtre

  11. #11
    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
    Alors, premièrement, il ne faut pas confondre form-bean et javabean.
    D'après le code posté, seul CalendrierForm doit hériter d'ActionForm.
    JourneeForm et RencontreForm, qu'il vaudrait mieux renommer par exemple Journee et Rencontre, ne devraient pas hériter d'ActionForm mais seulement implémenter l'interface Serializable.

    Deuxièmement, pour t'y retrouver, je te conseille de renommer tes listes en journeesListe et rencontresListe par exemple.

    Ensuite, dans ton premier post, il n'était pas question de listes imbriquées.
    Il faut savoir que Struts ne gère pas bien la mise à jour de listes imbriquées.
    Dans ce cas, il faut utiliser les index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <h:form action="/modifJournee.do">
      <n:iterate property="journeesListe" indexId="indexj">
         <n:iterate property="rencontresListe" indexId="indexr">
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].labelEquipeR"/>
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].scoreR" />
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].scoreV" />
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].labelEquipeV"/>
        </n:iterate>
      </n:iterate>
    </h:form>
    et dans ce cas, il n'est pas utile de coder getter et setter indexés.

  12. #12
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Alors, premièrement, il ne faut pas confondre form-bean et javabean.
    D'après le code posté, seul CalendrierForm doit hériter d'ActionForm.
    JourneeForm et RencontreForm, qu'il vaudrait mieux renommer par exemple Journee et Rencontre, ne devraient pas hériter d'ActionForm mais seulement implémenter l'interface Serializable.
    mais bien sûr !! Le pire est que je le savais, mais tellement fatigué de ce projet, j'en ai perdu toute lucidité

    Citation Envoyé par c_nvy Voir le message
    Deuxièmement, pour t'y retrouver, je te conseille de renommer tes listes en journeesListe et rencontresListe par exemple.
    Tout à fait : cette fichue manie que j'ai de reprendre systématiquement les mêmes noms...

    Citation Envoyé par c_nvy Voir le message
    Ensuite, dans ton premier post, il n'était pas question de listes imbriquées.
    Il faut savoir que Struts ne gère pas bien la mise à jour de listes imbriquées.
    Dans ce cas, il faut utiliser les index :
    Au début, le code n'était composé que de tableaux qui s'imbriquaient les uns dans les autres. J'ai tout modifié ce weekend en List, ce qui a simplifié le code.

    Citation Envoyé par c_nvy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <h:form action="/modifJournee.do">
      <n:iterate property="journeesListe" indexId="indexj">
         <n:iterate property="rencontresListe" indexId="indexr">
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].labelEquipeR"/>
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].scoreR" />
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].scoreV" />
            <n:text name="calendrierBean" property="journeesListe[${indexj}].rencontresListe[${indexr}].labelEquipeV"/>
        </n:iterate>
      </n:iterate>
    </h:form>
    et dans ce cas, il n'est pas utile de coder getter et setter indexés.
    Allez, c'est parti !

    Je n'ai pas travaillé dessus aujourd'hui, le temps de me reposer, je m'y remets dès ce soir.

    Merci en tout cas pour ton aide.

    Je reviens dès que possible.

  13. #13
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Bon, j'ai fait un tout petit projet, afin de mettre en pratique ce que tu m'as dit, mais le problème ne se résout pas... Je dois avoir des problèmes de compréhension, ma foi !

    J'ai mis ce mini-projet sous forme de ZIP à l'adresse suivante : http://athe.pagesperso-orange.fr/EssaiA.zip

    J'ai créé un bean Personne qui implémente Serializable, et un form-bean PageFormulaire contenant un List<Personne>.

    Dans l'action Accueil, j'instancie un PageFormulaire et le mets en request. La JSP le récupère et l'affiche correctement. Cependant, dès que je clique sur submit, encore une 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
     
    exception
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    javax.servlet.ServletException: BeanUtils.populate
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:475)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
     
    cause mère
     
    java.lang.NullPointerException
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:505)
    	org.apache.commons.beanutils.PropertyUtilsBean.getIndexedProperty(PropertyUtilsBean.java:408)
    	org.apache.commons.beanutils.PropertyUtilsBean.getNestedProperty(PropertyUtilsBean.java:760)
    	org.apache.commons.beanutils.PropertyUtilsBean.getProperty(PropertyUtilsBean.java:837)
    	org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:903)
    	org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:830)
    	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:433)
    	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:473)
    	org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
    	org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
    	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
    	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
    	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
    	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    Je remarque une chose dans le code HTML, mais je pense que cela ne change rien, à savoir un attribut name vide pour le submit.



    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
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    <html>
    <head>
    </head>
    <body>
    	<table>
    	<form name="pageForm" method="post" action="/EssaiA/traitement.do">
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[0].nom" value="1"></td>
     
    			<td>Prénom</td>
    			<td><input type="text" name="liste[0].prenom" value="0"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[1].nom" value="9"></td>
    			<td>Prénom</td>
     
    			<td><input type="text" name="liste[1].prenom" value="2"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[2].nom" value="17"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[2].prenom" value="4"></td>
    		</tr>
     
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[3].nom" value="25"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[3].prenom" value="6"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
     
    			<td><input type="text" name="liste[4].nom" value="33"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[4].prenom" value="8"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[5].nom" value="41"></td>
    			<td>Prénom</td>
     
    			<td><input type="text" name="liste[5].prenom" value="10"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[6].nom" value="49"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[6].prenom" value="12"></td>
    		</tr>
     
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[7].nom" value="57"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[7].prenom" value="14"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
     
    			<td><input type="text" name="liste[8].nom" value="65"></td>
    			<td>Prénom</td>
    			<td><input type="text" name="liste[8].prenom" value="16"></td>
    		</tr>
     
    		<tr>
    			<td>Nom</td>
    			<td><input type="text" name="liste[9].nom" value="73"></td>
    			<td>Prénom</td>
     
    			<td><input type="text" name="liste[9].prenom" value="18"></td>
    		</tr>
     
    		<tr>
    			<td colspan="4"><input type="submit" name="" value="Enregistrer"></td>
    		</tr>
    	</table>
    	</form>
    </body>
    </html>
    Qu'ai-je oublié de faire ?...

    Piste (?) : si j'omets de mettre request.setAttribute dans l'action, le formulaire est cette-fois vide. Je ne peux pas faire autrement que de préciser le form-bean...

    Merci par avance.

  14. #14
    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
    Comme tu as mis le form-bean pageForm dans le scope request, lorsque la page saisie.jsp s'affiche, la requête est terminée, et lorsque tu presses le bouton submit après mise à jour du formulaire, une nouvelle requête est soumise et donc une nouvelle instance de PageFormulaire est créée.
    L'ArrayList liste que tu as initialisé dans l'Action précédente n'existe donc plus et comme elle n'est pas initialisée dans l'ActionForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	private ArrayList<Personne> liste;
    cela provoque un NullPointerException.

    Donc, premièrement, dans l'Action Accueil, il faut mettre le form-bean pageForm dans le scope session :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getSession().setAttribute("pageForm", p);
    Ensuite, dans l'ActionForm PageFormulaire, il faut définir l'ArrayList liste comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private ArrayList<Personne> liste=new ArrayList<Personne>;
    ou mieux, si tu suis mes conseils :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private List<Personne> liste=new ArrayList<Personne>;
    ce qui implique de modifier getter et setter de l'ActionForm et l'Action Accueil en conséquence.

  15. #15
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Ma chère c_nvy,

    Comment te remercier car encore une fois, tu me sauves !!!

    J'ai corrigé, ça marche parfaitement, j'ai appliqué à mon projet Championnat, et ça maaaaaaaaaaaaaaaaaaaaaaaaaaaaarche !!!

    Enfin, je vois le bout de mes peines et celui du projet.

    Merci, merci, merci des milliers de fois !

    Morale de l'histoire : on apprend toujours.

  16. #16
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Avec le recul, j'ai donc appris quelque chose depuis ce weekend, sur les formulaires dynamiques.

    Depuis des mois, je fais la même erreur, à savoir de faire hériter tous mes beans de ActionForm. Pire encore, j'oublie parfois d'initialiser des structures (List, ArrayList, ...).

    Ceci m'a bien servi de leçon, je me remets au travail dès demain pour détruire la couche Struts du projet et la refaire entièrement.

    Encore merci !!!

  17. #17
    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
    De rien. Bon courage pour la suite.

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    De rien. Bon courage pour la suite.
    Projet livré hier, tout est OK ! Le client est plutôt content, l'application est plus rapide et plus simple.

    Encore merci !

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

Discussions similaires

  1. [struts] BeanUtils.populate
    Par otminou dans le forum Struts 1
    Réponses: 4
    Dernier message: 23/09/2007, 18h27
  2. Réponses: 7
    Dernier message: 19/07/2006, 14h43
  3. [struts BeanUtils.populate error] Passage deString a Date
    Par agougeon dans le forum Struts 1
    Réponses: 11
    Dernier message: 29/05/2006, 12h22
  4. [ struts ] "BeanUtils.populate"
    Par stela86 dans le forum Struts 1
    Réponses: 4
    Dernier message: 20/05/2006, 12h27
  5. [Struts][Tomcat ] HTTP 500 - BeanUtils.populate (Eclipse)
    Par pjfly dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 10/04/2004, 10h03

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