Как я могу отсортировать список несколькими различными способами в JSP? - PullRequest
16 голосов
/ 10 июля 2011

У меня есть список объектов Player, передаваемых в JSP из контроллера, и я хочу отобразить их несколькими способами на одной странице:

  • меню, отсортированное по имени
  • список, отсортированный по процентам выигрыша / проигрыша

Я мог бы поместить отдельные отсортированные копии в модель, но работа с различными способами отображения одного и того же списка выглядит скорее как ответственностьпосмотрим, так что я бы хотел избежать использования логики в контроллере, если смогу.У меня уже есть пара классов, реализующих Comparator, чтобы помочь с реальной сортировкой.

Какой лучший способ сделать это в JSP?

Можно ли отсортировать список перед передачей его вразные forEach метки?

Ответы [ 3 ]

17 голосов
/ 11 июля 2011

Вики SO EL Wiki описывает способ сделать это без использования скриптлета: использование функции EL для сортировки, затем использование результата для атрибута items в ядре JSTL forEach tag.

Класс функций:

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

ДВУ:

<?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>
5 голосов
/ 10 июля 2011

Employ Collections.sort (List, Comparator) , предоставляя ваш собственный 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
}
0 голосов
/ 10 июля 2011

Я бы рекомендовал иметь два отсортированных списка в модели.Списки будут просто содержать ссылки на объекты, так что это не большая проблема с пространством, и мне лично не нравится делать такую ​​работу в JSP.Если вы предварительно сортируете их, не имеет значения, сколько раз страница просматривается при обычной навигации, и пока списки не меняются, вам не придется нести накладные расходы на сортировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...