2010-08-03 21 views
3

我有一個豆字段status。根據status值的不同,應該應用不同的CSS類來呈現它。如何用JSF和Facelets實現一些if-then邏輯?

所以,我需要(從現實的東西僞代碼很遠)是這樣的:

if status == "Approved" 
    cssClass = "green" 
if status == "Rejected" 
    cssClass = "red" 
<span class="cssClass">Some info</span> 

我試圖申請jstl,但我不能使它與小面和JSF工作(但我聽說它是可能的,也許它的真相)。以下是代碼:

<c:choose> 
    <c:when test="#{report.approved}"> 
     <c:set var="statusClass" value="approved"/> 
    </c:when> 
    <c:when test="#{report.rejected}"> 
     <c:set var="statusClass" value="rejected"/> 
    </c:when> 
    <c:when test="#{report.inProgress}"> 
     <c:set var="statusClass" value="progress"/> 
    </c:when> 
    <c:when test="#{report.pendingHR}"> 
     <c:set var="statusClass" value="pending"/> 
    </c:when> 
</c:choose> 
<span class="status ${statusClass}">#{report.formattedStatus}</span> 

JSF/Facelets應該如何處理?

回答

8

爲了給雙方(模型和視圖)的利益,而利用的enum,而不是四個獨立的布爾可能終究只會導致維修麻煩。

public enum Status { 
    APPROVED, REJECTED, PROGRESS, PENDING; 
} 

它不僅在Java方面更容易和更清晰,而且還可以在EL中打印。

<span class="#{bean.status}" /> 
+0

不檢查,toString()仍不會被大寫? – 2010-08-03 18:17:53

+0

是的,它會的。相應地更新CSS應該不是那麼多工作。 – BalusC 2010-08-03 18:21:14

1

只需將cssStatus中的屬性解析爲正確的CSS類即可。

public String getCssStatus() { 
    if(this.status == ....) 
     return "green"; 
    else 
     ... 
} 

然後

<span class="status #{report.cssStatus}">#{report.formattedStatus}</span> 

AFAIK,這應該工作。

+1

我想過但我仍然希望有更好的解決方案存在。我不想在bean中使用Java代碼綁定css類名。 – Roman 2010-08-03 16:07:29

+0

@羅曼我沒有看到這種方法有什麼問題。你不想把類名與他們的實際渲染聯繫起來,這是CSS的一個重點,但是表現邏輯決定渲染類對我來說似乎很好。無論如何,會有一些表示邏輯在某個地方根據報告的狀態選擇CSS類。只要此表示邏輯位於表示層中,就沒關係。 – ewernli 2010-08-03 16:09:28

+0

我可以想象,一個人不想讓視圖細節混亂模型。 – BalusC 2010-08-03 17:27:33

4

JSF方法通常使用h-tags上的rendered屬性。另請注意,EL(表達式語言)在JSF中非常具有表現力,因此您可以在類表達式中使用?:。例如。

<span class="status #{report.approved ? 'approved' : report.rejected ? 'rejected' : report.inProgress ? 'progress' : report.pendingHR ? 'pending' : ''}"> 
+0

Whee,StackOverflow自動將提示轉換爲代碼:) – 2010-08-03 18:16:48