2016-05-02 5 views
1

Mit ein bisschen Schwierigkeit, dies sortiert zu bekommen. Auf meiner JSP-Seite habe ich eine Tabelle, die x Anzahl der Zeilen mit 3 Spalten anzeigt. In meinem Java Bean, habe ich das erklärt, wie:Iterate über eine ArrayList <Map <String, String >> von einer Java Bean mit JSTL?

private ArrayList<Map<String, String>> issueClient = new ArrayList<>(); 
private ArrayList<Map<String, String>> issueR2 = new ArrayList<>(); 

ich meine Werte durch MVC bekommen und legen Sie sie in die Karte mit:

if (crs != null && crs.size() > 0) { 
     try { 
      while (crs.next()) { 
       HashMap<String, String> tmpPart = new HashMap<>(); 

       tmpPart.put("part", crs.getString("part")); 
       tmpPart.put("type", crs.getString("part_type")); 
       tmpPart.put("id_issue", crs.getString("id_part")); 
       tmpPart.put("issue", crs.getString("part_name")); 

       repairPartAddNew.addIssueClientMap(tmpPart); 
      } 
     } catch (Exception e) { 
     .... 
     } 
    } else { 
     .... 
    } 

repairPartAddNew ein Verweis auf die Java Bean ist mit dem Arraylist Karte oben erwähnt.

<c:if test="${repairPartAddNew.issueClient != null}"> 
<c:set var="loopValue" value="1" scope="page" /> 
    <c:forEach var="issueClient" items="${repairPartAddNew.issueClient}" varStatus="loop"> 
     <c:forEach var="map" items="${issueClient}"> 
     <tr> 
      <td> 
      <form:select disabled="disabled" multiple="false" id="clientReportIssuePart${loopValue}" class="form-control input-sm" name="clientReportIssuePart" path="clientReportIssuePart" onchange="getPartSubtypes(this.value,$(this).parent().next().find('select').attr('id'));"> 
      <form:option value="${map.value}">${map.value}</form:option> 
      <form:options items="${descriptionParts}" itemValue="value" itemLabel="name"/> 
      </form:select> 
      </td> 
      <td> 
       <form:select disabled="disabled" multiple="false" class="form-control input-sm" id="clientPartType${loopValue}" name="clientPartType" path="clientPartType" onchange="getRepairPartIssue(this.value,$(this).parent().next().find('select').attr('id'),$(this).parent().prev().find('select').val());"> 
       <form:option value="${map.value}">${map.value}</form:option> 
       </form:select> 
      </td> 
      <td> 
      <form:select disabled="disabled" multiple="false" class="form-control input-sm" id="clientRepair${loopValue}" name="clientReportIssuePartId" path="clientReportIssuePartId"> 
      </form:select> 
      </td> 
     </tr> 
    </c:forEach> 
<c:set var="loopValue" value="${loopValue + 1}" scope="page"/> 
</c:forEach> 
</c:if> 

ich am Ende mit verschiedenen Greueln in der Datenstruktur, einschließlich der http://prnt.sc/azjlgp

Es scheint wie Iterieren über das Array und Karte erzeugt doppelte Zeilen: die folgenden zu konstruieren, in meinem JSP, habe ich begonnen. In diesem Beispiel sollten nur 2 Tabellenzeilen vorhanden sein.

Jede Hilfe wird sehr geschätzt.

+2

Wenn jede Karte in der Liste eine Zeile sein sollte, warum haben Sie zwei verschachtelte forEach? Warum zur Hölle verwenden Sie Maps, um Ihr Modell anstelle von Objekten mit benannten, typisierten Eigenschaften darzustellen? –

+0

@JBNizet Sie haben recht, ich habe es nicht aus dem richtigen Blickwinkel betrachtet. – SiriusBits

Antwort

1

Ich würde empfehlen, ein Objekt zu verwenden, um alle Ihre Werte anstelle von einer HashMap zu speichern. Sie können dann jede Zeilendaten in diesem Objekt speichern und sie alle in einer ArrayList speichern. Sie sollten dann in der Lage sein, jeden Wert aus dem Objekt nach Bedarf zu ziehen.

 <c:if test="${repairPartAddNew.clientReportIssuePart != null}"> 
       <c:set var="loopValue" value="1" scope="page" /> 
       <c:forEach var="issueClient" items="${repairPartAddNew.issueClientList}" varStatus="loop"> 
         <tr> 
          <td> 
           <form:select disabled="disabled" multiple="false" id="clientReportIssuePart${loopValue}" class="form-control input-sm" name="clientReportIssuePart" path="clientReportIssuePart" 
              onchange="getPartSubtypes(this.value,$(this).parent().next().find('select').attr('id'));"> 
            <form:option value="${issueClient.part}">${issueClient.part}</form:option> 
            <form:options items="${descriptionParts}" itemValue="value" itemLabel="name"/> 
           </form:select> 
          </td> 

          <td> 
           <form:select disabled="disabled" multiple="false" class="form-control input-sm" id="clientPartType${loopValue}" name="clientPartType" path="clientPartType" 
              onchange="getRepairPartIssue(this.value,$(this).parent().next().find('select').attr('id'),$(this).parent().prev().find('select').val());"> 
            <form:option value="${issueClient.type}">${issueClient.type}</form:option> 
           </form:select> 
          </td> 

          <td> 
           <form:select disabled="disabled" multiple="false" class="form-control input-sm" id="clientRepair${loopValue}" name="clientReportIssuePartId" path="clientReportIssuePartId"> 
            <form:option value="${issueClient.id_issue}">${issueClient.issue}</form:option> 
           </form:select> 
          </td> 
          <td class="text-center width-100"> 
           <button type="button" id="deleteClientRowBtn" class="btn btn-outline btn-sm btn-dark" 
             onclick="deleteRow(this, $(this).closest('table').attr('id'))">Delete Row 
           </button> 
          <td class="text-center width-100"> 
           <button type="button" class="btn btn-outline btn-sm btn-dark" 
             onclick="addTableRow('tableClientTemplate', $(this).closest('table').attr('id'))">Add Row 
           </button> 
          </td> 
         </tr> 
        <c:set var="loopValue" value="${loopValue + 1}" scope="page"/> 
       </c:forEach> 
      </c:if> 

     </tbody> 

Hoffe, dass hilft.

+0

Das war, was ich brauchte, danke. – SiriusBits

Verwandte Themen