2015-02-23 27 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來做到這一點 - 如果你真的必須這樣做 - 但這不是。但是,也許這是一個很好的替代別人處於與我處於同一位置的人)