¿Cómo mostrar varias tablas dependiendo de la clave en el Mapa usando JSTL?

Tengo un mapa de cadena y una lista de objetos que contiene cada centro de datos y su máquina. Y actualmente estoy pasando este objeto a JSP desde mi controlador y luego lo estoy iterando en la página JSP para mostrar los datos.

Si el tamaño del mapa es uno, entonces puedo mostrar los datos en una página JSP y funciona bien.

Ahora suponga que si el tamaño del mapa es dos, me gustaría mostrar dos tablas una para cada clave en el mapa. Esto es lo que no puedo hacer funcionar. El tamaño máximo del mapa puede ser 3 para mi caso de uso.

A continuación se muestra mi clase que contiene los datos:

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
}

Y a continuación está mi método en mi Controlador desde el que necesito pasar un objeto a JSP y luego iterar ese objeto en JSP para mostrar los datos en una tabla:

@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;   
}

Planteamiento del problema:-

Como puede ver en el código anterior, tengo dos claves, ya que tengo dos centros de datos, uno esdc1 y otro esdc2. Así que me gustaría mostrar dos tablas, una paradc1 y sus máquinas y segunda mesa paradc2 y sus máquinas como se muestra a continuación.

Entonces mis datos deberían verse así después de iterartesting objeto-

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

Y debajo está mi página JSP, que funciona bien solo para un tamaño de mapa igual a uno ... Y no estoy seguro de cómo iterar lo anteriormappings objeto de tal manera en la página JSP para que pueda mostrar dos tablas para mi caso de uso anterior uno para cada clave como se muestra arriba. ¿Es posible hacer esto?

<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>

¿Alguna idea de cómo puedo hacer que mi JSP sea genérico aquí? Como podría ser posible, puedo tener tres centros de datos, ya que actualmente tengo dos.

Estoy siguiendo mi pregunta anterioraquí lo que me ayuda a iterar un mapa de tamaño uno pero no estoy seguro de cómo tendría dos tablas separadas, una para cada tecla

ACTUALIZAR:-

Esto es lo que he intentado y no me funciona.

<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>

Y me estoy poniendo por debajo de la excepción y no estoy seguro de qué mal estoy haciendo aquí. -

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta