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 :

[logic:iterate] arreter la boucle


Sujet :

Struts 1 Java

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut [logic:iterate] arreter la boucle
    Bonjour,

    comment on peut arreter la boucle iterate de <logic:iterate>
    je recupere la catégorie de mon produit, et je veux l'afficher evidemment une seule fois dans ma jsp puiqu'elle ne change pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <logic:iterate id="Produit" name="listeProduit">
    Catégorie : <bean:write name="Produit" property="categorie"/>
    </logic:iterate>
    j'ai cherché dans la doc, mais j'ai pas trouvé l'astuce

    merci d'avance !

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Par défaut
    Pourquoi ne pas faire un objet qui ne contiendrait qu'une seule fois ton produit? Et ainsi faire le logic iterate sur tous tes produits?

    Car arreter le logic iterate je ne vois pas à quoi ca sert dans ton cas car si tu l'arrete et que tu as d'autres produits après tu ne les afficheras pas. De plus je ne vois pas du tout comment on pourrait arrété une boucle "prédéfini" sur la taille de la liste.

    Sinon tu peux toujours regarder à l'intérieur du logic:iterate si tu a deja mis le produit avec un logic:equals

    J'espere avoir pu t'aiguiller. Si je suis completement à coté de la plaque essaye de mieux expliquer ton probleme

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    je vais t'expliquer la situation de mon pb,
    j'ai une base de données qui contient des produits differents appartenant a des categories differentes :
    j'ai un menu qui permet de cliquer sur une categorie : info, livres, etc...
    dans une classe ActionListeProduits, je retourne un arraylist pour la catégorie demandée contenant nom_produit, prix, et description, et je recupere aussi la categorie qui me sert a coder une seule page jsp : (je vais pas m'amuser a faire 50 pages jsp si j'ai 50 categories), mon code se presente ainsi :
    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
     
    <center> 
    			<h1>LISTE DES PRODUITS</h1>
    			<br /><br />
    			<logic:iterate id="Produit" name="listeProduit">
    				Catégorie : <bean:write name="Produit" property="categorie"/>
    			</logic:iterate>
    			<br /><br />
     
    		<table border="1">
             <tr>
                <td>Produit </td>
                <td>prix en Euros</td>
                <td>description</td>
                <td>Quantité</td> 
             </tr>
          <logic:iterate id="Produit" name="listeProduit">
             <tr>
                <td><bean:write name="Produit" property="nomProduit"/></td>
                <td><bean:write name="Produit" property="prix"/></td>
                <td><bean:write name="Produit" property="description"/></td>
                <td><html:text property="quantité" value="0"> </html:text></td>
             </tr>
          </logic:iterate>
    	 </table>
    je sais pas s'il existe plus simple pour coder ce que je veux faire, j'espere que oui, meme si je vais passer pour un ane !!!
    merci de ton aide

  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
    Tu pourrais mettre la catégorie dans le scope request via un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute("categorie",categorie);
    et l'afficher tout simplement dans ta jsp via un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <bean:write name="categorie"/>

  5. #5
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    je te remercie, ca marche,
    j'ai une deuxieme question :
    je rajoute dans le <logic:iterate> un champ quantité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <td><html:text property="quantité" value="0"> </html:text></td>
    et un bouton pour valider,
    pour le champ quantité j'arrive, mais pour le submit, quand je declare un <html:form> il aime pas,
    voici mon code :
    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
     
    <html:form action="/ajouterPanier.do">		
    	<table border="1">
             <tr>
                <td>Produit </td>
                <td>prix en Euros</td>
                <td>description</td>
                <td>Quantité</td> 
             </tr>
          <logic:iterate id="Produit" name="listeProduit">
             <tr>
                <td><bean:write name="Produit" property="nomProduit"/></td>
                <td><bean:write name="Produit" property="prix"/></td>
                <td><bean:write name="Produit" property="description"/></td>
                <td><html:text property="quantité" value="0"> </html:text></td>
             </tr>
          </logic:iterate>
          <html:submit value="ajouter au panier"></html:submit>
    	 </table>
    	</html:form>
    j'ai ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javax.servlet.ServletException: Cannot retrieve definition for form bean null on action /ajouterPanier.do
    merci de ton aide..

  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
    Si tu rajoutes un html:form, il faut :

    - créer une classe qui hérite de ActionForm avec pour propriété quantite et getter et setter sur quantite.
    - la déclarer dans le struts-config.xml dans la balise form-bean.
    - l'ajouter dans le mapping de ton Action de path /ajouterPanier via l'attribut name, en précisant scope="request" et input="/nomDeTaJsp.jsp".

  7. #7
    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
    Désolée, j'ai dit une bêtise.

    S'il y a plusieurs lignes de produits, il y aura plusieurs quantités saisissables, une pour chaque produit.

    Il faut donc prévoir dans ton ArrayList de beans Produit de rajouter la propriété quantite et de l'initialiser à 0 pour chaque produit.

    Ensuite, pour que chaque quantité saisie soit mise à jour sur le bon produit, il vaudrait mieux utiliser les tags nested comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          <nested:iterate property="listeProduit">
             <tr>
                <td><nested:write property="nomProduit"/></td>
                <td><nested:write property="prix"/></td>
                <td><nested:write property="description"/></td>
                <td><nested:text property="quantite"/></td>
             </tr>
          </nested:iterate>
    sans oublier de rajouter la directive taglib qui pointe sur struts-nested.tld.

    Puis, il faut ajouter l'ArrayList listeProduit en propriété de ton ActionForm et l'initialiser comme ceci dans l'Action qui s'exécute avant l'affichage de la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setListeProduit(info) ;
    à la place du request.setAttribute sur listeProduit.

    Et enfin, mettre scope="session" plutôt que scope="request" pour le form-bean dans le mapping de ton Action.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    j'ai pas bien compris ta solution :
    avec ta premiere proposition que j'ai essayé d'implémenter, ca m'a un peu embrouillé,
    si j'ai bien compris, je rajoute l'attribut a ma classe Produit comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Produit{
     
    	private String nomProduit;
    	private int prix;
    	private String description;
    	private String categorie;
    	private int quantité=0; 
    	// getteurs et setteurs...
    pour l'ActionForm dont tu parle, je le mets dans cette classe, cad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Produit extends ActionForm{
    ....
    ....
    methode validate()..
    ou tu parles 'autre chose !!!!
    merci de ton aide....

  9. #9
    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 effet, il faut bien rajouter la propriété quantite dans la classe Produit.
    Quand tu constitues l'ArrayList de beans, tu peux initialiser la quantite à 0 pour chacun des produits via un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    produit.setQuantite(0);
    Je pense qu'il vaut mieux éviter de mettre des accents dans les noms de propriétés donc je te conseille de renommer quantité en quantite.

    Par contre, ce n'est pas la classe Produit qui doit hériter d'ActionForm.
    Il faut créer une nouvelle classe, que tu peux appeler ListeProduitForm par exemple, qui hérite d'ActionForm.
    Elle correspond au formulaire de ta jsp.
    Elle doit donc avoir pour propriété l'ArrayList listeProduit avec getter et setter et dans laquelle tu peux implémenter une méthode validate si besoin est.

    Cette ActionForm, il faut la déclarer dans la balise form-bean dans le struts-config.xml et dans le mapping de l'Action qui s'exécute avant l'affichage de la jsp ainsi que dans l'Action de path /ajouterPanier, via l'attribut name.

    Tu as donc ainsi une Action qui initialise le formulaire, soit celle qui constitue l'ArrayList de beans Produit, et une Action, celle de path /ajouterPanier, qui s'exécute au submit du formulaire.

  10. #10
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    si je suis ce que tu m'as dis, j'ai codé comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class ActionAjouterPanier extends Action{
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse reponse) throws Exception{
     
    		ListeProduitForm ListeProduit=(ListeProduitForm) form ;
    		ListeProduit.setListeProduit(info);
    		return mapping.findForward("AjouterPanier");
    	}
    }
    ma question est commencer recuperer info dans la cette classe...
    merci...

  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
    Ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		ListeProduitForm ListeProduit=(ListeProduitForm) form ;
    		ListeProduit.setListeProduit(info);
    il faut le mettre dans l'Action qui s'exécute avant l'affichage de la jsp, celle qui constitue l'ArrayList de beans Produit, soit ActionListeProduit si je me souviens bien.
    Ainsi, tu initialises le formulaire avec l'ArrayList de beans Produit.

    Tu dois mettre ce code à la place du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	request.setAttribute("listeInformatique", info);
    Peux-tu montrer comment tu as défini le form-bean ListeProduitForm et le mapping des Actions ActionListeProduit et ActionAjouterPanier dans le struts-config.xml ?

  12. #12
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <nested:iterate property="listeProduit">
             <tr>
                <td><nested:write property="nomProduit"/></td>
                <td><nested:write property="prix"/></td>
                <td><nested:write property="description"/></td>
                <td><nested:text property="quantite"/></td>
             </tr>
          </nested:iterate>
    je ne vois pas a quoi correspond property="listeproduit"??, avant j'avais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.setAttribute("ListeProduit", info);
    donc il faisait le lien dans la requete, mais la je sais pas comment faire l'affichage des mes propriétes : prix, ....
    quand je lance, j'ai des erreurs de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    javax.servlet.ServletException
    merci...

  13. #13
    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
    listeProduit est la propriété de type ArrayList de l'ActionForm ListeProduitForm que tu initialises via le setter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		ListeProduitForm ListeProduit=(ListeProduitForm) form ;
    		ListeProduit.setListeProduit(info);

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    il faut que tu détermines une variable qui te permet de récupérer un produit itérer, dans ton cas tu ne parles que de la liste

    <nested:root name="product">

    et ensuite tu as je pense la possibilité d'accéder aux propriétés
    <nested:write property="productName"/>

    ...

    my two cent ...

  15. #15
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    j'ai essayé vos propositions, mais ca ne marche tjrs pas,
    j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.lang.NullPointerException
    	actions.ActionListeProduit.execute(ActionListeProduit.java:86)
    la ligne 86 correspond au code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ListeProduitForm ListeProduit=(ListeProduitForm) form ;
    ListeProduit.setListeProduit(info);
    je suis un peu perdu dans tout ca...

  16. #16
    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
    Peux-tu montrer comment tu as défini le form-bean ListeProduitForm et le mapping des Actions ActionListeProduit et ActionAjouterPanier dans le struts-config.xml ?

  17. #17
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form-beans>
      		<form-bean name="Produit" type="forms.Produit"/>
      		<form-bean name="ListeProduit" type="forms.ListeProduitForm"/>
      	</form-beans>
    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
     
    <action path="/Informatique" forward="/pages/produit.jsp"/>
        	<action path="/Livres" forward="/pages/produit.jsp"/>
     
     
        	<action path="/Informatique" type="actions.ActionListeProduit" scope="session">	
    			<forward name="AfficherListeProduit" path="/pages/produit.jsp" redirect="false"/>
    			<forward name="Echec" path="/pages/erreurs.jsp" redirect="false"/>
    		</action>
    		<action path="/Livres" type="actions.ActionListeProduit" scope="session">	
    			<forward name="AfficherListeProduit" path="/pages/produit.jsp" redirect="false"/>
    			<forward name="Echec" path="/pages/erreurs.jsp" redirect="false"/>
    		</action>
     
        	<action path="/ajouterPanier" type="actions.ActionAjouterPanier" scope="session" name="listeProduit" input="/pages/produit.jsp">
        		 <forward name="AjouterPanier" path="/pages/produit.jsp" redirect="false"/>   	
      		</action>

  18. #18
    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
    Attention à la casse. ListeProduit a un L majuscule dans la balise form-bean, il faut donc mettre un L majuscule dans l'attribut name, dans le mapping des Actions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form-beans>
    	<form-bean name="ListeProduit" type="forms.ListeProduitForm"/>
    </form-beans>
    Et il faut ajouter name="ListeProduit" dans l'Action ActionListeProduit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action path="/Informatique" type="actions.ActionListeProduit"
            scope="session" name="ListeProduit" validate="false">	
    	<forward name="AfficherListeProduit" path="/pages/produit.jsp" redirect="false"/>
    	<forward name="Echec" path="/pages/erreurs.jsp" redirect="false"/>
    </action>
    <action path="/ajouterPanier" type="actions.ActionAjouterPanier"
            scope="session" name="ListeProduit" input="/pages/produit.jsp">
    	 <forward name="AjouterPanier" path="/pages/produit.jsp" redirect="false"/>   	
    </action>

  19. #19
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 134
    Par défaut
    je code mon actionform comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public class ListeProduitForm extends ActionForm{
    	private ArrayList<Produit> listeProduit;
    puis, dans la page jsp, je code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <nested:iterate property="listeProduit">
             <tr>
                <td><nested:write property="nomProduit"/></td>
                <td><nested:write property="prix"/></td>
                <td><nested:write property="description"/></td>
                <td><nested:text property="quantite"/></td>
             </tr>
    </nested:iterate>
    j'ai cette erreur :
    Cannot create iterator for this collection

  20. #20
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Je répond à nouveau

    <nested:root name="product"> qui représentera un élément de ta collection

    mais j ai déjà répondu ca dans la page précédente ...

    Mais encore faut il savoir

    quand tu initialise ta collection et quand tu la remplis ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/02/2010, 19h55
  2. [Struts][logic:iterate] Probleme avec String
    Par julienOriano dans le forum Struts 1
    Réponses: 7
    Dernier message: 15/06/2004, 09h39
  3. [EJB2.1 Entity] [BMP] [Struts] Problème avec <logic:iterate>
    Par romain3395 dans le forum Java EE
    Réponses: 2
    Dernier message: 07/06/2004, 10h12
  4. [struts][iterate] problème logic:iterate avec un Vector
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 9
    Dernier message: 31/03/2004, 18h05
  5. [Struts] logic:iterate avec un Vector
    Par laurentb dans le forum Struts 1
    Réponses: 18
    Dernier message: 03/03/2004, 14h42

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