首先用Spring的JdbcTemplate从表(视图)中读出数据(返回一个java.util.List),然后把数据装进一个LinkedHashMap,最后在JSP页面中通过<c:forEach>输出。可是现在的问题是:有的时候<c:forEach>的输出顺序与表(视图)的默认顺序不符(有的时候是相符的)。代码片段如下:
LinkedHashMap kvMap = new LinkedHashMap();
jt = new JdbcTemplate(dataSource);
sql = "select " + column + " from " + table;
List list = jt.queryForList(sql);
if (list.size() > 0) {
    for (Iterator it = list.iterator(); it.hasNext();) {
        ListOrderedMap entity = (ListOrderedMap) it.next();
        kvMap.put((String) entity.getValue(0), (String) entity.getValue(1));
    }
把kvMap传递给JSP的PageContext,然后在页面取出:
<select name ="xxx">
    <c:forEach var="map" items="${kvMap}">
        <option value=<c:out value = "${kvMap.key}" /> > <c:out value = "${kvMap.value}" /> </option>
    </c:forEach>
</select>
最后,select框中的选项顺序与表(视图)中的顺序不符。不知道问题出在了什么地方?

解决方案 »

  1.   

    因为它是map, 使用iterate来循环的.
    你用List就不会有顺序问题了.
      

  2.   

    你是不是写错了啊?c:out 里应该写 map.key,而不是 kvMap.key 吧?
      

  3.   

    回复2楼:是笔误,呵呵。回复1楼:没太明白你的意思。LinkedHashMap应该是保持元素顺序的啊。
      

  4.   

    你 SQL语句中order啊 。。普通LIST输出就好了。。
      

  5.   

    LinkedHashMap 是有序的散列 Map,迭代的顺序与 put 时的顺序是一致的,不会出现你所说的那种情况,
    你可以在 put 那句之前将从 Entity 中取出的 key 输出一下,与用 c:forEach 的顺序是一致的。
      

  6.   

            ListOrderedMap entity = (ListOrderedMap) it.next();
            System.out.println(entity.getValue(0) + " --> " + entity.getValue(1));
            kvMap.put((String) entity.getValue(0), (String) entity.getValue(1));你加一句红色的那个代码,再与 c:forEach 遍历出来的对比一下就能看出顺序是否是一致的了。如果是一致的,那问题就不在这里了。