「Festivals」の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>
具体的な問題は、 非推奨と旧式scriptlets<% %>
と後続のEL ${}
が混在しているために発生します。これらは同じ変数スコープを共有しません。 allFestivals
はscriptletスコープでは使用できず、i
はELスコープでは使用できません。
[〜#〜] jstl [〜#〜] (<-手順についてはリンクをクリック)をインストールし、次のように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攻撃ホール 、それに応じて<c:out>
を使用)
remove the <jsp:useBean>
を忘れないでください。モデルとビューのコントローラーとしてサーブレットを使用している場合、ここにはまったく値がありません。混乱を招くだけです。 サーブレットwikiページ も参照してください。さらに、誤って使用しないように、web.xml
の次のエントリでscriptletsを無効にすることもできます。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
これを行う
<% for(int i = 0; i < allFestivals.size(); i+=1) { %>
<tr>
<td><%=allFestivals.get(i).getFestivalName()%></td>
</tr>
<% } %>
より良い方法は、c:foreachを使用することです。リンクを参照してください jstl for each