如何在 JSP 中以几种不同的方式对列表进行排序?
我有一个从控制器传递到JSP中的Player对象列表,我想在同一页面上以几种不同的方式显示它们:
- 按名称排序的菜单
- 按赢/输百分比排序的列表
我可以在模型中放置单独的排序副本,但是处理显示同一列表的不同方式似乎更像是视图的责任,因此如果可以的话,我想避免将逻辑放在控制器中。我已经有几个类实现比较器来帮助实际排序。
在 JSP 中执行此操作的最佳方法是什么?
是否可以在将列表传递到不同的标记之前对列表进行排序?forEach
我有一个从控制器传递到JSP中的Player对象列表,我想在同一页面上以几种不同的方式显示它们:
我可以在模型中放置单独的排序副本,但是处理显示同一列表的不同方式似乎更像是视图的责任,因此如果可以的话,我想避免将逻辑放在控制器中。我已经有几个类实现比较器来帮助实际排序。
在 JSP 中执行此操作的最佳方法是什么?
是否可以在将列表传递到不同的标记之前对列表进行排序?forEach
SO EL Tag Wiki 描述了一种不使用 scriptlet 的方法:使用 EL 函数进行排序,然后在 JSTL 核心标签中使用属性的结果。items
forEach
函数类:
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>
使用 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
}