Hello guys Im currently itearing over a list and im hard-coding fieldsets based on if they match a certain criteria. How can I write a loop that creates a fieldset based off all the groupnames in the lidst and populates that fieldset with all the corresponding displayNames that go along with that groupName dynamically. Im currently hardcoding this.
<%@ include file="../include/pre-header.html" %>
<tr>
<th>
<span onclick="toggleDiv('displayFields', 'displayImg')" style="cursor: hand;">Data Fields <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);"/>
<input type="button" name="clear_choice" value="Uncheck All" onclick="checkUncheck(false);"/>
</td>
</tr>
</td>
</tr>
I’d suggest to change your datastructure from
List<DetBean>toMap<String, List<DetBean>>where the group name is the map key.The below example shows how to convert it:
(you can of course also change the datastructure at the point where you’re creating the original
detFieldslist)You probably also want to maintain a mapping of all header names
(it would probably be better to create it once on webapp’s startup and store in application scope, you can use a
ServletContextListenerfor this)This way you can use a single nested
<c:forEach>. Every iteration over aMapgivesMap.Entryback which in turn hasgetKey()andgetValue()methods. The key is then theStringgroup name and the value is then theList<DetBean>.