Не получается правильный размер ArrayList в JSP

StackOverflow https://stackoverflow.com/questions/253415

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня проблемы с получением нужного количества элементов в ArrayList alt на странице JSP ниже. Когда я смотрю JSP, он показывает размер 1 (<%=alt.size()%>), когда он должен быть 3; Я думаю, что добавляю этот метод в массив в классе генератора, поэтому я не понимаю, почему он показывает 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;
    }

}

Это мой класс бобов:

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 оповещения, вы можете изменить их дизайн следующим образом. Обратите внимание, что существует только одно свойство класса оповещения. Вы можете создать новый экземпляр Alert для каждого предупреждения.

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.

Другие советы

Проблема в том, что у вас есть только один экземпляр Alert в вашем ArrayList, но у этого одного Alert есть 3 свойства: alert1, alert2 и alert3.

Посмотрите на строку:

alt.add(new Alert("alert1","alert2","alert3"));

У вас есть только одна строка добавления, и она не находится в цикле.

Возможное решение:

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, когда вы только add изменили один элемент в List?

ArrayList содержит ТОЛЬКО один элемент Alert (элемент Alert содержит три предупреждения Strings.

Измените 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;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top