如何在JSF和Facelets中实现一些if-then逻辑?

3

我有一个带有字段status的bean。根据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
为了让模型和视图双方都受益,最好使用一个枚举类型,而不是四个独立的布尔变量,这样可能会导致维护问题。
public enum Status {
    APPROVED, REJECTED, PROGRESS, PENDING;
}

这不仅在Java端处理起来更加容易和清洁,而且你还可以直接在EL中打印它。
<span class="#{bean.status}" />

不检查的话,toString() 还是大写的吗? - Thorbjørn Ravn Andersen
是的,会的。更新CSS应该不需要太多工作。 - BalusC

4
JSF方法通常使用h标签上的rendered属性。还要注意,在JSF中,EL(表达式语言)非常表达力,因此您可以在类表达式中使用?:。例如:
<span class="status #{report.approved ? 'approved' : report.rejected ? 'rejected' : report.inProgress ? 'progress' : report.pendingHR ? 'pending' : ''}">

哇,StackOverflow自动将提示转换为代码 :) - Thorbjørn Ravn Andersen

1

只需将cssStatus作为后端Bean中的属性,解析为正确的CSS类即可。

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

然后

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

据我所知,这应该可以工作。

1
我考虑过,但我仍然希望存在更好的解决方案。我不想将CSS类名与bean中的Java代码绑定在一起。 - Roman
@Roman,我认为这种方法没有任何问题。您不希望将类名与其实际呈现绑定在一起,这就是CSS的作用,但是让演示逻辑决定要呈现的类对我来说似乎很好。无论如何,都会有某些演示逻辑在某个地方根据报告状态选择CSS类。只要此演示逻辑位于演示层中,就可以了。 - ewernli
我可以想象,人们不希望在模型中添加视图细节。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接