在我的jsp(标记)文件中,如果对象实现特定的类(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>
您可以列出对象使用class.getInterface().实现的接口
这可以在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所说,这是一个非常混乱的层,应该转移到一个更合适的层。
正如Sotirios Delimanolis所说,这不适合JSP处理。向下移动一层。
无论如何,我甚至不确定是否有可能检查对象是否实现了给定的接口。我能想到的唯一解决方案是检查对象的实际类,也许可以这样解决。
示例
<c:set var="isOrderable" value="${items[0].getClass().name == 'OrderableImpl'}" />
(请注意,这至少需要Tomcat 7和JSP EL 2.2)
看起来没有办法做到这一点。由于我无法提前完成,我选择制作另一个自定义标记来确定对象是否继承类:
添加了这个自定义标签:
<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上有一些相当"混乱"的代码(根据@oburgain),或者用Java实现更干净的代码。
(我并没有把它标记为选择的答案,因为问题是如何用jstl在jsp上做到这一点——如果你真的必须这样做的话——而这并不是。但是,也许这对其他和我处于相同位置的人来说是一个很好的选择。)