2013-04-05 76 views
19

Tôi muốn lặp qua một số ArrayList của "Lễ hội" và nhận thông tin của họ với nhận các phương thức, in ra tất cả các giá trị của nó. Đối với một số lý do khi tôi sử dụng mã này, nó sẽ luôn luôn chọn giá trị thứ "0" và không tăng vòng lặp.Sử dụng vòng lặp bên trong của JSP

Nếu tôi mã hóa cứng các giá trị dưới dạng "get (1)", nó sẽ nhận được các giá trị chính xác để vấn đề của tôi rõ ràng với cú pháp.

<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

Viết mã Java trong trang JSP là không nên. Sử dụng thẻ lõi JSTL ' 'thay thế. –

+0

Chỉ cần ngừng sử dụng '<% %> '. Bạn sẽ tự động bị buộc phải làm những điều đúng đắn. Xem thêm http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files/3180202#3180202 – BalusC

Trả lời

43

Bạn vấn đề cụ thể được gây ra bởi vì bạn đang trộn discouraged and old schoolscriptlets<% %> với người kế nhiệm của nó EL ${}. Họ không chia sẻ cùng một phạm vi biến. Các allFestivals không có sẵn trong tập lệnh phạm vi và i không có sẵn trong phạm vi EL.

Bạn nên cài đặt JSTL (< - Nhấp vào liên kết để xem hướng dẫn) và tuyên bố nó ở trên cùng của JSP như sau:

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

và sau đó lặp trên danh sách như sau:

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

(hãy cẩn thận nếu có thể XSS attack holes, sử dụng <c:out> tương ứng)

Đừng quên xóa<jsp:useBean> vì nó không có giá trị hoàn toàn ở đây khi bạn đang sử dụng servlet làm bộ điều khiển kiểu xem và xem. Nó sẽ chỉ dẫn đến sự nhầm lẫn. Xem thêm our servlets wiki page. Hơn nữa bạn sẽ làm cho mình một đặc ân để vô hiệu hóa scriptlets bởi các mục sau đây trong web.xml để bạn sẽ không vô tình sử dụng chúng:

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

Làm việc hoàn hảo. Không chắc chắn lý do tại sao tôi được yêu cầu sử dụng "<% %>" vì hầu hết thông tin trên mạng đều tuân thủ phương pháp của bạn bằng cách sử dụng "

+0

Bạn được chào đón. Có lẽ bạn đang dựa vào một nguồn tài nguyên đã hơn một thập kỷ. – BalusC

+5

Trường đại học của tôi. Nói về một trường học cũ bit giảng dạy –

14

Do

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

Better cách này là sử dụng c: foreach thấy link jstl for each

+1

Trong trường hợp cụ thể của OP, 'allFestivals' không có sẵn trong phạm vi * scriptlet * . – BalusC

Các vấn đề liên quan