JSPでArrayListの適切なサイズを取得していない
質問
以下のJSPページのArrayList alt
で正しい数の要素を取得できません。 JSPを表示すると、サイズが3であるべきときにサイズが1(<%=alt.size()%>
)であることが示されます。私はジェネレータークラスの配列にそのメソッドを追加していると思うので、なぜそれが1を示しているのか分かりません。
これは私のjspページです:
<%
ArrayList<Alert> a = AlertGenerator.getAlert();
pageContext.setAttribute("alt", a);
%>
<c:forEach var="alert" items="${alt}" varStatus="status" >
<p>You have <%=alt.size()%> Active Alert(s)</p>
<ul>
<li><a href="#" class="linkthree">${alert.alert1}</a></li>
<li><a href="#" class="linkthree">${alert.alert2}</a></li>
<li><a href="#" class="linkthree">${alert.alert3}</a></li>
</ul>
</c:forEach>
これはアラートを生成するクラスです:
package com.cg.mock;
import java.util.ArrayList;
public class AlertGenerator {
public static ArrayList<Alert> getAlert() {
ArrayList<Alert> alt = new ArrayList<Alert>();
alt.add(new Alert("alert1","alert2","alert3"));
return alt;
}
}
これは私のBeanクラスです:
package com.cg.mock;
public class Alert {
String alert1;
String alert2;
String alert3;
public Alert(String alert1, String alert2,String alert3) {
super();
this.alert1 = alert1;
this.alert2 = alert2;
this.alert3 = alert3;
}
public String getAlert1() {
return alert1;
}
public void setAlert1(String alert1) {
this.alert1 = alert1;
}
public String getAlert2() {
return alert2;
}
public void setAlert2(String alert2) {
this.alert2 = alert2;
}
public String getAlert3() {
return alert3;
}
public void setAlert3(String alert3) {
this.alert3 = alert3;
}
}
解決
3つのアラートを取得するには、次のように再設計できます。アラートクラスには1つのプロパティしかないことに注意してください。アラートごとにアラートの新しいインスタンスを作成できます。
package com.cg.mock;
public class Alert {
String alert1;
public Alert(String alert1) {
super();
this.alert1 = alert1;
}
public String getAlert1() {
return alert1;
}
public void setAlert1(String alert1) {
this.alert1 = alert1;
}
}
AlertGenerator内:
ArrayList<Alert> alt = new ArrayList<Alert>();
alt.add(new Alert("alert1");
alt.add(new Alert("alert2");
alt.add(new Alert("alert3");
return alt;
およびJSPで:
<p>You have <%=alt.size()%> Active Alert(s)</p>
<ul>
<c:forEach var="alert" items="${alt}" varStatus="status" >
<li><a href="#" class="linkthree">${alert.alert1}</a></li>
</c:forEach>
</ul>
ulがforEachループの外側にあることに注意してください。
他のヒント
問題は、ArrayListにAlertインスタンスが1つしかないことですが、その単一のAlertには、alert1、alert2、およびalert3の3つのプロパティがあります。
次の行を見てください:
alt.add(new Alert("alert1","alert2","alert3"));
追加行は1行のみで、ループにはありません。
可能な解決策:
public class Alert {
private String description;
private String status;
private Date raisedOn;
public Alert(String description, String status) {
this.description = description;
this.status = status;
this.raisedOn = new Date();
}
public String getDescription() { return description; }
public String getStatus() { return status; }
public Date getRaisedOn() { return raisedOn; }
}
....
alt.add(new Alert("Disk Almost Full", "Warning"));
alt.add(new Alert("Disk Full", "Severe"));
...
...
<table>
<tr><th>Description</th><th>Status</th><th>Raised</th></td>
<c:forEach var="alert" items="${alt}">
<tr>
<td><c:out value="${alert.description}"/></td>
<td><c:out value="${alert.status}"/></td>
<td><c:out value="${alert.raisedOn}"/></td>
</tr>
</c:forEach>
</table>
3
に1つのアイテムしかadd
しなかったのに、なぜList
を返すと思われますか?
ArrayListにはAlertという要素が1つだけ含まれています(Alert要素には3つの文字列アラートが含まれています。
JSPを次のように変更します。
<%
ArrayList<Alert> a = AlertGenerator.getAlert();
pageContext.setAttribute("alt", a);
%>
<p>You have <%=alt.size()%> Active Alert(s)</p>
<ul>
<c:forEach var="alert" items="${alt}" varStatus="status" >
<li><a href="#" class="linkthree">${alert.alert}</a></li>
</c:forEach>
</ul>
AlertGenerator.javaを次のように変更します。
package com.cg.mock;
import java.util.ArrayList;
public class AlertGenerator {
public static ArrayList<Alert> getAlert() {
ArrayList<Alert> alt = new ArrayList<Alert>();
alt.add(new Alert("alert2"));
alt.add(new Alert("alert2"));
alt.add(new Alert("alert3"));
return alt;
}
}
Alert.javaの変更:
package com.cg.mock;
public class Alert {
String alert;
public Alert(String alert) {
this.alert = alert;
}
public String getAlert() {
return alert;
}
public void setAlert(String alert) {
this.alert = alert;
}
}
所属していません StackOverflow