Как показать несколько таблиц в зависимости от ключа на карте с помощью 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 <forEach>
Ответы
Ответ 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>