我想循环遍历“节日”的 ArrayList 并使用 get 方法获取其信息,并打印出所有值。出于某种原因,当我使用此代码时,它将始终选择“0”值而不是递增循环。
如果我将值硬编码为“get(1)”,它将获得正确的值,因此我的问题显然与语法有关。
<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>
答案 0 :(得分:53)
由于您将discouraged and old school scriptlet <% %>
与其后续版本${}
混合在一起,导致您遇到了具体问题。它们不共享相同的变量范围。 scriptlet 范围内不提供allFestivals
,EL范围内不提供i
。
你应该安装JSTL(&lt; - 点击链接获取指示)并在JSP中按如下方式声明它:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
然后按如下方式迭代列表:
<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>
(谨防可能XSS attack holes,相应地使用<c:out>
)
当您使用servlet作为模型和视图控制器时,不要忘记删除 <jsp:useBean>
,因为它没有完全的价值。这只会导致混乱。另见our servlets wiki page。此外,您可以通过web.xml
中的以下条目禁用 scriptlet ,以便您不会意外地使用它们:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
答案 1 :(得分:16)
这样做
<% for(int i = 0; i < allFestivals.size(); i+=1) { %>
<tr>
<td><%=allFestivals.get(i).getFestivalName()%></td>
</tr>
<% } %>
更好的方法是使用c:foreach,请参阅链接jstl for each