2011-02-23 57 views
1

我有一個JSP portlet,它需要根據bean的屬性的值,其是枚舉類型使用<c:when>用枚舉

public enum State { 
    CANCELED, COMPLETED 
} 

我用下面的代碼來執行所述開關的顯示不同的標記

<c:choose> 
    <c:when test="#{item.state == 'COMPLETED'}"> 
     <img src="ok.gif" /> 
    </c:when> 
    <c:when test="#{item.state == 'CANCELED'}"> 
     <img src="ko.gif" /> 
    </c:when> 
</c:choose> 

但它不起作用。有趣的是,它在兩種情況下都返回false。項目對象(在ICEFaces數據表內)是一個具有State getter + setter屬性的後臺bean。 我被告知要將枚舉與字符串進行比較,並使用==運算符,但也許這不是方法。

所以,我的問題是:我如何使用&lt;c:when&gt;標記比較屬性和枚舉值?

回答

4

... 項目目標(的ICEFaces的數據表內) ...

然後JSTL確實不起作用。它在視圖生成時間內運行,而不是在視圖生成時間內運行。基本上,您可以按如下方式對其進行可視化:JSTL首先從上到下運行,然後將生成的包含JSF標記的結果僅傳遞給JSF,而後者又從上到下運行。在目前JSTL遇到迭代的JSF數據表#{item},它是null,因此它總是會遺漏false,並且JSF將從JSTL中檢索那些圖像。

您想改爲使用JSF標籤。我建議<h:graphicImage>結合rendered屬性。

<h:graphicImage value="ok.gif" rendered="#{item.state == 'COMPLETED'}" /> 
<h:graphicImage value="ko.gif" rendered="#{item.state == 'CANCELED'}" /> 
1

也許這只是我,但我不喜歡在jsp標記中進行字符串比較。相反,我會提供比較方法如下所示:

public boolean isStateCompleted() 
{ 
    return State.COMPLETED.equals(state); 
} 

public boolean isStateCanceled() 
{ 
    return State.CANCELED.equals(state); 
}

而且我會引用它們在jsp或者如下:

<c:choose> 
    <c:when test="#{item.stateCompleted}"> 
     <img src="ok.gif" /> 
    </c:when> 
    <c:when test="#{item.stateCanceled}"> 
     <img src="ko.gif" /> 
    </c:when> 
</c:choose>

或像這樣:

<h:graphicImage value="ok.gif" rendered="#{item.stateCompleted}" /> 
<h:graphicImage value="ko.gif" rendered="#{item.stateCanceled}" />