如何在JSP中以几种不同的方式对List进行排序?
我有一个Player对象列表从控制器传递到JSP,我想在同一页面上以几种不同的方式显示它们:
- 按名称排序的菜单
- 按赢/输百分比排序的列表
我可以在模型中放置单独的排序副本,但是处理显示相同列表的不同方式似乎更像是视图的责任,所以如果可以的话,我想避免将逻辑放在控制器中。 我已经有几个实现Comparator的类来帮助实际排序。
在JSP中执行此操作的最佳方法是什么?
我可以在将列表传递给不同的forEach
标签之前对其进行排序吗?
SO EL Tag Wiki描述了一种在不使用scriptlet的情况下执行此操作的方法:使用EL函数进行排序,然后将结果用于JSTL核心forEach
标记中的items
属性。
function类:
package org.hierax.ifdl.tags.player; public final class PlayerSort { public static List sortByRank(List playerList) { Collections.sort(playerList, new PlayerSortByRank()); return playerList; } public static List sortByAlias(List playerList) { Collections.sort(playerList, new PlayerSortByAlias()); return playerList; } }
TLD:
Player Functions 1.0 player org.hierax.ifdl.tags sortByRank org.hierax.ifdl.tags.player.PlayerSort java.util.List sortByRank(java.util.List) sortByAlias org.hierax.ifdl.tags.player.PlayerSort java.util.List sortByAlias(java.util.List)
菜单JSP:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="p" uri="/WEB-INF/player.tld" %> Players
使用Collections.sort(List,Comparator) ,根据需要提供您自己的Comparator,将列表排序为正确的顺序。 可以嵌入<%
和%>
标记的java看起来像:
List list = new ArrayList (); list.add(new Player()); // populate list list.add(new Player()); // etc Collections.sort(list, new Comparator () { 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 }
我建议在模型中有两个排序列表。 这些列表只包含对象引用,所以它不是一个很大的空间问题,我个人不喜欢在JSP中做那种工作。 如果您预先分配它们,在正常导航中查看页面的次数并不重要,只要列表不更改,您就不必承担排序开销。