简体   繁体   English

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

[英]How can I sort a List several different ways in a JSP?

I have a list of Player objects getting passed into a JSP from a controller, and I want to display them in a couple of different ways on the same page: 我有一个Player对象列表从控制器传递到JSP,我想在同一页面上以几种不同的方式显示它们:

  • a menu sorted by name 按名称排序的菜单
  • a list sorted by win/loss percentage 按赢/输百分比排序的列表

I could put separate sorted copies in the model, but dealing with different ways to display the same list seems more like a responsibility of the view, so I'd like to avoid putting the logic in the controller if I can. 我可以在模型中放置单独的排序副本,但处理显示相同列表的不同方式似乎更像是视图的责任,所以我想避免将逻辑放在控制器中,如果可以的话。 I already have a couple of classes implementing Comparator to help with the actual sorting. 我已经有几个实现Comparator的类来帮助实际排序。

What's the best way to do that in a JSP? 在JSP中执行此操作的最佳方法是什么?

Can I sort the list before passing it in to the different forEach tags? 我可以在将列表传递给不同的forEach标签之前对其进行排序吗?

The SO EL Tag Wiki describes a way to do this without using a scriptlet: using an EL function to do the sort, then using the result for the items attribute in the JSTL core forEach tag. SO EL Tag Wiki描述了一种在不使用scriptlet的情况下执行此操作的方法:使用EL函数进行排序,然后将结果用于JSTL核心forEach标记中的items属性。

The function class: 功能类:

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;
    }
}

The TLD: 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>

The menu JSP: 菜单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>

Employ Collections.sort(List, Comparator) , providing your own Comparator as required to sort the list into the right order. 使用Collections.sort(List,Comparator) ,根据需要提供您自己的Comparator,将列表排序为正确的顺序。 The java, which could be embedded within <% and %> tags, would look something like: 可以嵌入<%%>标记的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
}

I'd recommend having two sorted lists in the model. 我建议在模型中有两个排序列表。 The lists will just contain object references, so it's not a big space issue, and I personally don't like doing that sort of work in the JSPs. 这些列表只包含对象引用,所以它不是一个很大的空间问题,我个人不喜欢在JSP中做那种工作。 If you presort them, it doesn't matter how many times the page is viewed in normal navigation, and as long as the lists don't change, you won't have to incur the sort overhead. 如果您预先分配它们,在正常导航中查看页面的次数并不重要,只要列表不更改,您就不必承担排序开销。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM