jsf - c :when and c:if don't work

标签 jsf jstl

我可以从我的 JSF2 页面访问存储在支持 bean 中的变量,所以像

<h:outputText value="#{myBean.myValue}"/>

工作,并且值(这是 int 顺便说一句。)打印正常。
但是,当尝试在 c:if 和/或 c:when 标记中的条件表达式中使用此值时,它永远不会等于任何东西......所以:
<c:if test="#{myBean.myValue == 1}">
    <c:set var="myVar" value="true"/>
</c:if>

<c:choose>
    <c:when test="#{myBean.myValue > 1}">
        <c:set var="myVar" value="true"/>
    </c:when>
</c:choose>

甚至
#{myBean.myValue eq '1'} 

或者
#{myBean.myValue == '1'}

永远不会评估为真,即使该值确实是 1 或 >1。

令人讨厌的是, 中的比较有效。渲染 标签的属性!所以这:
<h:outputText value="whatever" rendered="#{myBean.myValue == 1}"/>

很好!

到底是怎么回事?

更新:

这有效:
public int getMyValue() {
    return 1;
}

但这不会:
@Column(name = "orderstatus")
public int getOrderStatus() {
return orderStatus;
}

int 的值打印正确,但 1 == 1 为假。

实体 bean 是否以特殊方式处理?我可以使用它们在 UI 上显示它们的值(value)吗?

更新2:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>

打印 java.lang.Integer。

更新3:

这是完整的代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:cc="http://java.sun.com/jsf/composite">
    <cc:interface>
        <cc:attribute name="orderStatus" required="true"/>
    </cc:interface>
    <cc:implementation>
        <c:choose>
            <c:when test="#{cc.attrs.orderStatus == 1}" >
                <c:set var="unknownStatus" value="false"/>
            </c:when>
            <c:when test="#{cc.attrs.orderStatus == 2}" >
                <c:set var="unknownStatus" value="false"/>
            </c:when>
            <c:when test="#{cc.attrs.orderStatus == 3}" >
                <c:set var="unknownStatus" value="false"/>
            </c:when>
            <c:when test="#{cc.attrs.orderStatus == 99}" >
                <c:set var="unknownStatus" value="false"/>
            </c:when>
            <c:otherwise>
                <c:set var="unknownStatus" value="true"/>
            </c:otherwise>
        </c:choose>
        <h:graphicImage url="#{resource['img/icons/flag_yellow.png']}" rendered="#{cc.attrs.orderStatus == 1}"/>
        <h:outputText value="Created" rendered="#{cc.attrs.orderStatus == 1}"/>
        <h:graphicImage url="#{resource['img/icons/flag_orange.png']}" rendered="#{cc.attrs.orderStatus == 2}"/>
        <h:outputText value="Stopped" rendered="#{cc.attrs.orderStatus == 2}"/>
        <h:graphicImage url="#{resource['img/icons/flag_green.png']}" rendered="#{cc.attrs.orderStatus == 3}"/>
        <h:outputText value="Active" rendered="#{cc.attrs.orderStatus == 3}"/>
        <h:graphicImage url="#{resource['img/icons/flag_red.png']}" rendered="#{cc.attrs.orderStatus == 99}"/>
        <h:outputText value="Failed" rendered="#{cc.attrs.orderStatus == 99}"/>
        <h:graphicImage url="#{resource['img/icons/question_mark.png']}" rendered="#{unknownStatus}"/>
        <h:outputText value="Unknown" rendered="#{unknownStatus}"/>
    </cc:implementation>
</html>

它在使用 int 值调用时起作用。但这不起作用:
    <p:dataTable value="#{cc.attrs.orders}" var="order">
        <p:column>
            <f:facet name="header">
                <h:outputText value="Status"/>
            </f:facet>
            <mytag:orderStatus orderStatus="#{order.adcOrderStatus.orderStatus}"/>
        </p:column>
    </p:dataTable>

这将显示正确的值:
<h:outputText value="#{order.adcOrderStatus.orderStatus.class}"/>

最佳答案

<c:if test="#{myBean.myValue == 1}">

在 JSF2 之前,这些类似 JSTL 的 Facelets 标记仅在树创建时进行评估 (ref)。

JSF2 doc for c:if没有提到这一点,我知道这两个 Facelets 版本不兼容(这肯定在规范中),我不清楚在这种情况下“已处理”是什么意思。可能值得仔细阅读规范,看看它是否更详细地描述了行为,检查你的 component tree 中的内容。在运行时并在 View 创建时检查您的对象状态。

关于jsf - c :when and c:if don't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3361613/

相关文章:

html - 什么时候应该使用 JSF 组件,什么时候应该使用 html 标签?

javax.el.E​​LException : java. lang.NullPointerException

java - 在 Java Server Faces 中将托管属性与 CommandButton 一起使用

java - 如何从JSP文件中的对象中提取每个字段?

java - 无法在任何浏览器选项卡上显示网站图标

jsf - PrimeFaces:将选定的值传递给自动编译方法(请求范围)

java - 如何在 JSF (Primefaces) 中以编程方式设置咆哮生命周期?

javascript - 未捕获的语法错误 : Invalid or unexpected token when adding parameter to a javascript method in jSTL

java - JSTL数据库连接提示

java - JSP/JSTL 中的嵌套表达式