سؤال

وأواجه صعوبة في الحصول على العدد الصحيح من العناصر في alt ArrayList في صفحة JSP أدناه. عندما عرض JSP فإنه يدل على حجم 1 (<%=alt.size()%>) عندما ينبغي أن يكون 3؛ اعتقد انني مضيفا أن طريقة لمجموعة في فئة مولد، لذلك أنا لا أفهم لماذا انها تظهر في 1.

وهذه هي صفحة التخطيط الاستراتيجي المشترك الخاص بي:

<%
   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 إنذارات يمكنك إعادة تصميم على النحو التالي. لاحظ أن هناك خاصية واحدة فقط من الطبقة تنبيه. يمكنك إنشاء مثيل جديد من تنبيه لكل حالة تأهب.

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>

لاحظ المجاهدين هي خارج حلقة foreach.

نصائح أخرى

والمشكلة هي أن يكون لديك المثال تنبيه واحد فقط في ArrayList الخاص بك، ولكن هذا تنبيه واحد له 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 عندما كنت added عنصر واحد فقط إلى List؟

ووArrayList يحتوي على عنصر واحد فقط تنبيه (العنصر تنبيه يحتوي على ثلاثة سلاسل التنبيهات.

وتغيير 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