2011-07-10 46 views
15

tengo una lista de jugador objetos personales pasa a una JSP desde un controlador, y quiero mostrarlas en un par de maneras diferentes en la misma página:¿Cómo puedo ordenar una lista de varias maneras diferentes en un JSP?

  • un menú ordenado por nombre
  • una lista ordenada por porcentaje de ganar/perder

Pude poner copias separadas en el modelo, pero tratar con diferentes formas de mostrar la misma lista parece más una responsabilidad de la vista, así que me gustaría evitar poner la lógica en el controlador si puedo. Ya tengo un par de clases implementando Comparator para ayudar con la clasificación real.

¿Cuál es la mejor manera de hacerlo en un JSP?

¿Puedo ordenar la lista antes de pasarla a las diferentes etiquetas forEach?

+0

¿ha considerado sólo tener una versión de la lista en el HTML/JS y dejar que el navegador del usuario lo clasifique según sus propios deseos? Creo que hay una habilidad jqueryui para hacer esto con bastante facilidad. – RHSeeger

+0

Necesito la lista que se muestra en dos lugares, pero podría ser una buena idea enumerar Jugadores y sus estadísticas en una tabla; en ese caso, probablemente usaría displaytag. –

Respuesta

16

El SO EL Tag Wiki describe una manera de hacer esto sin necesidad de utilizar un scriptlet: el uso de una función de EL que hacer por el estilo, a continuación, utilizando el resultado para el atributo items en el núcleo forEach etiqueta JSTL.

La clase de función:

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

El 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> 

El menú 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

relacionado: con respecto a la comparación de Java, recomiendo la respuesta de Apache Common (Boris ') de esa pregunta http://stackoverflow.com/questions/8036429/sorting-java-objects-using-multiple-keys –

+1

Se ha actualizado el enlace. Aquí hay una copia hecha por BalusC: http://balusc.blogspot.com/2010/01/hidden-features-of-jspservlet.html –

5

Emplee Collections.sort(List, Comparator), proporcionando su propio comparador según sea necesario para ordenar la lista en el orden correcto. La java, lo que podría ser embebido dentro de <% y %> etiquetas, sería algo como:

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

Esto funciona, ¡gracias! Una solución que no requiera un scriptlet sería mejor, pero lo haré de esta manera hasta que aprenda otra. –

+0

Puede crear subclase en las implementaciones de listas y proporcionar un interlocutor incorporado. – g051051

0

Yo recomiendo tener dos listas ordenadas en el modelo. Las listas solo contienen referencias a objetos, por lo que no es un gran problema de espacio, y personalmente no me gusta hacer ese tipo de trabajo en los JSP. Si los preselecciona, no importa cuántas veces se vea la página en navegación normal, y siempre que las listas no cambien, no tendrá que incurrir en la sobrecarga de clasificación.

+0

Sus argumentos son buenos, pero me gustaría mantener la lógica de visualización fuera del controlador a menos que haya una razón de rendimiento demostrada para romper esa parte del patrón. –

+0

Considérelo parte del modelo, no del controlador. El modelo tiene dos listas, respaldadas por los mismos datos, ordenadas de diferentes maneras. – g051051

+0

esto significa copiar profundamente una lista de objetos, no es poca cosa, o escanear la base de datos dos veces ... – NimChimpsky

Cuestiones relacionadas