如何确定列表中的对象是否使用JSTL实现了一个类

时间:2015-02-23 18:03:11

标签: java jstl

在我的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>

3 个答案:

答案 0 :(得分:0)

像Sotirios Delimanolis所说,这不适合JSP来处理。将它向下移动一层。

无论如何,我甚至不确定是否有可能检查对象是否实现了给定的接口。我能想到的唯一解决方案是检查对象的实际类,并可能以这种方式计算出来。

实施例

<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上执行此操作 - 如果你真的必须这样做 - 而且这不是。但是,也许这是一个很好的选择对于我在同一位置的其他人。)