1

I am working on Spring MVC project in which I need to pass an object from my Controller to JSP and then I need to iterate that object and show them in a table in jsp page.

Below is my class which holds the data -

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
}

And below is my method in my Controller from which I need to pass an object to JSP and then iterate that object in JSP to show the data in a table -

@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> metrics = new LinkedList<MachineMetrics>();
    metrics.add(metrics1);
    metrics.add(metrics2);

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

    model.put("testing", mappings);

    return model;   
}

And below is my JSP page.. And I am not sure how to use the above mappings object in such a way in the JSP page so that I can iterate it and show the result in a table.

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

            <!-- this gives me exception -->
            <c:forEach items="${testing.value}" var="m">
                <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>

I have tried using JSTL as shown above and I was trying to iterate the list in a map which I have passed from Controller to JSP but somehow it is giving me an exception as -

'${testing.value}' Property 'value' not found

My data should look like this in the table for Datacenter 1 after iterating the list in the Map-

Machine Name    T2_95   T2_99   Syncs   Syncs Behind    Average

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

Anything wrong I am doing here?

I am following up on my previous question here. In this question response object is different as I have Map of string and list here.

Community
  • 1
  • 1
  • 1
    look at this question almost similar problem. http://stackoverflow.com/questions/2848332/loop-through-a-map-with-jstl – Ravi Kumar Mar 10 '14 at 05:01
  • @RaviKumar: I have already seen that and tried it but doesn't work for me at all.. Something wrong I am doing for sure.. Can you help if possible? –  Mar 10 '14 at 05:07

1 Answers1

1

I think this should work.

<c:set var="entry" value="${testing.datacenterMachines}"></c:set>
<c:forEachn 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>
Ravi Kumar
  • 993
  • 1
  • 12
  • 37
  • This is the error I am getting `Attribute qualified names must be unique within an element` after trying your suggestion. Any thoughts why it is happening? –  Mar 10 '14 at 05:59
  • Sorry it was my fault it should be instead of i have updated answer too. problem was i added var="m" attribute twice. – Ravi Kumar Mar 10 '14 at 06:03
  • One quick question, why are you using `c:set` instead of `c:forEach`? –  Mar 10 '14 at 06:06
  • gives me the map containing string as key and list as values now with i got the map value which is list and iterating through. i guess remove and then will do the same. – Ravi Kumar Mar 10 '14 at 06:09