2011-07-10 18 views
15

Mam lista odtwarzacza obiektów uzyskiwanie przekazywane do JSP z kontrolera i chcę, aby wyświetlić je na kilka różnych sposobów na tej samej stronie:Jak mogę posortować listę na kilka sposobów na stronie JSP?

  • menu sortowane według nazwy
  • lista posortowana według procentu wygrana/strata

mogę umieścić osobne kopie posortowane w modelu, ale chodzi o różne sposoby wyświetlania tej samej listy wydaje się bardziej jak odpowiedzialność widzenia, więc chciałbym, aby uniknąć wprowadzenia logika w kontrolerze, jeśli mogę. Mam już kilka klas implementujących Komparator, aby pomóc w rzeczywistym sortowaniu.

Jaki jest najlepszy sposób na zrobienie tego w JSP?

Czy mogę posortować listę przed przekazaniem jej do różnych tagów forEach?

+0

Czy bierzesz pod uwagę tylko o jedną wersję listy w HTML/JS i pozwolić przeglądarce użytkownika sortować ją zgodnie z własnymi życzeniami? Wierzę, że istnieje zdolność jqueryui do robienia tego dość łatwo. – RHSeeger

+0

Potrzebuję listy wyświetlanej w dwóch miejscach, ale dobrym pomysłem może być lista graczy i ich statystyki w tabeli; w takim przypadku prawdopodobnie użyłbym displaytag. –

Odpowiedz

16

SO EL Tag Wiki opisuje sposób to zrobić bez użycia scriptlet: przy użyciu funkcji EL zrobić sortowania, a następnie za pomocą rezultat atrybutu w rdzeniu JSTL forEach tagu items.

Klasa funkcja:

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> 

Menu 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> 
+0

powiązane: w odniesieniu do porównania Java, polecam odpowiedź Apache'a Common (Boris) na to pytanie http://stackoverflow.com/questions/8036429/sorting-java-objects-using-multiple-keys –

+1

Zaktualizowano link. Oto kopia wykonana przez BalusC: http://balusc.blogspot.com/2010/01/hidden-features-of-jspservlet.html –

5

Zatrudniaj Collections.sort(List, Comparator), dostarczając własny komparator zgodnie z wymaganiami, aby posortować listę we właściwej kolejności. Java, które mogą być osadzone w <% i %> tagów, by wyglądać tak:

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

To działa, dziękuję! Rozwiązanie, które nie wymaga skryptletu byłoby lepsze, ale zrobię to w ten sposób, dopóki nie nauczę się innego. –

+0

Możesz podklasę na implementacji list i zapewnić wbudowany comapartor. – g051051

0

polecam posiadanie dwóch posortowanych list w modelu. Listy będą zawierały jedynie odniesienia do obiektów, więc nie jest to duży problem z przestrzenią kosmiczną, a ja osobiście nie lubię robić tego rodzaju prac na stronach JSP. Jeśli je przetestujesz, nie ma znaczenia, ile razy strona jest wyświetlana w normalnej nawigacji i dopóki lista się nie zmieni, nie będziesz musiał ponosić kosztów sortowania.

+0

Twoje argumenty są dobre, ale chciałbym zachować logikę wyświetlania poza sterownikiem, chyba że istnieje demonstracyjny powód, by złamać tę część wzorca. –

+0

Należy wziąć pod uwagę część modelu, a nie kontroler. Model ma dwie listy, poparte tymi samymi danymi, posortowane na różne sposoby. – g051051

+0

oznacza to głębokie kopiowanie listy twoich obiektów, bezmyślny wyczyn lub skanowanie bazy danych dwa razy ... – NimChimpsky

Powiązane problemy