2015-02-23 61 views
1

在我的jsp(标签)文件中,如果对象实现特定类(Orderable),我需要按不同顺序显示对象列表。如何确定列表中的对象是否使用JSTL实现类使用JSTL

显示部分是好的,我只是无法弄清楚如何确定对象是否实现我的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

您可能不应该在JSP中执行此操作。在您的servlet中执行并将其公开给JSP。 – 2015-02-23 18:04:06

+0

同意,但这是传统代码。这是* many * jsp's使用的标签文件。我的手相当结合。 – LimaNightHawk 2015-02-23 18:27:06

回答

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> 

然而,随着索蒂里奥斯Delimanolis和罗宾·安德森说,这是一个非常混乱和应该被移动到更合适的层。

+0

虽然我没有使用它,但我将其标记为正确的答案。这是所问问题的最佳答案。谢谢。 – LimaNightHawk 2015-02-24 13:34:28

0

像索蒂里奥斯Delimanolis说,这是不适合的JSP来处理。将它向下移动一层。

任何方式,我什至不知道有可能检查一个对象是否实现给定的接口。我能想到的唯一解决方案是检查对象的实际类别,并可能以这种方式解决问题。

<c:set var="isOrderable" value="${items[0].getClass().name == 'OrderableImpl'}" /> 

(注意,这需要至少Tomcat的7用JSP EL 2.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上使用一些相当“杂乱”的代码(per @obourgain),或者使用Java进行更简洁的实现。我不会把这个标记为所选择的答案,因为问题是如何在jsp上使用jstl来做到这一点 - 如果你真的必须这样做 - 但这不是。但是,也许这是一个很好的替代别人处于与我处于同一位置的人)