0

我有一个带有顺序命名字段(field1、field2 等)的表单,我需要以相同的顺序输出以进行计算。默认情况下,JSTL 似乎不按字母顺序排序。有没有办法这样做?

这是代码:

<c:if test="${param.submitted}">

        <c:set var="hits" value="1" />
        <c:set var="damage" value="0" />

        <table border="1">
            <tr>
                <th>Attack</th>
                <th>Damage (Orig)</th>
                <th>Damage (Scaled)</th>
                <th>Total</th>
            </tr>

        <!-- Loop through form fields -->
        <c:forEach var="information" items="${paramValues}" varStatus="field">
            <!-- Loop through fields' values -->
            <tr>

            <c:forEach var="currentField" items="${information.value}">
                <c:if test="${!empty currentField}">
                    <c:if test="${fn:contains(currentField, '|')}">
                        <c:set var="currentAttack" value="${fn:substringAfter(currentField, '|')}" />
                        <td><c:out value="${hits}" />: <c:out value="${fn:substringBefore(currentField, '|')}" /></td>
                        <td><c:out value="${fn:substringAfter(currentField, '|')}" /></td>

                        <td>
                        <c:choose>
                            <c:when test="${hits < 3}">
                                <c:out value="${currentAttack}" />
                                <c:set var="damage" value="${damage + currentAttack}" />
                            </c:when>
                            <c:when test="${hits == 3}">
                                <c:out value="${currentAttack * 0.8}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.8)}" />
                            </c:when>
                            <c:when test="${hits == 4}">
                                <c:out value="${currentAttack * 0.7}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.7)}" />
                            </c:when>
                            <c:when test="${hits == 5}">
                                <c:out value="${currentAttack * 0.6}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.6)}" />
                            </c:when>
                            <c:when test="${hits == 6}">
                                <c:out value="${currentAttack * 0.5}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.5)}" />
                            </c:when>
                            <c:when test="${hits == 7}">
                                <c:out value="${currentAttack * 0.4}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.4)}" />
                            </c:when>
                            <c:when test="${hits == 8}">
                                <c:out value="${currentAttack * 0.3}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.3)}" />
                            </c:when>
                            <c:when test="${hits == 9}">
                                <c:out value="${currentAttack * 0.2}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.2)}" />
                            </c:when>
                            <c:otherwise>
                                <c:out value="${currentAttack * 0.1}" />
                                <c:set var="damage" value="${damage + (currentAttack * 0.1)}" />
                            </c:otherwise>
                        </c:choose>
                        </td>
                        <td><c:out value="${damage}" /></td>

                        <c:set var="hits" value="${hits + 1}" />
                    </c:if>
                </c:if>
            </c:forEach>
            </tr>
        </c:forEach>

        </table>
    </c:if>

    <form action="foo.jsp" method="post">
        <input type="hidden" name="submitted" value="true" />
        <c:forEach var="rows" begin="1" end="5" varStatus="stat">
            <p> ${stat.count}:
                <select name="move${stat.count}">
                    <option value="">-Select-</option>
                    <c:forEach var="row" items="${result.rows}">
                    <option value="${row.attack}|${row.damage}">${row.attack}</option>
                    </c:forEach>
                </select></p>

        </c:forEach>
        <input type="submit" name="submit" value="Go" />
    </form>
4

1 回答 1

0

JSTL 不会更改排序顺序或其他内容,也根本没有对集合进行排序的工具。它只是允许您控制 JSP 中 HTML 生成的流程,从而显示告诉它显示的任何内容。

您的问题是在其他地方引起的。您很可能使用 aHashMap而不是LinkedHashMap来保存字段。AHashMap本质上是无序的,而 aLinkedHashMap是按插入顺序排序的,就像 a 一样List


更新您正在迭代隐式 EL 变量${paramValues},该变量引用ServletRequest#getParameterMap()确实返回 unordered HashMap。如果您需要保留请求参数的顺序,则必须以不同的方式解决问题。例如,通过使用固定和索引参数名称以便您可以直接引用它们,或者仅使用 MVC 框架。

于 2012-05-01T15:42:13.617 回答