2012-02-13 3 views
0

Привет, ребята, которые в настоящее время просматривают список и im жестко-кодирующие поля, основываясь на том, соответствуют ли они определенным критериям. Как я могу написать цикл, который создает набор полей, основанный на всех групповых именах в lidst, и заполняет этот набор полей всеми соответствующими именами displayNames, которые динамически совпадают с этим именем группы. Im в настоящее время жестко кодирует это.JSTL Iterate over list create fieldsets

<%@ include file="../include/pre-header.html" %> 

    <tr> 
     <th> 
      <span onclick="toggleDiv('displayFields', 'displayImg')" style="cursor: hand;">Data Fields&nbsp;<img name="displayImg" src="../images/minus.gif" /></span> 
     </th> 

    </tr> 

    <tr> 
     <td> 

      <div id="displayFields" style="display:block;"> 
      <fieldset class="det"> 
       <legend>Header Data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'HEADER_DATA'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
          <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Materiel Data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'MATERIEL_DATA'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
          <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Planned Unit Data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'PLANNED_DATA'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
          <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Actual Unit Data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'ACTUAL_DATA'}"> 
       <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
          <br/> 
         </c:if> 
       </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Planned Cost Data</legend> 
       <c:forEach var="detBean" items="${detFields}"> 
        <c:if test="${detBean.groupName == 'COST_DATA'}"> 
         <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
         <br/> 
        </c:if> 
       </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Carry Over Data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'CARRYOVER_DATA'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
         <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>Schedule Exceptions</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'SCHEDULE_EXCEPTIONS'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
         <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 

      <fieldset class="det"> 
       <legend>DIFMS data</legend> 
        <c:forEach var="detBean" items="${detFields}"> 
         <c:if test="${detBean.groupName == 'DIFMS_DATA'}"> 
        <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
         <br/> 
         </c:if> 
        </c:forEach> 
      </fieldset> 
      </div> 
      <tr> 
      <td style="text-align: center;"> 
      <input type="button" name="clear_choice" value="Check All" onclick="checkUncheck(true);"/> 
      &nbsp;&nbsp;&nbsp;&nbsp; 
      <input type="button" name="clear_choice" value="Uncheck All" onclick="checkUncheck(false);"/> 

      </td> 
      </tr> 

     </td> 
     </tr> 

ответ

2

Я хотел бы предложить, чтобы изменить структуру данных из List<DetBean> в Map<String, List<DetBean>>, где название группы является ключом карты.

Ниже пример показывает, как преобразовать его:

Map<String, List<DetBean>> detFieldMap = new LinkedHashMap<String, List<DetBean>>(); 

for (DetBean detBean : detFields) { 
    String groupName = detBean.getGroupName(); 
    List<DetBean> detBeans = detFieldMap.get(groupName); 

    if (detBeans == null) { 
     detBeans = new ArrayList<DetBean>(); 
     detFieldMap.put(groupName, detBeans); 
    } 

    detBeans.add(detBean); 
} 

request.setAttribute("detFieldMap", detFieldMap); 

(вы, конечно, можете также изменить структуру данных в точке, где вы создаете оригинальный detFields список)

Вы, наверное, также хотят сохранить сопоставление всех заголовков

Map<String, String> detFieldHeaders = new HashMap<String, String>(); 
detFieldHeaderMap.put("HEADER_DATA", "Header Data"); 
detFieldHeaderMap.put("MATERIEL_DATA", "Materiel Data"); 
// ... 

request.setAttribute("detFieldHeaders", detFieldHeaders); 

(это будет вероятно, будет лучше создать его один раз при запуске веб-приложения и хранить в области приложения, вы можете использовать ServletContextListener для этого)

Таким образом, вы можете использовать один вложенный <c:forEach>. Каждая итерация над Map дает Map.Entry назад, которая, в свою очередь, имеет getKey() и getValue() методов. Затем ключ представляет собой имя группы String, а затем значение List<DetBean>.

<c:forEach items="${detFieldMap}" var="detFieldEntry"> 
    <fieldset class="det"> 
     <legend>${detFieldHeaders[detFieldEntry.key]}</legend> 
     <c:forEach items="${detFieldEntry.value}" var="detBean"> 
      <input type="checkbox" name="fieldNames" value="${detBean.fieldName}">${detBean.displayName}</input> 
      <br/> 
     </c:forEach> 
    </fieldset> 
</c:forEach> 
+0

Это выглядит своего рода пятно BalusC .. Im собирается дать ему попробовать –

+0

работает BalusC ... спасибо моему другу –

+0

Хель BalusC. так как вы в значительной степени понимаете, что я делаю. Что делать, если я захочу Итератировать и отобразить по порядку более крупную группу fieldSets. Значение каждой группы имеет x число отображаемых имен, прикрепленных к ней. Что, если я захочу поместить группы с наибольшим количеством fieldName в начале списка при повторении? –