Jsp 表单字段在JSTL中不按字母顺序输出
我有一个表单,其中有顺序命名的字段field1、field2等,为了计算的目的,我需要以相同的顺序输出这些字段。默认情况下,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
<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。所以这只会更加证实我的答案。