如何在JSP中以几种不同的方式对List进行排序?

时间:2011-07-10 01:12:55

标签: java jsp sorting

我有一个从控制器传递到JSP的Player对象列表,我想在同一页面上以几种不同的方式显示它们:

  • 按名称排序的菜单
  • 按赢额/损失百分比排序的列表

我可以在模型中放置单独的排序副本,但处理显示相同列表的不同方式似乎更像是视图的责任,所以如果可以的话,我想避免将逻辑放在控制器中。我已经有几个实现Comparator的类来帮助实际排序。

在JSP中执行此操作的最佳方法是什么?

我可以在将列表传递到不同的forEach标签之前对其进行排序吗?

3 个答案:

答案 0 :(得分:17)

SO EL Tag Wiki描述了一种不使用scriptlet的方法:使用EL函数进行排序,然后使用JSTL核心items属性的结果forEach标签

功能类:

package org.hierax.ifdl.tags.player;

public final class PlayerSort {
    public static List<Player> sortByRank(List<Player> playerList) {
        Collections.sort(playerList, new PlayerSortByRank());
        return playerList;
    }

    public static List<Player> sortByAlias(List<Player> playerList) {
        Collections.sort(playerList, new PlayerSortByAlias());
        return playerList;
    }
}

TLD:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">

    <display-name>Player Functions</display-name>
    <tlib-version>1.0</tlib-version>
    <short-name>player</short-name>
    <uri>org.hierax.ifdl.tags</uri>

    <function>
        <name>sortByRank</name>
        <function-class>org.hierax.ifdl.tags.player.PlayerSort</function-class>
        <function-signature>java.util.List sortByRank(java.util.List)</function-signature>
    </function>

    <function>
        <name>sortByAlias</name>
        <function-class>org.hierax.ifdl.tags.player.PlayerSort</function-class>
        <function-signature>java.util.List sortByAlias(java.util.List)</function-signature>
    </function>

</taglib>

菜单JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="p" uri="/WEB-INF/player.tld" %>

<h1>Players</h1>
<p>
    <c:forEach items="${p:sortByAlias(model.players)}" var="player">
        <a href="<c:url value="/player/${player.id}"/>" class="menuItem">${player.alias}</a>
    </c:forEach>
</p>

答案 1 :(得分:5)

使用Collections.sort(List, Comparator),根据需要提供您自己的比较器,将列表排序为正确的顺序。可以嵌入<%%>标记的java看起来像:

List<Player> list = new ArrayList<Player>();
list.add(new Player()); // populate list
list.add(new Player()); // etc
Collections.sort(list, new Comparator<Player>() {
    public int compare(Player o1, Player o2)
    {
        return o1.getName().compareTo(o2.getName()); // Compare by name, for example
    }});

// Now iterations on list will be in 'name' order
for (Player player : list) {
    // Display player
}

答案 2 :(得分:0)

我建议在模型中有两个排序列表。这些列表只包含对象引用,所以它不是一个很大的空间问题,我个人不喜欢在JSP中做那种工作。如果你预先分配它们,在正常导航中查看页面的次数并不重要,只要列表没有改变,你就不必承担排序开销。