35 votes

Utilisation d'une boucle for à l'intérieur d'un JSP

Je veux parcourir en boucle un Liste de tableaux de "Festivals" et obtenir leurs informations avec obtenir en imprimant toutes ses valeurs. Pour une raison quelconque, lorsque j'utilise ce code, il choisit toujours la "0 "ème valeur et n'incrémente pas la boucle.

Si je codifie les valeurs en dur sous la forme "get(1)", il obtiendra les valeurs correctes ; mon problème est donc clairement lié à la syntaxe.

<h1>All Festival Information</h1>
    <jsp:useBean id="allFestivals" type="java.util.ArrayList" scope="session" />
    <table border="1">
        <tr>
            <td>Festival Name:</td>
            <td>Location:</td>
            <td>Start Date:</td>
            <td>End Date:</td>
            <td>URL:</td>
        </tr>
        <% for(int i = 0; i < allFestivals.size(); i+=1) { %>
            <tr>      
                <td>${allFestivals.get(i).getFestivalName()}</td>
                <td>${allFestivals.get(i).getLocation()}</td>
                <td>${allFestivals.get(i).getStartDate()}</td>
                <td>${allFestivals.get(i).getEndDate()}</td>
                <td>${allFestivals.get(i).getURL()}</td>  
            </tr>
        <% } %>
    </table>

76voto

BalusC Points 498232

Votre problème de béton est dû au fait que vous mélangez découragé et vieux jeu scriptlets <% %> avec son successeur EL ${} . Ils ne partagent pas la même portée de variable. Les allFestivals n'est pas disponible en scriptlet et le champ d'application de la i n'est pas disponible dans la portée EL.

Vous devez installer JSTL (<-- cliquez sur le lien pour les instructions) et déclarez-le en haut du JSP comme suit :

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

puis itérer sur la liste comme suit :

<c:forEach items="${allFestivals}" var="festival">
    <tr>      
        <td>${festival.festivalName}</td>
        <td>${festival.location}</td>
        <td>${festival.startDate}</td>
        <td>${festival.endDate}</td>
        <td>${festival.URL}</td>  
    </tr>
</c:forEach>

(attention aux risques de Trous d'attaque XSS , utiliser <c:out> en conséquence)

N'oubliez pas de supprimer les <jsp:useBean> car il n'a pas de valeur absolue lorsque vous utilisez un servlet comme contrôleur de modèle et de vue. Cela ne ferait que créer de la confusion. Voir aussi notre page wiki sur les servlets . En outre, vous feriez bien de désactiver les éléments suivants scriptlets par l'entrée suivante dans web.xml afin de ne pas les utiliser accidentellement :

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <scripting-invalid>true</scripting-invalid>
    </jsp-property-group>
</jsp-config>

20voto

Sajan Chandran Points 4482

Faites ceci

    <% for(int i = 0; i < allFestivals.size(); i+=1) { %>
        <tr>      
            <td><%=allFestivals.get(i).getFestivalName()%></td>
        </tr>
    <% } %>

La meilleure façon est d'utiliser c:foreach voir lien jstl pour chaque

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X