Java 如何在单个数据表中显示来自不同对象类型的不同值?

Java 如何在单个数据表中显示来自不同对象类型的不同值?,java,jsf,facelets,java-ee-6,Java,Jsf,Facelets,Java Ee 6,我有一个对象(票证),它有一个其他对象(消息)的列表。消息是抽象的,有几个子类,如EditMessage、CreationMessage等。因此,Ticket对象包含这些消息的混合,并且它们按创建时间排序 现在我想在Facelets页面中显示所有这些消息,并且我需要输出特定于该消息类型的字段值:即EditMessage中的editedField,CreationMessage中的userName 最明显的方法似乎是使用h:dataTable: <h:dataTable value="#{t

我有一个对象(票证),它有一个其他对象(消息)的列表。消息是抽象的,有几个子类,如EditMessage、CreationMessage等。因此,Ticket对象包含这些消息的混合,并且它们按创建时间排序

现在我想在Facelets页面中显示所有这些消息,并且我需要输出特定于该消息类型的字段值:即EditMessage中的editedField,CreationMessage中的userName

最明显的方法似乎是使用h:dataTable:

<h:dataTable value="#{ticketController.ticket.messages}" var="msg" >
    // determine type of message, cast, and use <c:if> to output needed values
</h:dataTable>

//确定消息类型、强制转换和用于输出所需值
问题是Facelets表达式语言没有“instanceof”和强制转换。就我所见,这可以通过使用一些丑陋的到托管bean的往返来解决,确定标准Java中的消息类型,返回所需类型的消息。。。等等

有没有更好、更易懂、更简洁的方法


解决方案

我的主要问题是标签。事实证明,它是一个JSTL标记,因此它的呈现生命周期略有不同。我现在使用和它的“rendered”属性来代替它

一些代码:

<h:dataTable value="#{ticketController.ticket.messages}" var="msg" >
    <h:column>
        <h:panelGroup rendered="#{msg.class.name == 'org.rogach.tsnt.TextMessage'}" >
            <h:outputText value="msg.text" />
        </h:panelGroup>
        <h:outputText value="#{msg.creationTime}" />
    </h:column>
</h:dataTable>


而且不需要强制转换。

比较对象类的名称,而不是实例。
说:
或c:选择

而且你也不需要在EL身上施法。如果该对象没有您指定的某些属性,它将给出一个异常,如果它有,它就可以了。

这正是我现在正在研究的。所以我也对答案感兴趣。JSTL在JSF视图构建期间运行。基本上,JSTL产生JSF。这不仅仅是“略有不同”。在呈现响应期间,JSF会生成HTML。顺便提一下,这里有一个类似的问题:您可以直接在outputText@Cosmin瓦卡罗尤-是的。但h:panelGroup更好,因为它允许我在其中放置任意数量的组件,并一次控制它们的呈现。是的,但我认为它会在html中呈现一个额外的div,这可能会破坏您的样式。谢谢!但是类名有问题——它拒绝同意,它就是那个类。有趣的是,我之前输出了类a行的名称,对其进行了三次检查,但是#{msg.class.name=='org.rogach.tsnt.CreationMessage'}仍然返回false.eq?而不是==尝试输出#{msg.class.name}以查看它到底是什么。等等,这很有趣#{msg.class.name=='org.rogach.tsnt.CreationMessage'}单独打印true,但不打印。也许混合jstl-jsf是个问题。看,是的,看起来像那样。文章说“并且可能包含JSF组件自定义操作,但只有为嵌套的JSF组件操作设置了id属性时才可以”。