Как показать несколько таблиц в зависимости от ключа на карте с помощью JSTL?

У меня есть карта String и List of Object, которая содержит каждый центр обработки данных и его машину. И в настоящее время я передаю этот объект JSP из моего контроллера, а затем я повторяю его на странице JSP, чтобы показать данные.

Если размер карты равен единице, то я могу показать данные на странице JSP, и она отлично работает.

Теперь предположим, что если размер карты равен двум, я бы хотел показать две таблицы по одному для каждого ключа на карте. Это то, что я не могу сделать. Максимальный размер карты может быть 3 для моего использования.

Ниже мой класс, который содержит данные -

public class DatacenterMachineMapping {

    private Map<String, List<MachineMetrics>> datacenterMachines;

    // getters and setters
}

public class MachineMetrics {

    private String machineName;
    private String t2_95;
    private String t2_99;
    private String syncs;
    private String syncsBehind;
    private String average;

    // getters and setters
}

И ниже мой метод в моем контроллере, из которого мне нужно передать объект JSP, а затем повторить этот объект в JSP, чтобы отобразить данные в таблице -

@RequestMapping(value = "testOperation", method = RequestMethod.GET)
public Map<String, String> testData() {

    final Map<String, String> model = new LinkedHashMap<String, String>();

    // for datacenter 1
    MachineMetrics metrics1 = new MachineMetrics();
    metrics1.setAvg("10");
    metrics1.setT2_95("100");
    metrics1.setT2_99("200");
    metrics1.setMachineName("machineA");
    metrics1.setSyncs("100");
    metrics1.setSyncsBehind("1000");

    MachineMetrics metrics2 = new MachineMetrics();
    metrics2.setAvg("20");
    metrics2.setT2_95("200");
    metrics2.setT2_99("300");
    metrics2.setMachineName("machineB");
    metrics2.setSyncs("200");
    metrics2.setSyncsBehind("2000");

    List<MachineMetrics> metricsA = new LinkedList<MachineMetrics>();
    metricsA.add(metrics1);
    metricsA.add(metrics2);

    // for datacenter 2
    MachineMetrics metrics3= new MachineMetrics();
    metrics3.setAvg("30");
    metrics3.setT2_95("300");
    metrics3.setT2_99("300");
    metrics3.setMachineName("machineC");
    metrics3.setSyncs("300");
    metrics3.setSyncsBehind("3000");

    MachineMetrics metrics4 = new MachineMetrics();
    metrics4.setAvg("40");
    metrics4.setT2_95("400");
    metrics4.setT2_99("400");
    metrics4.setMachineName("machineD");
    metrics4.setSyncs("400");
    metrics4.setSyncsBehind("4000");

    List<MachineMetrics> metricsB = new LinkedList<MachineMetrics>();
    metricsB.add(metrics3);
    metricsB.add(metrics4);     

    DatacenterMachineMapping mappings = new DatacenterMachineMapping();
    Map<String, List<MachineMetrics>> holder = new LinkedHashMap<String, List<MachineMetrics>>();
    holder.put("dc1", metricsA);
    holder.put("dc2", metricsB);

    mappings.setDatacenterMachines(holder);     

    model.put("testing", mappings); // passing this object to jsp

    return model;   
}

Проблема: -

Как вы можете видеть в приведенном выше коде, у меня есть два ключа, так как у меня два центра обработки данных: dc1, а другой - dc2. Поэтому я хотел бы показать две таблицы: одну для dc1 и ее машины и вторую таблицу для dc2 и ее машины, как показано ниже.

Итак, мои данные должны выглядеть так после повторения объекта testing -

For DC1

Machine Name    T2_95   T2_99   Syncs   Syncs Behind    Average

machineA        100     200     100     1000            10
machineB        200     300     200     2000            20

For DC2

Machine Name    T2_95   T2_99   Syncs   Syncs Behind    Average

machineC        300     300     300     3000            30
machineD        400     400     400     4000            40

И ниже моя страница JSP работает отлично только для размера карты, равной одному. И я не уверен, как итерации выше указанного объекта mappings таким образом на странице JSP, чтобы я мог показать две таблицы для моего предыдущего варианта использования по одному для каждого ключа, как показано выше. Можно ли это сделать?

<body>
    <table>
        <thead>
            <tr>
                <th>Machine Name</th>
                <th>T2_95</th>
                <th>T2_99</th>
                <th>Syncs</th>
                <th>Syncs Behind</th>
                <th>Average</th>
            </tr>
        </thead>
        <tbody>

        <c:set var="entry" value="${testing.datacenterMachines}"></c:set>
        <c:forEach var="m" items="${entry.value}">
           <tr>
              <td>${m.machineName}</td>
              <td>${m.t2_95}</td>
              <td>${m.t2_99}</td>
              <td>${m.syncs}</td>
              <td>${m.syncsBehind}</td>
              <td>${m.average}</td>
           </tr>
        </c:forEach>

        </tbody>
    </table>
</body>

Любая идея, как я могу сделать свой общий JSP здесь? Как бы то ни было, у меня может быть три центра обработки данных, так как в настоящее время у меня два.

Я следую предыдущему вопросу здесь, который помогает мне перебирать карту размера один, но не уверен, как бы у меня есть две отдельные таблицы по одному для каждого ключа

UPDATE: -

Это то, что я пробовал, и это не работает для меня -

<c:forEach var="e" items="${testing}">
  <h3>For <c:out value="${e.key}"/></h3>
    <table>
      <thead>
            <tr>
                <th>Machine Name</th>
                <th>T2_95</th>
                <th>T2_99</th>
                <th>Syncs</th>
                <th>Syncs Behind</th>
                <th>Average</th>
            </tr>
        </thead>
        <tbody>
          <c:forEach var="m" items="${e.value}">
            <tr>
              <td>${m.machineName}</td>
              <td>${m.t2_95}</td>
              <td>${m.t2_99}</td>
              <td>${m.syncs}</td>
              <td>${m.syncsBehind}</td>
              <td>${m.average}</td>
             </tr>
           </c:ForEach>
        </tbody>
    </table>
</c:forEach>

И я становлюсь ниже исключения, и я не уверен, что я здесь делаю неправильно? -

Don't know how to iterate over supplied "items" in &lt;forEach&gt;

Ответы

Ответ 1

Попробуйте это -

<c:forEach var="e" items="${entry}">
  <h3>For <c:out value="${e.key}"/></h3>
    <table>
      <thead>
            <tr>
                <th>Machine Name</th>
                <th>T2_95</th>
                <th>T2_99</th>
                <th>Syncs</th>
                <th>Syncs Behind</th>
                <th>Average</th>
            </tr>
        </thead>
        <tbody>
          <c:forEach var="m" items="${e.value}">
            <tr>
              <td>${m.machineName}</td>
              <td>${m.t2_95}</td>
              <td>${m.t2_99}</td>
              <td>${m.syncs}</td>
              <td>${m.syncsBehind}</td>
              <td>${m.average}</td>
             </tr>
           <c:ForEach>
        </tbody>
    </table>
</c:forEach>