Я бы предложил изменить структуру данных с 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>