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 :

Probleme de formulaire avec Iterate


Sujet :

Struts 1 Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Probleme de formulaire avec Iterate
    Bonjour à tous,

    Je travail actuellement à la réalisation d'un projet dans lequel certains paramètres sont saisies suivant les mois. Comme l'affichage ne se fait que sur 24 mois, l'application n'enregistre pas les mois suivants. La collection utiliser pour mon iterate est donc une collection composer via une fonction Java afin de créer les mois qui ne sont pas contenu dans la base de données mais qui doivent être affichés.

    L'affichage fonctionne correctement, mais la collection reçu du formulaire ne contient aucune donnée (null);
    J'ai tenté plusieurs solutions mais aucune ne parvient à résoudre le problème.

    Code JSP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <logic:iterate scope="request" name="listeMois" collection="<%=MoisAction.recupMois() %>" id="m" indexId="i">
    							 <%if(i%2!=0){%><tr class="ligne_impaire"> 
    								<%} else {%>
    									<tr class="ligne_paire">
    								<%}
    							 String idS= "id"+i;%>
    								<html:hidden name="m" property="id" />
    							  <td><bean:write property="mois" name="m"/>/<bean:write property="annee" name="m"/></td>
    							  <td><html:text name="m" property="nbJoursOuvres" /></td>
    							  <td><html:text name="m" property="tauxOccupation" />%</td>
    							  </tr>
    						</logic:iterate>
    Code Struts-XML
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <action path="/pages/forecast/domodifymois" type="casting.action.MoisAction" name="MoisForm" 
    		  scope="request" validate="true"  input="/pages/forecast/gestiondate.jsp" parameter="listeMois">
    			<forward name="failure" path="/pages/forecast/gestiondate.jsp" redirect="true"/>
    			<forward name="success" path="/pages/forecast/gestiondate.jsp" redirect="true" />
    		</action>
    Code ActionForm
    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 MoisForm extends DynaActionForm {
     
    	private Vector<Mois> listeMois;
     
    	public MoisForm() {}
     
    	public Vector getListeMois() {
    		return listeMois;
    	}
     
    	public void setListeMois(Vector listeMois) {
    		this.listeMois = listeMois;
    	}
     
    	public Mois getMois(int i) {
    		return (Mois)listeMois.get(i);
    	}	
     
    	public ActionErrors validate(ActionMapping mapping,
    			HttpServletRequest request) {
    		ActionErrors errors = new ActionErrors();
    		System.out.println("Gestion Mois : \n" + getListeMois() );
    		return errors;
    	}
     
    }
    Code Action
    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
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
     
     
    		MoisForm moisForm = (MoisForm) form;
    		MoisManager moisMgr = new MoisManager();
    		if (moisForm.getListeMois() == null) {
    			ActionMessages messages = new ActionMessages();
    			messages.add("mois", new ActionMessage("error.mois.null"));
    			this.saveMessages(request, messages);
    			return mapping.findForward("failure");
    		}else{
    			// Create object of ActionMesssages
    			ActionMessages errors = new ActionMessages();
    			for (Iterator iterator = moisForm.getListeMois().iterator(); iterator.hasNext();) {
    				Mois mois = (Mois) iterator.next(); 
    				if(mois.getId() == null){
    					moisMgr.saveMois(mois.getMois(), mois.getAnnee(), mois.getNbJoursOuvres(), mois.getTauxOccupation());
    				} else {
    					moisMgr.updateMois(mois.getId(), mois.getMois(), mois.getAnnee(), mois.getNbJoursOuvres(), mois.getTauxOccupation());
    				}
     
    			}
    			return mapping.findForward("success");
    		}
    	}

    Merci d'avance si vous avez une piste pour m'aider.

    Bonne journée.

  2. #2
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Si tu veux modifier les éléments de la liste listeMois, il faut itérer sur la liste listeMois de l'ActionForm et ajouter l'attribut indexed="true" dans les tags html:text :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <logic:iterate name="MoisForm" property="listeMois" id="mois" indexId="i">
    	 <%if(i%2!=0){%><tr class="ligne_impaire"> 
    	<%} else {%>
    	<tr class="ligne_paire">
    	<%}
    	 String idS= "id"+i;%>
    	<html:hidden name="mois" property="id" />
    	  <td><bean:write property="mois" name="mois"/>/<bean:write property="annee" name="m"/></td>
    	  <td><html:text name="mois" property="nbJoursOuvres" indexed="true"/></td>
    	  <td><html:text name="mois" property="tauxOccupation" indexed="true"/>%</td>
     </tr>
    </logic:iterate>
    Pour que cela fonctionne, il faut bien sûr avoir initialisé la liste listeMois du form-bean MoisForm dans l'Action qui s'exécute avant l'affichage du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MoisForm moisForm=(MoisForm) form ;
    moisForm.setListeMois(MoisAction.recupMois());
    et il faut mettre scope="session" dans le mapping de toutes les Actions liées au form-bean MoisForm (aussi bien dans celle qui initialise le formulaire que dans celle qui s'exécute au submit du formulaire).

    Pour info, si tu es en J2EE 1.4 (Servlet 2.4/JSP 2.0), tu peux utiliser une EL à la place d'une scriptlet pour gérer le style des lignes paires et impaires comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <tr class="${((i % 2) == 0)? 'ligne_paire' : 'ligne_impaire' }" >

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé, et ça ne fonctionne pas.
    J'ai modifié le code de différente façon (en mettant la liste en request.setAttribute(), etc. ) mais rien n'y fait. Je me retrouve avec le message 'No collection found' .

  4. #4
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Il ne faut pas mettre la liste dans le scope request.

    Pour pouvoir récupérer les modifications effectuées sur les éléments de la liste, il faut que cette liste soit une propriété du formulaire. Et ce formulaire doit être dans le scope session.

    Peux-tu montrer le code de l'Action qui s'exécute avant l'affichage du formulaire et le code de la jsp ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci pour le temps que vous me consacrer.

    J'ai modifié le code :

    Struts-config :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <action path="/pages/forecast/dolistemois" type="casting.action.ListeMoisAction" scope="session" >
    			<forward name="failure" path="/pages/forecast/gestion.jsp" redirect="true"/>
    			<forward name="success" path="/pages/forecast/gestiondate.jsp" redirect="true" />
    		</action>
     
    		<action path="/pages/forecast/domodifymois" type="casting.action.MoisAction" name="MoisForm" 
    		  scope="session" validate="true"  input="/pages/forecast/gestiondate.jsp" parameter="listeMois">
    			<forward name="failure" path="/page/forecast/dolistemois" redirect="true"/>
    			<forward name="success" path="/page/forecast/dolistemois" redirect="true" />
    		</action>

    Action avant affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {		
    		HttpSession session = request.getSession();
    		MoisForm moisForm=new MoisForm();
    		moisForm.setListeMois(ListeMoisAction.recupMois());
    		if(moisForm.getListeMois()==null){
    			return mapping.findForward("failure");
    		}		
    		session.setAttribute("listeMois", moisForm.getListeMois());
    		return mapping.findForward("success");
    	}

    JSP
    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
    <%@ page language="java" %>
    <%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
    <%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>
    <%@ taglib prefix="logic" uri="http://struts.apache.org/tags-logic" %>
    <%@ taglib prefix="nested" uri="http://struts.apache.org/tags-nested" %>
    <%@ page import="java.util.*,java.io.FileInputStream,org.w3c.dom.Document,casting.*" %>
    <% session.setAttribute("section", UtilisateurManager.accessGroupForecast); %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
     
    <html:html>
    	<head>
    		<title>Gestion Clôture</title>
    		<%@ include file="/pages/template/headtemplate.jsp" %>
     
    	</head> 
    	<body onload="r()">  
     
    	<%@ include file="/pages/template/top.jsp" %> 
    	<!-- Le corps --> 
    		<div id="corps">
    			<div class="box">
    				<div class="onglet_red">Gestion des Mois</div>
    				<div class="tabDate">
    					<html:form action="/pages/forecast/domodifymois" focus="listeMois">
    						<table class="projet" border="0" cellspacing="0" >
    							<tr>
    								<th>Mois</th>
    								<th>Nb jours ouvrés</th>
    								<th>Taux d'activité</th>
    							</tr>		
    							<logic:iterate scope="session" name="MoisForm" property="listeMois" id="mois" indexId="i">
    								  <tr class="${((i % 2) == 0)? 'ligne_paire' : 'ligne_impaire' }" >
    								  <html:hidden name="mois" property="id" />
    								  <td><bean:write property="mois" name="mois"/>/<bean:write property="annee" name="mois"/></td>
    								  <td><html:text name="mois" property="nbJoursOuvres" indexed="true"/></td>
    								  <td><html:text name="mois" property="tauxOccupation" indexed="true"/>%</td>
    							 </tr>
    							</logic:iterate>
     
    						</table>					
    						<br />
    						<html:button property="value" value="Retour" onclick="window.location.href='gestion.jsp'" /> 
    						<html:submit value="Enregistrer" />
    					</html:form>
    				</div>
    			</div>
     
    		</div>
     
     
    	<%@ include file="/pages/template/bottom.jsp" %>
    	</body>
    </html:html>
    Form
    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
    package casting.form;
     
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Vector;
     
    import org.apache.log4j.Logger;
    import org.apache.struts.action.*;
    import org.xml.sax.SAXException;
     
    import casting.manager.*;
    import casting.action.MoisAction;
    import casting.bean.*;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.xpath.XPathExpressionException;
     
    public class MoisForm extends ActionForm {
     
    	private Vector<Mois> listeMois;
     
    	public MoisForm() {}
     
    	public Vector getListeMois() {
    		return listeMois;
    	}
     
    	public void setListeMois(Vector listeMois) {
    		this.listeMois = listeMois;
    	}
     
     
    	public ActionErrors validate(ActionMapping mapping,
    			HttpServletRequest request) {
    		ActionErrors errors = new ActionErrors();
    		System.out.println("Gestion Mois : \n" + getListeMois() );
    		return errors;
    	}
     
    }
    Action (traitement du 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package casting.action;
     
    import org.apache.struts.action.*;
     
    import casting.bean.*;
    import casting.form.*;
    import casting.manager.*;
    import java.util.*;
    import javax.servlet.http.*;
     
     
    public final class MoisAction extends Action {
     
    	public MoisAction() {
    	}
     
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {
     
    		MoisForm moisForm = (MoisForm) form;
     
    		MoisManager moisMgr = new MoisManager();
    		if (moisForm.getListeMois() == null) {
    			ActionMessages messages = new ActionMessages();
    			messages.add("mois", new ActionMessage("error.mois.null"));
    			this.saveMessages(request, messages);
    			return mapping.findForward("failure");
    		}else{
    			// Create object of ActionMesssages
    			ActionMessages errors = new ActionMessages();
    			for (Iterator iterator = moisForm.getListeMois().iterator(); iterator.hasNext();) {
    				Mois mois = (Mois) iterator.next(); 
    				if(mois.getId() == null){
    					moisMgr.saveMois(mois.getMois(), mois.getAnnee(), mois.getNbJoursOuvres(), mois.getTauxOccupation());
    				} else {
    					moisMgr.updateMois(mois.getId(), mois.getMois(), mois.getAnnee(), mois.getNbJoursOuvres(), mois.getTauxOccupation());
    				}
     
    			}
    			return mapping.findForward("success");
    		}
    	}
    }
    Ce que je ne comprend pas c'est que je met ma liste dans le scope session et qu'il n'arrive pas à la récupérer.
    Un System.out.println(session.getAttribute("listeMois")); depuis ma JSP m'affiche la bonne liste dans la console...

  6. #6
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Il ne faut pas mettre la liste dans le scope session.
    C'est le form-bean qui a pour propriété la liste qui est dans le scope session.

    Il faut donc :

    ajouter les attributs name="MoisForm" et validate="false" dans le mapping de l'Action qui initialise le form-bean :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <action path="/pages/forecast/dolistemois" type="casting.action.ListeMoisAction"
              scope="session" name="MoisForm" validate="false" >
       <forward name="failure" path="/pages/forecast/gestion.jsp" redirect="true"/>
       <forward name="success" path="/pages/forecast/gestiondate.jsp" redirect="true" />
    </action>
    modifier l'Action ListeMoisAction comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response)
    			throws Exception {		
    		MoisForm moisForm=(MoisForm) form ;
    		moisForm.setListeMois(ListeMoisAction.recupMois());
    		if(moisForm.getListeMois()==null){
    			return mapping.findForward("failure");
    		}		
    		return mapping.findForward("success");
    	}
    remettre dans l'ActionForm MoisForm le getter indexé sur l'objet Mois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public Mois getMois(int i) {
    		return (Mois)listeMois.get(i);
    	}

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Juillet 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Finlande

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Juillet 2009
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup. Le formulaire fonctionne!
    Je ne pensais pas qu'il était aussi compliqué de concevoir un formulaire dynamique avec Struts.

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

Discussions similaires

  1. [AC-2010] Probleme ouverture formulaire avec zone de liste
    Par caje17 dans le forum Access
    Réponses: 11
    Dernier message: 31/03/2015, 17h07
  2. Réponses: 4
    Dernier message: 03/12/2009, 13h39
  3. Problème de formulaire avec des If-Else
    Par MasterChief78 dans le forum Access
    Réponses: 21
    Dernier message: 29/08/2006, 12h54
  4. problemes manip formulaires avec js
    Par cortex007 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/07/2006, 07h46
  5. probleme bouton radio avec onChange dans formulaire
    Par wil4linux dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/09/2005, 11h26

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