Jsp 表单字段在JSTL中不按字母顺序输出

Jsp 表单字段在JSTL中不按字母顺序输出,jsp,jstl,Jsp,Jstl,我有一个表单,其中有顺序命名的字段field1、field2等,为了计算的目的,我需要以相同的顺序输出这些字段。默认情况下,JSTL似乎不按字母顺序排序。有没有办法做到这一点 代码如下: <c:if test="${param.submitted}"> <c:set var="hits" value="1" /> <c:set var="damage" value="0" /> <table borde

我有一个表单,其中有顺序命名的字段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>

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

你的问题是由别的地方引起的。最有可能的情况是,您正在使用一个而不是一个来保存字段。HashMap本质上是无序的,而LinkedHashMap是按插入顺序排序的,就像列表一样


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

我正在使用表单元素并在其中循环。没有JSP标记被显式地用于表单输出。是的,我已经理解了。请注意,这实际上是一个JSP标记,是JSP标准标记库缩写为JSTL的一部分。现在,我的回答有助于解决问题吗?您是否确实使用HashMap来保存项目,而错误地期望它以插入顺序保存项目?抱歉。没有使用HashMap,老实说,我还不太熟悉.JSP只是显示您让它显示的内容。它不会更改提供给它的数据。问题显然在于将控件传递给JSP之前如何准备数据。只要你什么都不说,就很难指出真正的原因。最好是在你的问题中加入SSCCE。使用HashMap而不是LinkedHashMap是描述的问题症状匹配的最可能原因。根据您的编辑,隐式EL变量${paramValues}肯定是HashMap。所以这只会更加证实我的答案。