Как реализовать некоторую логику if-then с JSF и Facelets? - PullRequest
3 голосов
/ 03 августа 2010

У меня есть бин с полем status. В зависимости от значения status для его визуализации должен применяться другой класс css.

Итак, мне нужно что-то вроде этого (очень далеко от псевдокода реальных вещей):

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

Я пытался применить jstl, но я не могу заставить его работать с facelets и 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?

Ответы [ 3 ]

8 голосов
/ 03 августа 2010

Чтобы дать обеим сторонам (модели и виду) преимущество, вместо этого используйте enum вместо четырех независимых логических значений, которые могут в конечном итоге привести только к проблемам с обслуживанием.

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

Этоне только намного проще и понятнее работать на стороне Java, но вы также можете просто напечатать его в EL.

<span class="#{bean.status}" />
4 голосов
/ 03 августа 2010

Подход JSF обычно использует атрибут rendered в h-тегах.Также обратите внимание, что EL (язык выражений) довольно выразителен в JSF, поэтому вы можете использовать ?: в выражении вашего класса.Например,

<span class="status #{report.approved ? 'approved' : report.rejected ? 'rejected' : report.inProgress ? 'progress' : report.pendingHR ? 'pending' : ''}">
1 голос
/ 03 августа 2010

Просто сделайте cssStatus свойствами в базовом компоненте, которые разрешены в правильный класс CSS.

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

А потом

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

AFAIK, это должно работать.

...