我有一个String of Map和Object of List,它包含每个数据中心及其机器。我目前正从Controller中将此对象传递给JSP,然后我在JSP页面中迭代它以显示数据。
如果Map大小为1,那么我可以在JSP页面中显示数据并且它可以正常工作。
现在假设如果Map大小为2,那么我想为地图中的每个键显示两个表。这是我无法做到的。对于我的用例,最大地图大小可以是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
}
以下是我的Controller中的方法,我需要将对象传递给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页面,它只适用于等于一的地图大小。我不知道如何在JSP页面中以这种方式迭代上面的mappings
对象,以便我可以显示我的上述用例的两个表格如上所示每个键一个。这可能吗?
<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通用?因为有可能我可以拥有三个数据中心,因为目前我有两个数据中心。
我正在跟进上一个问题here,这有助于我迭代一张大小为1的地图,但不确定如何为每个密钥分别设置两个表
更新: -
这是我尝试过的,但它对我不起作用 -
<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>
答案 0 :(得分:2)
试试这个 -
<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>