JSTL Итерирует по списку, создавая наборы полей - PullRequest
0 голосов
/ 13 февраля 2012

Привет, ребята. В настоящее время я изучаю список и задаю им жесткие наборы полей, основываясь на том, соответствуют ли они определенным критериям. Как я могу написать цикл, который создает набор полей на основе всех имен групп в lidst и заполняет этот набор полей всеми соответствующими displayNames, которые динамически согласуются с этим groupName. Я в настоящее время жестко кодирую это.

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

1 Ответ

2 голосов
/ 13 февраля 2012

Я бы предложил изменить структуру данных с 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...