如何在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

" class="menuItem">${player.alias}

使用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中做那种工作。 如果您预先分配它们,在正常导航中查看页面的次数并不重要,只要列表不更改,您就不必承担排序开销。