我有一个字符串映射和对象列表,其中包含每个数据中心及其计算机。目前,我正在将该对象从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及其机器,如下所示。
dc1
dc2
因此,在迭代testing对象后,我的数据应如下所示:
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页面,该页面仅对等于1的地图大小有效。.而且我不确定如何mappings在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通用吗?我可能有三个数据中心,而目前有两个。
我在这里跟进我的上一个问题,这可以帮助我迭代一个大小为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>
尝试这个 -
<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>