2013-04-05 5 views
19

Chcę przechodzić przez ArrayList z "Festiwali" i uzyskać ich informacje z uzyskać metod, drukowania wszystkich swoich wartości. Z jakiegoś powodu, kiedy używam tego kodu, zawsze wybierze on wartość "0" i nie zwiększy pętli.Używanie pętli wewnątrz JSP

Jeśli mocno zakodować wartości jako "get (1)", otrzyma poprawne wartości, więc mój problem jest wyraźnie zgodny ze składnią.

<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> 
+1

pisania kodu Java wewnątrz strony JSP nie jest zalecane. Zamiast tego użyj znacznika JSTL core ''. –

+0

Po prostu przestań używać '<% %>'. Będziesz automatycznie zmuszony do robienia właściwych rzeczy. Zobacz także http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files/3180202#3180202 – BalusC

Odpowiedz

43

Państwo konkretny problem jest spowodowany ponieważ jesteś mieszanie discouraged and old schoolscriptlets<% %> z jego następcę EL ${}. Nie mają tego samego zakresu zmiennych. Model allFestivals nie jest dostępny w zakresie scriptlet, a i nie jest dostępny w zakresie EL.

Należy zainstalować JSTL (< - kliknij link do instrukcji) oraz uznaniu jej w górę JSP następująco:

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

a następnie iteracyjne nad listą następująco:

<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> 

(uwaga na możliwość XSS attack holes, użyj odpowiednio)

Nie zapomnij o tym, aby usunąć z , ponieważ nie ma tu żadnej wartości, gdy używasz serwletu jako kontrolera modelu i widoku. Doprowadziłoby to tylko do zamieszania. Zobacz także our servlets wiki page. Dalsze zrobisz sobie przysługę wyłączyć scriptlets następującym wpisem web.xml tak, że nie będzie przypadkowo ich użyć:

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

Działa doskonale. Nie wiem, dlaczego powiedziano mi, aby używać "<% %>", ponieważ większość informacji w Internecie jest zgodna z twoją metodą, używając "

+0

Nie ma za co. Być może polegałeś na zasobach, które mają więcej niż dziesięć lat. – BalusC

+5

Moja uczelnia. Porozmawiaj o nieco starej szkole nauczania –

14

Wykonaj

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

lepiej jest użyć c: foreach patrz link jstl for each

+1

W szczególnym przypadku OP, 'allFestivals' nie jest dostępny w * scriptlet * scope . – BalusC