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

Taglibs Java Discussion :

foreach qui ne fonctionne qu'une seule fois [JSTL]


Sujet :

Taglibs Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut foreach qui ne fonctionne qu'une seule fois
    Bonjour,

    En executant le code simple suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <c:forEach items="${employees}" var="employee" varStatus="status">
           ${employee.name}
    </c:forEach>
    <hr>
    <c:forEach items="${employees}" var="employee" varStatus="status">
    	${employee.name}
    </c:forEach>
    J'obtient bien la liste attendu avant le <hr> mais je n'obtient absolument rien en-dessous. C'est-à-dire que ma boucle foreach s'exécute très bien la première fois, mais pas la deuxième où elle ne renvoit rien du tout...

    Je ne comprend vraiment pas pourquoi. Des idées ?

  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
    Il est surprenant de vouloir itérer deux fois sur la même collection dans la même jsp mais cela devrait quand même fonctionner.

    Dans quel scope as-tu mis la collection employees ?
    Y-a-t'il du code autre que la balise <hr> entre les deux c:forEach ?
    Peux-tu montrer le code html généré ?
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    En réalité je ne cherche pas à afficher deux fois la même chose, mon traitement est un peu plus complexe mais je l'ai simplifié pour tenter de localiser la source de mon problème.

    Pour répondre à tes questions :
    - Ma variable employees est dans le scope request si je ne me trompe pas... Je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.put("employees", e);
    - Pas de code entre les deux balises foreach. Voici mon code en version complète :
    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
    <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    <%@ page isELIgnored="false" %>
     
    <html>
    	<head>
    		<title>Test</title>
     
    	</head>
    	<body>				
    		test
    		<c:forEach items="${employees}" var="employee" varStatus="status">
    			${employee.lastName}
    		</c:forEach>
    		<hr>
    		<c:forEach items="${employees}" var="employee" varStatus="status">
    			${employee.lastName}
    		</c:forEach>
    		fin test				
    	</body>
    </html>
    - le code html généré est le suivant, et correspond bien au contenu de ma variable:
    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
    <html>
    	<head>
    		<title>Test</title>
     
    	</head>
    	<body>				
    		test
     
    			dupont
     
    			DUPONT
     
    			DUPUY
     
    			DUPONT3
     
    			DUPONT
     
    			DUPONT
     
    			DUPUY
     
    			DUPUY
     
    			dupont
     
    			dupont
     
    			DUPUY
     
    			Dupont
     
    			DUPONT
     
    			DUP
     
    			DUPIERRE
     
    			Dupu
     
    			DUPRE
     
    			DUPIN
     
    			dupont
     
    			dupont
     
    		<hr>
     
     
    		fin test				
    	</body>
    </html>

  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
    Pour l'instant, je n'ai aucune idée de ce qui peut provoquer ce problème.

    Le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.put("employees", e);
    ne me renseigne pas sur le scope mais je ne pense pas que ce soit un problème de scope.

    J'ai vu que tu avais codé ceci dans la jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    cela signifie donc que tu es en J2EE 1.4 et que tu utilises la JSTL 1.1.

    As-tu bien ceci au début de ton web.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <web-app id="tonAppli" xmlns="http://java.sun.com/xml/ns/j2ee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    	version="2.4">
    Si c'est bien le cas, peux-tu modifier la directive taglib comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    et voir si ça fonctionne mieux ?
    Modératrice Java - Struts, Servlets/JSP, ...

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2007
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    et en changeant d'iterateur et de variable de statut ca marche toujours pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <body>				
    		test
    		<c:forEach items="${employees}" var="employee1" varStatus="status1">
    			${employee1.lastName}
    		</c:forEach>
    		<hr>
    		<c:forEach items="${employees}" var="employee2" varStatus="status2">
    			${employee2.lastName}
    		</c:forEach>
    		fin test				
    	</body>

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    @systho : J'ai essayé de changer l'itérateur mais mon problème persiste.

    @c_nvy : Je suis en Java 6 et le début de mon web.xml ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <!DOCTYPE web-app PUBLIC
    	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    	"http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    Si il n'est pas correct, qu'aurais-je du mettre ?

    (J'ai tout de même essayer de changer la directive taglib même si dans mon cas cela n'avait peut-être pas de sens, et cela ne change rien)

    Quant à ma version de JSTL j'avoue ne pas la connaitre. Y'a-t-il un moyen de le savoir ?

  7. #7
    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
    Citation Envoyé par Ouguiya
    Quant à ma version de JSTL j'avoue ne pas la connaitre. Y'a-t-il un moyen de le savoir ?
    Il faut regarder dans le fichier MANIFEST.MF présent dans le répertoire META-INF du jar jstl.jar.

    Vu l'entête de ton web.xml, tu es en J2EE 1.3 donc tu devrais avoir la JSTL 1.0 et donc ceci dans le fichier MANIFEST.MF :
    Specification-Title: JavaServer Pages Standard Tag Library (JSTL)
    Specification-Version: 1.0
    Modératrice Java - Struts, Servlets/JSP, ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Je suis en version 1.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Specification-Title: JavaServer Pages Standard Tag Library (JSTL)
    Specification-Version: 1.1
    Comment spécifier alors dans mon application que j'utilise Java 6 et JSTL 1.1 ?

  9. #9
    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
    Dans le web.xml, remplace ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <!DOCTYPE web-app PUBLIC
    	"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    	"http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    par ceci :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="ISO-8859-1"?>
     
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    	version="2.4">
    et dans la jsp, remplace la directive taglib suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
    par celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    Modératrice Java - Struts, Servlets/JSP, ...

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Voilà j'ai fais les modifications, merci bien

    Par contre mon code ne marche toujours pas...

  11. #11
    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
    Je me doutais un peu que ça ne corrigerait pas ton problème.
    Mais au moins, tu as la bonne configuration pour travailler avec la JSTL 1.1.

    D'ailleurs, pour info, maintenant tu peux supprimer les tlds de la JSTL de WEB-INF et supprimer les balises taglib qui pointent sur ces tlds dans le web.xml (si toutefois tu en avais mis).
    Les tlds étant présentes dans le répertoire META-INF du jar standard.jar, tu y accèdes directement via l'uri codée dans la directive taglib de la jsp.

    Sinon, concernant ton problème, tu dis avoir simplifier le code.
    Mais peux-tu me confirmer que tu as testé le code simplifié que tu postes et qu'il ne fonctionne pas non plus ?

    En tout cas, je ne vois pas ce qui cloche. J'ai fait le test et je peux itérer deux fois sur la même collection via des c:forEach dans la même jsp sans aucun souci, avec balise <hr> ou non.
    Modératrice Java - Struts, Servlets/JSP, ...

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    J'ai supprimé les tlds de la JSTL.

    Pour mon problème, je te rassure je teste bien le code que j'ai donné ici. Je ne travaille plus que sur celui-ci d'ailleurs, pas la peine de tester le reste si ça ne marche pas

    J'ai testé de boucler sur autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <c:forEach var="e" varStatus="status2" begin="1" end="10">
    			${e}
    		</c:forEach>
    Et là je peux mettre autant de fois que je veux cette boucle, elle marche parfaitement.
    Le problème vient alors peut-être de ma variable... Je l'envoi à ma page jsp via un controller java en mettant ma variable dans un modèle (j'utilise spring). Mais je ne vois pas non plus où ça coince exactement.

    En tout cas si vous avez des idées n'hésitez pas. Moi je suis prête à faire tous les tests qu'il faudra vu que ce problème m'empêche de faire beaucoup de traitements plus complexes dont j'ai besoin.

    PS : Je viens de tester avec une autre variable et là ça marche très bien, même si je prend le même nom de variable pour itérer.

  13. #13
    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
    Citation Envoyé par Ouguiya
    Le problème vient alors peut-être de ma variable... Je l'envoi à ma page jsp via un controller java en mettant ma variable dans un modèle (j'utilise spring).
    Malheureusement, je ne connais pas Spring.

    Pour tester, si tu remplaces ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    model.put("employees", e);
    par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute("employees",e);
    as-tu le même problème ?

    Sinon, de quel type exactement est ta collection employees ?
    Modératrice Java - Struts, Servlets/JSP, ...

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    J'ai essayé mais le résultat est exactement le même.
    Ma collection est de type Enumeration donc pas de problème de ce côté là.

    Par contre je viens d'apprendre que quelqu'un qui utilise la même API qui me sert à alimenter cette variable à rencontrer des problèmes similaires au mien. Donc pour le moment je vais privilégier cette piste. Je vais mettre ce sujet en résolu en attendant.

    En tout cas merci pour votre aide, au moins ma configuration est bonne maintenant

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Alors je viens aux nouvelles au cas où quelqu'un aurait le même problème que moi.
    L'API que j'utilise a été corrigée et cela a résolu des bugs que j'avais rencontré mais pas ce prolème en particulier.
    En fait la réponse à mon problème est très simple et vient du fait de l'utilisation d'un type Enumeration.
    En effet une Enumeration ne possède des méthodes ne permettant de lire son contenu qu'en avant et jamais en arrière car au fur et à mesure que l'on lit ses éléments ceux-ci "s'auto-détruisent" empêchant donc de lire plusieurs fois une Enumeration et donc de boucler plusieurs fois dessus.

    Voilà c'était tout simple mais il fallait le savoir

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 376
    Points : 431
    Points
    431
    Par défaut
    Le bug se trouvait donc dans cette phrase
    Citation Envoyé par Ouguiya
    Ma collection est de type Enumeration donc pas de problème de ce côté là.
    Il est vrai que les énumérations ne sont pas très pratiques à utiliser. Vive les collections ?

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    ^^
    J'ai pensé à vérifier que le type Enumeration était bien supporté par c:forEach (et cela était le cas d'où cette phrase un peu trop optimiste ^^) mais je n'ais pas du tout pensé que le problème pouvait venir du comportement du type Enumeration parce que je ne me doutais pas que de tels comportements existaient... et je ne comprend toujours pas pourquoi ils existent et quel en est l'interêt...

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

Discussions similaires

  1. pourquoi on error goto ne fonctionne qu'une seule fois ?
    Par alsimbad dans le forum Général VBA
    Réponses: 9
    Dernier message: 05/09/2014, 12h09
  2. requete sql qui ne fonctionne qu'une seule fois
    Par brice97431 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 30/07/2012, 15h11
  3. [AJAX] [XMLHttp][IE]Fonction qui ne fonctionne qu'une seule fois
    Par narnou dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/07/2007, 11h16
  4. Label qui ne change qu'une seule fois ...
    Par Christophe Charron dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/04/2006, 19h08
  5. fonction qui s'exécute qu'une seule fois sous Firefox
    Par la.sophe dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/03/2006, 10h02

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