0
<h:dataTable cellpadding="0" cellspacing="0"
    styleClass="list_table" id="OuterItems"
    value="#{valueList.values}" var="item" border="0">
    <h:column rendered="#{item.typeA}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.options}" var="option" border="0">
            <h:column >
                <h:outputText value="Option: #{option.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>
    <h:column rendered="#{item.typeB}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.demands}" var="demand" border="0">
            <h:column >
                <h:outputText value="Demand: #{demand.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>
</h:dataTable>

public class Item{
    ...
    public boolean isTypeA(){
        return this instanceof TypeA;
    }

    public boolean isTypeB(){
        return this instanceof TypeB;
    }
    ...

}

public class typeA extends Item(){
    ...
    public List getOptions(){
        ....
    }
    ...
}

public class typeB extends Item(){
    ...
    public List getDemands(){
        ...
    }
    ....
}

我遇到了 JSF 的问题。我已经把问题抽象出来了,我希望有人能帮助我理解我正在做的事情是如何失败的。我正在遍历项目列表。这些项目实际上是子类 TypeA 和 TypeB 的实例。对于 A 类,我要显示选项,对于 BI 类,我要显示需求。第一次渲染页面时,这工作正常。但是,当我发回页面以执行某些操作时,出现错误:

[3/26/10 12:52:32:781 EST] 0000008c SystemErr     R   javax.faces.FacesException: Error getting property 'options' from bean of type TypeB
    at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:89)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java(Compiled Code))
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:91)
    at com.ibm.faces.portlet.FacesPortlet.processAction(FacesPortlet.java:193)

我对 JSF 生命周期的把握非常粗略。在这一点上,我知道 ApplyRequestValues 阶段中有一个错误,这是非常早的,因此之前的状态被恢复并且没有任何变化。

我不明白的是,为了满足渲染“item.typeA”的条件,该对象必须是 TypeA 的实例。但是在这里,看起来该对象通过了条件,即使它是 TypeB 的实例。就像在评估外部(outerItems)之前评估内部数据表(InnerItems)一样。我的工作假设是,我只是不了解实际评估渲染属性的方式/时间。

4

2 回答 2

2
 <h:column rendered="#{item.typeA}">
        <h:dataTable cellpadding="0" cellspacing="0"
        styleClass="list_table" id="InnerItems"
        value="#{item.options}" var="option" border="0"
        rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
            <h:column >
                <h:outputText value="Option: #{option.displayValue}"/>
            </h:column>
        </h:dataTable>
    </h:column>

在我数小时的猜测/寻蛋迭代中,我没有想到将渲染条件直接添加到数据表中(我真的很绝望)。我仍然不明白为什么这首先不起作用,但它正在起作用。

于 2010-03-26T22:08:32.960 回答
0

我知道这是一篇旧文章,但是...如果您仍然想知道为什么它在您的第一个片段中不起作用,可能是因为您缺少右花括号:

<h:column rendered="#{item.typeA">
<h:column rendered="#{item.typeB">

当您将渲染条件放在数据表上时,这已正确设置。

rendered="#{item.typeA}"> <!--  THIS IS THE CHANGE -->
于 2012-02-01T16:44:04.630 回答