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



在我的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上做到这一点——如果你真的必须这样做的话——而这并不是。但是,也许这对其他和我处于相同位置的人来说是一个很好的选择。)

最新更新