我有一个从控制器传递到JSP的Player对象的列表,我想以几种不同的方式在同一页面上显示它们:
我可以在模型中放置单独的排序后的副本,但是处理显示相同列表的不同方法似乎更像是视图的责任,因此,我希望避免将逻辑放入控制器中。我已经有几个实现Comparator的类来帮助实际排序。
在JSP中执行此操作的最佳方法是什么?
我可以在将列表传递到其他forEach标签之前对其进行排序吗?
forEach
该SOEL标签维基描述的方式来做到这一点,而无需使用小脚本:使用EL函数来完成排序,然后使用该结果items在JSTL核心属性forEach标签。
items
函数类:
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>
菜单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>