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生成のフローを制御できるため、表示するよう指示した内容がすべて表示されます。

あなたの問題は他の場所で引き起こされています。ほとんどの場合、フィールドを保持するHashMap代わりにを使用しています。LinkedHashMapAHashMapは本質的に順序付けられていませんが、aLinkedHashMapは。とまったく同じように挿入順序で順序付けられていListます。


実際に順序付けされていないを返す${paramValues}を参照する暗黙のEL変数を反復処理していることを更新します。リクエストパラメータの順序を保持する必要がある場合は、別の方法で問題を解決する必要があります。たとえば、固定およびインデックス付きのパラメーター名を使用して直接参照できるようにするか、MVCフレームワークを使用するだけです。ServletRequest#getParameterMap()HashMap

于 2012-05-01T15:42:13.617 に答える