Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JSP中以几种不同的方式对列表排序?_Java_Jsp_Sorting - Fatal编程技术网

Java 如何在JSP中以几种不同的方式对列表排序?

Java 如何在JSP中以几种不同的方式对列表排序?,java,jsp,sorting,Java,Jsp,Sorting,我有一个从控制器传递到JSP的播放器对象列表,我想在同一页面上以两种不同的方式显示它们: 按名称排序的菜单 按赢/输百分比排序的列表 我可以在模型中放置单独的已排序副本,但是处理显示相同列表的不同方式似乎更像是视图的责任,因此如果可以,我希望避免将逻辑放入控制器中。我已经有几个类实现了Comparator来帮助实际排序 在JSP中实现这一点的最佳方法是什么 在将列表传递到不同的forEach标记之前,我可以对列表进行排序吗?根据需要提供自己的比较器,以将列表排序到正确的顺序。可以嵌入标记中的

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

  • 按名称排序的菜单
  • 按赢/输百分比排序的列表
我可以在模型中放置单独的已排序副本,但是处理显示相同列表的不同方式似乎更像是视图的责任,因此如果可以,我希望避免将逻辑放入控制器中。我已经有几个类实现了Comparator来帮助实际排序

在JSP中实现这一点的最佳方法是什么

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

根据需要提供自己的比较器,以将列表排序到正确的顺序。可以嵌入
标记中的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
}
List List=new ArrayList();
列表。添加(新播放器());//填充列表
列表。添加(新播放器());//等
Collections.sort(list,newcomparator(){
公共整数比较(玩家o1,玩家o2)
{
返回o1.getName().compareTo(o2.getName());//例如,按名称进行比较
}});
//现在列表上的迭代将按“名称”顺序进行
用于(玩家:列表){
//显示播放器
}

我建议在模型中有两个排序列表。列表将只包含对象引用,所以这不是一个大的空间问题,我个人不喜欢在JSP中做这种工作。如果您对它们进行预排序,则无论页面在正常导航中被浏览多少次,只要列表不变,您就不必承担排序开销。

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

函数类:

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;
    }
}
package org.hierax.ifdl.tags.player;
公开决赛选手体育{
公共静态列表排序数据库(列表播放列表){
Collections.sort(playerList,newplayersortbyrank());
返回玩家列表;
}
公共静态列表sortByAlias(列表播放列表){
Collections.sort(playerList,newplayersortbyalias());
返回玩家列表;
}
}
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>

播放器功能
1
运动员
org.hierax.ifdl.tags
垃圾桶
org.hierax.ifdl.tags.player.PlayerSort
java.util.List sortByRank(java.util.List)
索特比里亚
org.hierax.ifdl.tags.player.PlayerSort
java.util.List sortByAlias(java.util.List)
菜单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>

球员


您是否考虑过在HTML/JS中只使用一个版本的列表,并让用户的浏览器根据自己的意愿对其进行排序?我相信jqueryui有能力很容易做到这一点。我确实需要在两个地方显示列表,但在一个表格中列出球员及其统计数据可能是个好主意;在这种情况下,我可能会使用displaytag。这很有效,谢谢!一个不需要scriptlet的解决方案会更好,但我会这样做,直到我学会另一个。你可以对列表实现的子类化,并提供一个内置的comapartor。你的参数很好,但是我希望把显示逻辑放在控制器之外,除非有明显的性能原因来打破这种模式的一部分。把它看作模型的一部分,而不是控制器。该模型有两个列表,由相同的数据支持,以不同的方式排序。这意味着深入复制对象列表,这并不意味着壮举,或者扫描数据库两次……为什么?一旦你得到结果,你就有了一堆对象。只需将它们全部添加到另一个列表中,并根据您的喜好使用该列表。对象都是相同的。为什么要两次返回DB?相关:关于Java比较,我建议Apache Common对该问题的回答(Boris)更新链接。这是BalusC制作的副本: