在我的jsp(tag)文件中,如果对象实现了特定的类(Orderable
),我需要以不同的顺序显示对象列表。
显示部分很好,我只是无法弄清楚如何确定对象是否实现了我的Orderable类。
我需要帮助:
<c:set var="isOrderable" value="${items[0] implements 'Orderable'}" />
所以这可行:
<c:choose>
<c:when test="${isOrderable}" >
<sorter:sortByProperty items="${items}" var="items" property="ordinal"/>
</c:when>
<c:otherwise>
<sorter:sortByProperty items="${items}" var="items" property="name"/>
</c:otherwise>
</c:choose>
答案 0 :(得分:0)
无论如何,我甚至不确定是否有可能检查对象是否实现了给定的接口。我能想到的唯一解决方案是检查对象的实际类,并可能以这种方式计算出来。
实施例
<c:set var="isOrderable" value="${items[0].getClass().name == 'OrderableImpl'}" />
(请注意,这至少需要使用JSP EL 2.2的Tomcat 7)
答案 1 :(得分:0)
您可以使用Class.getInterfaces()列出对象实现的接口。
这可以在JSP中使用:
<c:set var="isComparable" value="false" />
<c:forEach var="interface" items="${yourobject.class.interfaces}">
<c:if test="${interface.name eq 'java.lang.Comparable'}">
<c:set var="isComparable" value="true" />
</c:if>
</c:forEach>
然而,正如Sotirios Delimanolis和Robin Jonsson所说,这是一个非常混乱,应该真的转移到一个更合适的层。
答案 2 :(得分:0)
看起来没有办法干净利落地做到这一点。由于我不能事先做到这一点,我选择使用另一个自定义标记来确定对象是否继承该类:
添加了此自定义标记:
<sorter:isOrderable items="${items}" var="isOrderable" />
这样可行:
<c:choose>
<c:when test="${isOrderable}" >
<sorter:sortByProperty items="${items}" var="items" property="ordinal"/>
</c:when>
<c:otherwise>
<sorter:sortByProperty items="${items}" var="items" property="name"/>
</c:otherwise>
</c:choose>
这是实际检查的java标记文件:
public class IsOrderableTag extends TagSupport {
private static final long serialVersionUID = -842326085194300052L;
private String var;
private Collection<?> items;
@Override
public int doStartTag() throws JspException {
boolean isOrderable = false;
if (items != null && !items.isEmpty()) {
Object firstItem = items.iterator().next();
isOrderable = firstItem instanceof Orderable;
}
pageContext.setAttribute(var, isOrderable);
return SKIP_BODY;
}
//... getters and setters
}
一开始看起来有点矫枉过正,但对我来说,我会在jsp上使用一些非常“杂乱”的代码(每个@obourgain),或者使用Java进行更清晰的实现。
(我不是把这个标记为选择的答案,因为问题是如何使用jstl在jsp上执行此操作 - 如果你真的必须这样做 - 而且这不是。但是,也许这是一个很好的选择对于我在同一位置的其他人。)